如何从docker-compose.yml更改PHP:7.1-apache中的文档根目录

23
我正在尝试为Laravel设置环境,在此过程中,我想将我的文档根目录更改为public文件夹。我已经在Dockerfile中实现了这个功能,但实际上我更希望在docker-compose.yml文件中实现。
我觉得我已经按照他们的文档实现了所需的环境命令。
我的代码如下:

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上有一个不同的文档根目录吗?

提前感谢您。

3个回答

50

我找到了解决此问题的方法。基本上,当我创建一个包含构建命令的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/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

只需记得在运行镜像之前运行docker-compose build(如果其他人遇到相同的问题)。


这是解决方案,php文档没有指定APACHE_DOCUMENT_ROOT = 容器内的目录。 - Ivandez

4

为了测试临时解决方案,您可以手动更改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

1
谢谢,我需要重新启动Apache。 - Base Desire

-1

您正在“环境”部分运行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文件,然后让我知道是否解决了你的问题。


1
我现在尝试了一下,但是出现了以下错误:**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"但这并没有帮助。我错过了什么吗? - kjc
这对我没用。我已经尝试使用CircleCI 2.0了,但没有成功。 - Kevin Goedecke
是的,我最终决定从头开始创建一个图像。只是让这个程序再开一会儿。 - kjc
命令执行后,卷可能会挂载? - Rvanlaak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接