Куда мне скопировать директиву VirtualHost в моем Apache docker образе? - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь Dockerize мой проект Apache / Django локально. На моем локальном компьютере (под управлением Ma c Sierra) этот файл (maps.conf) находится в моем каталоге / etc / apache2 / other / ...

<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 file ...

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

Где я должен скопировать указанную выше директиву VirtualHost, чтобы мое изображение Apache docker правильно подключалось?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

TL; DR

Это на /usr/local/apache2/conf/extra/httpd-vhosts.conf, но вам нужно будет сделать больше, чем просто скопировать ваше, потому что a) Apache не будет знать об этом; и б) ваши пути macOS не будут работать.

Длинная версия

Документы Docker для официального Apache изображения показывают, как извлечь основной Apache config:

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

Так что теперь мы можем увидеть как включить конфигурацию vhost и куда его поместить.

Сначала раскомментируйте строку Include в вашей локальной копии my-httpd.conf, чтобы конфигурация vhosts действительно была включена. Мы скопируем эту отредактированную версию в контейнер, перезаписав оригинал, чтобы она использовалась во время выполнения.

Теперь нам нужно обновить существующий файл конфигурации vhosts (maps.conf), чтобы он подходил для использования. в контейнере. MacOS-специфицированные c пути, которые вы в данный момент используете в этом файле, не будут существовать внутри контейнера, поэтому файл не будет работать как есть.

Вы можете увидеть основной Do c root в основном my-httpd.conf файле:

DocumentRoot "/usr/local/apache2/htdocs"

Для простоты давайте поместим ваш контент в эту основную Do croot, скажем, в директорию с именем maps/. Скопируйте ваш maps.conf в новый файл (скажем, my-vhosts.conf в том же каталоге, что и my-httpd.conf), обновив ваши пути macOS /Library/WebServer/Documents/maps, указав путь к контейнеру /usr/local/apache2/htdocs/maps. Я не могу скопировать ваше приложение / конфиг, но для демонстрации я использовал это супер простое my-vhosts.conf:

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

Затем соединил все это в Dockerfile. Он должен скопировать в 2 новых файла конфигурации, а также ваш фактический контент. Обратите внимание, что вы не можете использовать абсолютный путь к файлу source в команде COPY, поэтому вам нужно сначала переместить или скопировать локальное содержимое 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

Теперь просто соберите его и запустите. Снова используя команды, показанные в Docker документах для Apache:

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 запустить его.

0 голосов
/ 08 февраля 2020

Короткий ответ на ваш вопрос: отправленный вами VirtualHost directive не будет работать внутри контейнера docker, так как он ссылается на каталоги вашего локального компьютера: /Library/WebServer/Documents/maps/maps/static и /Library/WebServer/Documents/maps/maps_project

Вам понадобится создать собственную директиву VirtualHost, которая ссылается на путь внутри вашего docker контейнера, но не на вашем локальном компьютере.

...