Docker:使用 systemd 在 centos7 容器上初始化后运行命令



根据 https://hub.docker.com/_/centos/Centos7 容器必须以 init 进程运行才能使 systemd 正常工作

Dockerfile

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/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

我希望能够在调用"docker run"时自动运行脚本,所以我将 CMD 行更改为

COPY startup.sh /usr/local/bin/startup.sh
CMD ["/usr/sbin/init", "/usr/local/bin/startup.sh"]

当我 docker exec 进入容器时,我看到了该过程

root         1     0  0 18:20 ?        00:00:00 /usr/sbin/init /usr/local/bin/startup.sh

尽管上面的行显示了 startup.sh 和 init 一起,但脚本本身 starup.sh 从未执行过,因为脚本应该启动几个守护进程,而且我没有看到它们在"docker run"之后运行。
当我手动运行脚本时(不是作为 CMD 行的一部分,而是在容器 shell 中实际执行它(,我会看到守护进程正在运行

如何自动调用 startup.sh?我不能简单地只替换 CMD 行 startup.sh 因为这样 systemd 会中断(我需要在 init 运行后调用脚本(

我试图将/usr/sbin/init 放入 startup.sh

即 startup.sh

daemon &
daemon2 &
exec /usr/sbin/init

但是守护进程无法运行,因为 init 没有运行

如果你把

/usr/sbin/init &
daemon &
daemon2 

这不起作用,因为 init 的 PID 不为 1

如果你运行服务,你只需要一个systemd-init的东西。否则,您可以运行一个 shell 脚本并将 daemon 和 daemon2 放在后台。

如果你真的会"systemctl start"某些东西,那么你可以避免 cgroup 映射和 systemd-init start ...只需使用 docker-systemctl 替换脚本即可。如果您愿意,它也可以作为 PID 1 运行。

最新更新