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

时间:2016-10-01 05:49:31

标签: docker apache2 dockerfile

我创建了这个泊坞窗图片:

 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文件?

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

2 个答案:

答案 0 :(得分:2)

  

是否可以在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(直接或重启时)让容器停止运行时。我只是看看init脚本和关闭如何在Ubuntu / Debian下运行,看起来所有东西都只是试图关闭太快而且所有容器都被串联关闭。

     

如果你有一个缓慢停止的容器(ahem,memcached ......),那么你很容易遇到容器没有干净地停止的情况。在大多数情况下,我一般都很幸运能够删除容器并从头开始重新创建它,但如果您所做的只是尝试重新启动,那么这可能是一个难以吞咽的药丸。

然后:

  

是否有可能告诉apache在启动时删除此pid文件?

md5补充道:

  

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

答案 1 :(得分:0)

我偶然发现了这个问题

  

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

解决方案是使用像

这样的Apache环境变量

#!/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

所以,我的脚本看起来像

export const Root = StackNavigator({
  LoginScreen: {screen: Login},
  Tabs: {screen: Tabs}
},
  {
  initialRouteName: 'LoginScreen'
  }
)