Как перезапустить 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.

Другие вопросы по тегам