【问题标题】:How to restart apache2 without terminating docker container?如何在不终止 docker 容器的情况下重新启动 apache2?
【发布时间】:2016-09-28 03:30:32
【问题描述】:

我使用带有标签的php docker container 作为基础:

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

【问题讨论】:

    标签: php apache docker docker-compose


    【解决方案1】:

    如果您使用 apache 作为主要服务来保持正在运行的容器,则不能重新启动它。仅仅因为您构建了图像并使用它设置了 CMD。

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

    尝试在不重启服务的情况下重新加载:

    /etc/init.d/apache2 reload
    

    【讨论】:

    • 这是我在开发开发堆栈时最终所做的。感谢您写出来并+1。我不接受这个解决方案,因为最终不需要运行重新加载,就好像在 apache 启动之前安装了扩展一样,不需要重新启动它。
    • 接受了这个答案,因为其他传入的答案超出了重点。重新启动不是必需的,重新加载配置是,这帮助我构建了一个正确的 Dockerfile。
    • 好。我不记得有另一个仅作为 apache 配置重新启动的命令。这个命令对这个问题非常有用:}
    • 你好@MagnoC,你的 Dockerfile 基础镜像是什么?
    【解决方案2】:

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

    docker restart <container>
    

    【讨论】:

    • 这个命令会重启容器,但在其他情况下真的很有用:)
    【解决方案3】:

    sudo docker kill --signal="USR1" your_appache_container

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

    立即停止信号:TERM

    优雅重启信号:USR1

    立即重启信号:HUP

    优雅的停止信号:WINCH

    发件人: this website

    【讨论】:

    • 这对我不起作用,我认为您需要在答案中提供更多信息。我收到以下错误,来自守护程序的错误响应:无法杀死容器 –signal=USR1:没有这样的容器:–signal=USR1。我确保按 ID 和名称输入正确的容器,两者都是相同的错误。
    • 请用两个破折号替换“信号”之前的字符(它可能会被stackoverflow的输入字段自动更正)。
    • 我遇到了一个问题,由于某种原因发送一次信号是不够的,需要发送两次stackoverflow.com/questions/55262485/…
    【解决方案4】:

    我想自定义容器,我需要安装一些扩展 为了让他们工作,我需要重新启动 apache 才能进行更改 效果。

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

    【讨论】:

    • 这是在尝试在 docker 容器内设置开发堆栈而不运行 docker build 时。最后,我最终得到了一个 dockerfile,我只是想尝试一下。请参阅我对 Cauê Alves 答案的评论。
    【解决方案5】:

    但是在去之前,你的 apache 在重启时会失败吗?就这样退出?在这种情况下,请务必通过设置正确的配置并查看这些日志来使其运行。

    您可以尝试的一种方法是登录到容器(到 bash),并且您总是可以在它工作的地方有一个 docker commit。然后,您可以将基本容器映像更改为该映像。

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

    【讨论】:

      【解决方案6】:

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

      exec /usr/sbin/httpd -D FOREGROUND
      

      【讨论】:

      • 在什么 linux 发行版和版本中?
      猜你喜欢
      • 2017-04-25
      • 2016-09-16
      • 1970-01-01
      • 2018-08-19
      • 2012-12-26
      • 1970-01-01
      • 2018-01-10
      • 2020-10-19
      • 1970-01-01
      相关资源
      最近更新 更多