我创建了这个泊坞窗图片:
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之前运行?
答案 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'
}
)