为什么apache2不会在docker映像上重新启动时删除pid文件

我已经创build了这个docker的形象:

FROM debian:jessie RUN apt-get update && apt-get install -y apache2 python-pip libapache2-mod-wsgi l RUN pip install django CMD ["/usr/sbin/apache2ctl","-DFOREGROUND"] 

当我运行一个容器时,我正在调用--restart=always参数。
所以如果我重启电脑主机,容器会自动重启。 但是,有一个问题:apache2 pid文件没有被删除,所以apache2无法重新启动。 我必须手动删除PID文件,一切都很好。

我有两个问题:

  • 为什么这个PID文件不会在物理计算机上产生任何问题? 是否有可能告诉Apache在启动时擦除这个PID文件?

  • 是否有可能在docker文件中放置“ pre-CMD ”命令? 一种将在apache2ctl之前运行的CMD

是否有可能在docker文件中放置“pre-CMD”命令?

正如在docker-library/php issue 53中提到的:

我做了清理旧的PID存在于我的启动项。

请参阅PR 59及其新的apache2-foreground启动脚本示例:

 #!/bin/bash set -e # Apache gets grumpy about PID files pre-existing rm -f /var/run/apache2/apache2.pid exec apache2 -DFOREGROUND 

Dockerfile安装该脚本:

 COPY apache2-foreground /usr/local/bin/ 

为什么这个PID文件不会在物理计算机上产生任何问题?

上述问题包括这个评论:

我已经碰到过几次了,尤其是当我通过运行sudo stop docker(直接或重启)来停止容器的时候。 我只是查看了Ubuntu / Debian下的init脚本和关机是如何工作的,而且看起来好像所有东西都试图closures得太快,并且所有容器都被closures了。

如果你有一个容器缓慢的停下来,你可以很容易地遇到你的容器不能干净地停下来的情况。 在大多数情况下,我一般都很幸运能够删除容器并从头开始重新创build容器,但如果您所做的只是尝试进行正常的重新启动,那么这可能是难以忍受的。

然后:

是否有可能告诉Apache在启动时擦除这个PID文件?

md5补充说:

我也看了一下httpd的源代码,发现没有什么好办法让Apache自己处理这种情况(参见https://github.com/apache/httpd/blob/2.4.x/server/mpm_unix.c# L768 )是否有可能告诉Apache在启动时擦除这个PID文件?

我偶然发现了这个问题

[Mon Jun 12 18:23:30.447512 2017] [core:warn] [pid 1] AH00111:configurationvariables$ {APACHE_PID_FILE}未定义

解决scheme就是像这样获取Apache环境variables

source /etc/apache2/envvars

所以,我的脚本看起来像

 #!/bin/bash set -e # Source Apache envvars source /etc/apache2/envvars # Apache gets grumpy about PID files pre-existing rm -f /var/run/apache2/apache2.pid exec apache2 -DFOREGROUND