来自build:创建的图像的Docker容器正在工作但不能从拉出的图像中工作

时间:2017-02-05 17:40:55

标签: php apache docker containers docker-compose

  1. 我用apache为我的应用程序构建了一个图像,从它创建的容器工作得很好。我能够在localhost上看到该页面。 (文件#1:docker-compose.yml)
  2. 我将图像推送到docker hub
  3. 我使用另一个容器(文件#2:docker-compose-prod.yml)为同一个应用程序重新创建一个容器,它立即退出而没有任何错误,容器输出为:

    已启用模块重写 httpd(pid 1)已经在运行

  4. 以下是我用于构建的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
    

2 个答案:

答案 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