Как перезапустить apache2 без сбоя контейнера Docker?
Я использую в качестве базы php Docker контейнер с тегом:
php:5.6-apache
Когда я пытаюсь перезапустить apache2 внутри контейнера, контейнер останавливается:
root@phalconapp:/var/www/html# service apache2 restart
Restarting web server: apache2Terminated
root@phaclonapp:/var/www/html#
me@myLocalComputer:
Как перезапустить apache2, не останавливая контейнер?
Я хочу поэкспериментировать с контейнером и настроить его, прежде чем я внесу свои изменения в файл Docker. Я хочу установить какое-то расширение и чтобы они работали, мне нужно перезапустить apache, чтобы изменения вступили в силу.
Это файл журнала через:
Attaching to dltasklight_phlaconapp_1
phlaconapp_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
phlaconapp_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
phlaconapp_1 | [Mon May 30 10:19:24.556154 2016] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.22 configured -- resuming normal operations
phlaconapp_1 | [Mon May 30 10:19:24.556181 2016] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
phlaconapp_1 | [Mon May 30 10:21:11.754993 2016] [mpm_prefork:notice] [pid 1] AH00169: caught SIGTERM, shutting down
dltasklight_phlaconapp_1 exited with code 0
6 ответов
Если вы используете apache в качестве основного сервиса для сохранения работающего контейнера, вы НЕ можете перезагрузить его. Просто потому, что вы создали изображение и установили CMD с ним.
Основная цель CMD - предоставить значения по умолчанию для исполняемого контейнера. Эти значения по умолчанию могут включать исполняемый файл или могут не включать исполняемый файл, и в этом случае вы также должны указать инструкцию ENTRYPOINT.
Попробуйте перезагрузить без перезапуска службы:
/etc/init.d/apache2 reload
Моим решением было выйти из оболочки bash в контейнер и просто перезапустить контейнер за пределами Docker. Поскольку Apache установлен в качестве основной службы, это также перезапускает Apache и не приводит к сбою контейнера.
docker restart <container>
sudo docker kill --signal="USR1" your_appache_container
Другие сигналы, которые вы можете использовать для достижения следующего:
Сигнал остановки сейчас: СРОК
Изящный сигнал перезапуска: USR1
Перезагрузите сейчас Сигнал: HUP
Изящный Стоп Сигнал: Лебедка
От: этот сайт
Я хочу настроить контейнер, мне нужно установить какое-то расширение и чтобы они работали, мне нужно перезапустить apache, чтобы изменения вступили в силу.
Это противоречит принципу неизменной инфраструктуры Докера. ИМХО, вы используете докер-контейнер, похожий на полноценную ВМ. Вместо этого я бы посоветовал вам рассматривать образ докера как конечный артефакт и модифицировать его.Примечание: это просто мое скромное мнение, у вас может быть действительный сценарий использования, о котором я не знаю, и который мне любопытно узнать.
Внутри докера я использую такую команду:
exec /usr/sbin/httpd -D FOREGROUND
Но перед тем как у вас не работает Apache при перезагрузке? Вот как это выходит? В этом случае, пожалуйста, сделайте так, чтобы он запускался, устанавливая правильные конфигурации и просматривая эти журналы.
Один из способов, который вы можете попробовать, - это войти в контейнер (для bash), и вы всегда можете сделать докер коммитом в точке, где он работает. Затем вы можете изменить изображение базового контейнера на это.
Я имел обходные пути для подобных ситуаций, создавая новые изображения из этих зафиксированных, используя разные ENTRYPOINT в моем Dockefile.