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

时间:2018-04-29 18:34:07

标签: docker centos7

根据https://hub.docker.com/_/centos/ 必须使用init进程运行Centos7容器才能正确地使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没有1的PID

1 个答案:

答案 0 :(得分:0)

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

如果您确实“systemctl启动”某些内容,那么您可以避免cgroup-mapping和systemd-init启动...只需使用docker-systemctl-replacement脚本。如果你愿意,它也可以作为PID 1运行。