繁体   English   中英

如何在不终止docker容器的情况下重新启动apache2?

[英]How to restart apache2 without terminating docker container?

我使用带有标签的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?

在将更改放入 dockerfile 之前,我想使用容器并对其进行自定义。 我想安装一些扩展并让它们工作,我需要重新启动 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

如果您使用apache作为主要服务来保留正在运行的容器,则无法重新启动它。 只是因为你构建了图像并用它设置了CMD。

CMD的主要目的是为执行容器提供默认值。 这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定ENTRYPOINT指令。

尝试重新加载而不重新启动服务:

/etc/init.d/apache2 reload

我的解决方案是将我的bash shell退出到容器中,然后重新启动Docker之外的容器。 因为Apache被设置为主要服务,所以这也会重新启动Apache,并且不会使容器崩溃。

docker restart <container>

sudo docker kill --signal="USR1" your_appache_container

您可以使用其他信号来实现以下目标:

立即停止信号: TERM

优雅的重启信号: USR1

立即重启信号: HUP

优雅的停止信号: 绞盘

来自: 这个网站

我想自定义容器,我需要安装一些扩展并让它们工作我需要重新启动apache才能使更改生效。

这违反了Docker的不可变基础架构原则。 恕我直言,你正在使用类似于一个完整的VM的docker容器。 相反,我建议你将docker镜像视为最终的工件并将其版本化。 注意:这只是我的拙见,你可能有一个我不知道的有效用例,我很想知道。

但在开始之前,你的apache在重启时是否会失败? 多数民众赞成如何退出? 在这种情况下,请通过设置正确的配置并查看这些日志来使其运行。

您可以尝试的一种方法是登录容器(对bash),并且您可以始终在其工作的位置提交docker 然后,您可以将基本容器图像更改为该图像。

我通过在我的Dockefile中使用不同的ENTRYPOINT来构建来自这些已提交的图像的新图像,从而解决了类似情况。

在 docker 中,我使用这样的命令:

exec /usr/sbin/httpd -D FOREGROUND

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM