在我的 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-compose
和 docker-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
到运行就可以了。
我正在尝试在本地对我的 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-compose
和 docker-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
到运行就可以了。