在我的 Apache docker 映像中的什么地方复制我的 VirtualHost 指令?

Where do I copy my VirtualHost directive in my Apache docker image?

我正在尝试在本地对我的 Apache/Django 项目进行 Dockerize。在我的本地机器 (运行 Mac Sierra) 我的 /etc/apache2/other/ 目录中有这个文件 (maps.conf) ...

<VirtualHost *:80>
    ServerName maps.example.com

    Alias /static /Library/WebServer/Documents/maps/maps/static
    <Directory /Library/WebServer/Documents/maps/maps/static>
        Require all granted
    </Directory>

    # Next, add the following directory block
    <Directory /Library/WebServer/Documents/maps/maps_project>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    WSGIDaemonProcess maps python-home=/Library/WebServer/Documents/maps/venv python-path=/Library/WebServer/Documents/maps
    WSGIProcessGroup maps
    WSGIScriptAlias / /Library/WebServer/Documents/maps/maps_project/wsgi.py

</VirtualHost>

我找到了这个 Apache docker 文件 ...

FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/

我应该在哪里复制上面的 VirtualHost 指令,以便我的 Apache docker 映像正确连接?

对您的问题的简短回答是:您发布的 VirtualHost directive 将无法在 docker 容器内运行,因为它引用了您的本地计算机目录:/Library/WebServer/Documents/maps/maps/static/Library/WebServer/Documents/maps/maps_project

您将需要创建一个自定义 VirtualHost 指令,该指令引用 docker 容器中的路径,但不引用本地计算机中的路径。

TL;DR

它位于 /usr/local/apache2/conf/extra/httpd-vhosts.conf,但您需要做的不仅仅是将您的复制到那里,因为 a) Apache 不会知道它;和 b) 您的 macOS 路径将不起作用。

长版

The Docker docs for the official Apache image 显示如何提取主 Apache 配置:

docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > my-httpd.conf

现在您在容器外的本地有一个 my-httpd.conf。打开它看看 - 它只是一个标准的 Apache 配置,在底部你会看到通常的:

# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

现在我们可以了解如何包含虚拟主机配置以及将其放置在何处。

首先,在 my-httpd.conf 的本地副本中取消注释 Include 行,这样 vhosts 配置实际上就会包含在内。我们会将编辑后的版本复制到容器中,覆盖原始版本,以便在 运行 时使用。

现在我们需要更新您现有的虚拟主机配置文件 (maps.conf),以便它适合在容器中使用。您当前在该文件中使用的特定于 macOS 的路径将不存在于容器中,因此该文件将无法按原样运行。

您可以在主 my-httpd.conf 文件中看到主 Docroot:

DocumentRoot "/usr/local/apache2/htdocs"

为简单起见,让我们将您的内容放在那个主 Docroot 下,比如在一个名为 maps/ 的目录中。将你的 maps.conf 复制到一个新文件(比如 my-vhosts.conf 在与 my-httpd.conf 相同的目录中),用容器路径 /usr/local/apache2/htdocs/maps 更新你的 macOS /Library/WebServer/Documents/maps 路径。我无法复制你的 app/config,但为了演示,我使用了这个超级简单的 my-vhosts.conf:

<VirtualHost *:80>
    DocumentRoot "/usr/local/apache2/htdocs/maps"
</VirtualHost>

接下来将它们全部放在 Docker 文件中。它需要复制 2 个新的配置文件,以及您的实际内容。请注意,您不能在 COPY 命令中使用 source 文件的绝对路径,因此您需要移动或复制本地 maps/内容先进入当前目录。

FROM httpd:2.4
COPY ./my-httpd.conf /usr/local/apache2/conf/httpd.conf
COPY ./my-vhosts.conf /usr/local/apache2/conf/extra/httpd-vhosts.conf
COPY ./maps /usr/local/apache2/htdocs/maps

现在就构建它并 运行 它。再次使用 Apache Docker 文档中显示的命令:

docker build -t my-apache2 .
docker run -dit --name my-running-app -p 8080:80 my-apache2

最后,为了完整起见,对于您可能不想在处理应用程序或调整配置文件时继续重新创建和 运行 图像的本地开发,您可以映射这些东西作为卷放入容器中,而不是仅在构建时将它们复制一次。这样您就可以工作并在容器中实时查看您的更改。

最简单的方法是使用 docker-composedocker-compose.yml:

version: '3'

services:
    apache:
        image: httpd:2.4 
        container_name: apache
        ports: 
            - "8080:80"
        volumes:
            - ./my-httpd.conf:/usr/local/apache2/conf/httpd.conf
            - ./my-vhosts.conf:/usr/local/apache2/conf/extra/httpd-vhosts.conf
            - ./maps:/usr/local/apache2/htdocs/maps

然后docker-compose up到运行就可以了。