我安装了docker镜像并成功构建了镜像。
当我 ssh 到容器并运行命令时service xxx start
,弹出错误:
服务 nginfra 启动
重定向到 /bin/systemctl start nginfra.service /sbin/service:
第 79 行:/bin/systemctl:没有这样的文件或目录
实际上,fakesystemd
安装在容器中而不是systemd
.
所以我删除了fakesystemd
并安装了systemd
使用命令:
yum swap -- 删除 fakesystemd -- 安装 systemd systemd-libs
但我仍然无法启动服务:
服务 nginfra 启动
重定向到/bin/systemctl启动nginfra.service获取失败
D-Bus 连接:没有与服务管理器的连接。
有人遇到过并解决过这个问题吗?
我已经成功在 CentOS:7 Docker 容器中解决了这个问题。
我主要关注的是CentOS Docker 镜像项目指南.
FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
# Install anything. The service you want to start must be a SystemD service.
CMD ["/usr/sbin/init"]
现在,构建图像,并至少使用以下参数运行它docker run
命令:-v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro
那么重点是/usr/sbin/init
必须是 Docker 容器内的第一个进程。
因此,如果您想使用自定义脚本在运行之前执行一些命令/usr/sbin/init
,在脚本末尾使用启动它exec /usr/sbin/init
(在 bash 脚本中)。
这是一个例子:
ADD cmd.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/cmd.sh
CMD ["/usr/local/bin/cmd.sh"]
这是内容cmd.sh
:
#!/bin/bash
# Do some stuffs
exec /usr/sbin/init # To correctly start D-Bus thanks to https://forums.docker.com/t/any-simple-and-safe-way-to-start-services-on-centos7-systemd/5695/8
你可以有System is booting up. See pam_nologin(8)
如果您使用 PAM 系统,在这种情况下,删除/usr/lib/tmpfiles.d/systemd-nologin.conf
在你的Dockerfile
因为它创建了文件/var/run/nologin
这会产生这个特定的错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)