【问题标题】:How to change the document root in PHP:7.1-apache from docker-compose.yml如何从 docker-compose.yml 更改 PHP:7.1-apache 中的文档根目录
【发布时间】:2018-12-25 20:53:47
【问题描述】:

我正在尝试为 Laravel 设置环境,在此过程中,我想将我的文档根目录更改为公共文件夹。我在 Dockerfile 中完成了这项工作,但实际上我更希望它在 docker-compose.yml 文件中。

感觉我已经从他们的documentation实现了所需的环境命令

我的代码看起来像

docker-compose.yml:

version: '3'

services:
    laravel:
        image: php:7.1-apache
        ports:
            - 8080:80
        env_file: ./.env
        environment:
            - "APACHE_DOCUMENT_ROOT=/var/www/html/public"
            - "sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf"
            - "sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf"
        volumes:
            - ./src/:/var/www/html/

.env

APACHE_DOCUMENT_ROOT=/var/www/html/public

我第一次尝试不使用 .env 文件,但它给了我一个错误,指出未设置 APACHE_DOCUMENT_ROOT 变量。这就是我有外部 .env 文件的原因。

谁能引导我改进这个 yml,让我的 Apache 有一个不同的文档根目录?

提前谢谢你。

【问题讨论】:

    标签: apache docker docker-compose environment-variables


    【解决方案1】:

    我找到了解决此问题的方法。基本上,当我使用构建命令创建 Dockerfile 时,它​​就起作用了。所以下面的结构解决了这个问题:

    docker-compose.yml

    version: '3'
    services:
        web:
            build: .
            ports:
                - 80:80
            volumes:
                - ./src:/var/www/html
    

    Dockerfile

    FROM php:7.1-apache
    
    ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
    RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
    RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
    

    请记住在运行映像之前运行 docker-compose build(如果其他人有同样的问题)。

    【讨论】:

    • 这是解决方案,php doc没有指定APACHE_DOCUMENT_ROOT = DIRS INSIDE CONTAINER
    【解决方案2】:

    为了测试临时解决方案,您可以手动更改 apache .conf 文件。 当你的容器运行时,输入 bash:

    docker exec -it your_container_name bash
    

    编辑 .conf 文件的内容:

    vim /etc/apache2/sites-available/000-default.conf
    

    (如果找不到vim,运行apt-get updateapt-get install vim

    最后重新加载apache:

    /etc/init.d/apache2 reload
    

    【讨论】:

    • 谢谢,我需要重启appache。
    【解决方案3】:

    您正在“环境部分”中运行 sed 命令。相反,您可以使用“命令”部分来执行您的 sed 命令。这些命令将在 Docker 的入口点之后运行。因此,您更新后的 docker-compose.yaml 将如下所示:

     version: '3'
    
    services:
        laravel:
            image: php:7.1-apache
            ports:
                - 8080:80
    
            command:
                - export APACHE_DOCUMENT_ROOT=/path/to/new/root
                - sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
                - sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
    
            volumes:
                - ./src/:/var/www/html/
    

    请更新您的 docker-compose.yaml 文件,如果它解决了您的问题,请告诉我

    【讨论】:

    • 我现在已经尝试过了,但是出现了以下错误:laravel_1 | /usr/local/bin/docker-php-entrypoint: 9: exec: APACHE_DOCUMENT_ROOT=/var/www/html/public: not found laravel_laravel_1 exited with code 127 我试着添加一个命令说:- “mkdir -p /var/www/html/public” 这没有帮助。我错过了什么吗?
    • 这对我不起作用。我试过使用 CircleCI 2.0,没有运气。
    • 是的,我现在最终从头开始创建图像。只是保持这个开放的时间长一点。
    • 该卷可能在命令执行后挂载?
    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2018-10-23
    相关资源
    最近更新 更多