为什么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