Docker: запуск команды после init на контейнере centos7 с помощью systemd - PullRequest
0 голосов
/ 29 апреля 2018

Согласно 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

1 Ответ

0 голосов
/ 04 мая 2018

Вам нужна только функция systemd-init, если вы запускаете службы. В противном случае вы можете просто запустить сценарий оболочки и поместить daemon и daemon2 в фоновый режим.

В случае, если вы действительно «запустите systemctl», вы можете избежать запуска cgroup-mapping и systemd-init ... просто используйте скрипт docker-systemctl-replace . Он также работает как PID 1, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...