我使用另一个容器(文件#2:docker-compose-prod.yml)为同一个应用程序重新创建一个容器,它立即退出而没有任何错误,容器输出为:
已启用模块重写 httpd(pid 1)已经在运行
以下是我用于构建的docker-compose.yml文件#1中描述的应用服务:
app:
build: .
links:
- db
- memcache:memcached
- search
ports:
#- 8080:80 # when varnish enabled
- 80:80
restart: always
environment:
DB_HOST: db:3306
DB_PASSWORD: *****
SEARCH_HOST: search:9312
MEMCACHE_HOST: memcache:11211
这是docker-compose-prod.yml,我用于部署的文件#2包含问题:
app:
image: vendor/app
#restart: always
links:
- db
- memcache:memcached
- search
ports:
#- 8080:80 # when varnish enabled
- 80:80
environment:
DB_HOST: db:3306
DB_PASSWORD: *****
SEARCH_HOST: search:9312
MEMCACHE_HOST: memcache:11211
#networks:
#- proxy
#- backend
下一个服务的容器始终启动并运行:
- db
- memcache:memcached
- search
一些细节:
我从app目录中运行docker-compose.yml(文件#1):
/home/user/app1$ docker-compose up -d
和另一个目录中的第二个文件
/home/user/app2$ docker-compose -f docker-compose-prod.yml up -d
这是Dockerfile:
FROM ubuntu:trusty
MAINTAINER vendor
# Install base packages
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get -yq install \
curl \
apache2 \
libapache2-mod-php5 \
php5-mysql \
php5-mcrypt \
php5-gd \
php5-curl \
php-pear \
php5-memcache \
php-apc && \
rm -rf /var/lib/apt/lists/*
#ENV ALLOW_OVERRIDE **False**
RUN /usr/sbin/php5enmod mcrypt
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf && \
sed -i "s/variables_order.*/variables_order = \"EGPCS\"/g" /etc/php5/apache2/php.ini
# Add image configuration and scripts
ADD run.sh /run.sh
RUN chmod 755 /*.sh
# Configure /app folder with sample app
RUN mkdir -p /app && rm -fr /var/www/html && ln -s /app /var/www/html
WORKDIR /app
ADD . /app
RUN chmod 0777 -R /var/www/html/app/tmp
RUN ln -sf /dev/stderr /var/www/html/app/tmp/logs/error.log
RUN ln -sf /dev/stdout /var/www/html/app/tmp/logs/debug.log
RUN chown www-data:www-data /app -R
# should not be run inside container
#RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
#RUN /usr/local/bin/composer install
#RUN php vendor/bin/phinx migrate
EXPOSE 80
CMD ["/run.sh"]
并且运行.sh
#!/bin/bash
if [ "$ALLOW_OVERRIDE" = "**False**" ]; then
unset ALLOW_OVERRIDE
else
sed -i "s/AllowOverride None/AllowOverride All/g" /etc/apache2/apache2.conf
a2enmod rewrite
fi
source /etc/apache2/envvars
exec apache2 -D FOREGROUND
答案 0 :(得分:0)
这是因为真的
模块重写已启用
为什么会这样?
创建容器时rewrite_module
已禁用。 run.sh
启用它。
稍后,您停止(但不删除)容器,然后再次运行它。但是run.sh
每次启动容器时都会运行。并且run.sh
正在尝试再次加载此模块,并且您收到错误。
您可以忽略该错误,也可以修改run.sh
之类的内容:
#!/bin/bash
if [ "$ALLOW_OVERRIDE" = "**False**" ]; then
unset ALLOW_OVERRIDE
else
sed -i "s/AllowOverride None/AllowOverride All/g" /etc/apache2/apache2.conf
if [! httpd -M | grep rewrite_module]; then
a2enmod rewrite;
fi;
fi
source /etc/apache2/envvars
apache2 -D FOREGROUND
我希望我帮助过你。
答案 1 :(得分:0)
最后我有了它的工作!
#Apache对预先存在的PID文件感到脾气暴躁
我在行后添加了run.sh:
rm -f /var/run/apache2/apache2.pid
参见https://github.com/docker-library/php/issues/187
和https://github.com/docker-library/php/blob/bdfd0fc1d19102cd6f951614072a51eabf7191bf/5.6/apache/apache2-foreground