Согласно 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'd в контейнер, я вижу процесс
root 1 0 0 18:20 ? 00:00:00 /usr/sbin/init /usr/local/bin/startup.sh
Несмотря на приведенную выше строку, показывающую startup.sh вместе с init, сам скрипт starup.sh никогда не выполнялся, поскольку предполагается, что скрипт запускает пару демонов, и я не вижу, чтобы они запускались после «запуска docker».
Когда я запускаю сценарий вручную (не как часть строки CMD, а фактически выполняю его внутри оболочки контейнера), я вижу, что демоны запускают
Как я могу автоматизировать запуск.sh для вызова? Я не могу просто заменить строку CMD только на startup.sh, потому что тогда systemd прервется (мне нужно, чтобы скрипт вызывался после запуска init)
Я пытался поместить / usr / sbin / init в автозагрузку .sh
то есть startup.sh
daemon &
daemon2 &
exec /usr/sbin/init
но демоны не могут быть запущены, потому что init не работал
если поставить
/usr/sbin/init &
daemon &
daemon2
это не сработает, потому что init не имеет PID 1