рУССКИЙ
ИДИ НАХУЙ
docker_logo.png

В прошлой статье я рассмотрел запуск и управление несколькими контейнерами (сайтами) с помощью одного докер файла. Следующая задача - отдельные переменные для разных сайтов в env файле. Для примера, в прошлой статье в docker-compose файл передавалсь переменная окружения PROJECT_NAME. Было бы хорошо, если бы для каждого сайта переменные хранились в отдельных файлах.

Например. У нас есть два сайта website1 и website2. Есть общий файл .env и кастомный .Website1.env и .Website2.env.

Рассмотрим .Website1.env файл

PROJECT_NAME=Website1
PROJECT_WEB=website1
PROJECT_PHP=php56
PROJECT_DRUPAL=drupal7

PROJECT_NAME – будет использоваться для имени контейнеров и для линковки разделов. В данном примере файлы сайта Website1 лежат в одноименной папке.
PROJECT_WEB – используется для имени сайта в урле для траефика.
PROJECT_PHP – возможность использовать разные версии PHP для сайтов.
PROJECT_DRUPAL – данная переменная позволит выбирать нужный docker-compose файл для сайта.

Управление сайтами осуществляется с папки docker-center. В которой лежат все конфиги. Таким образом мы сможем хранить конфиги в одной директории и в отдельном репозитории соответсвенно.

Рассмотрим команду из файла Makefile для запуска контейнеров для Website1.

 

#!make

include .env

DOCKER_DIR = $(shell pwd)

network:
    ${DOCKER_DIR}/network.sh

up-traefik:
    docker-compose --project-name rt-traefik --file ${DOCKER_DIR}/docker-compose.traefik.yml up -d --build


up-%: up-traefik
    @bash -c ' \
        set -o allexport; \
        source .${$(*)}.env; \
        set +o allexport; \
        docker-compose --project-name ${$(*)} --file ${DOCKER_DIR}/docker-compose.$${PROJECT_DRUPAL}.yml up -d --build; \
    '

 

обьявляем новую переменную для хранения текущей папки DOCKER_DIR.

Команда up-% - это запуск с параметром.

Загрузка переменных из файла осуществляется командой set в bash. Для этого мы оборачиваем всю команду под bash. @ перед bash означает запуск команды без вывода на экран.

Параметр который мы передали через символ % хранится в $(*). Но, в начале makefile мы грузим наш обычный .env, где определены алиасы для сайтов

website1=Website1
w1=${website1}

таким образом, запуская команду up-website1 мы получаем из ${$(*)} - Website1.

Тоже самое и up-w1! Алиас создан для удобства.

И теперь наша команда source .${$(*)}.env; после разыменования будет выглядеть как source .Website1.env;

И все переменные будут загружены из нее.

 

В строке

docker-compose --project-name ${$(*)} --file ${DOCKER_DIR}/docker-compose.$${PROJECT_DRUPAL}.yml up -d --build; \

мы достаем переменную PROJECT_DRUPAL из файла .Website1.env с помощью $${PROJECT_DRUPAL}

 

Все загруженные переменные из .Website1.env будут доступны в docker-compose файле. И мы сможем делать что-то типа

build:
   context: images-drupal7/${PROJECT_PHP}

Где для каждой версии php могут быть свои настройки и тд.

Так же данный подход пригодиться для оверрайта конфигов через файлы settings.local.php где для разных версий друпала он будет свой.

 

Теперь запускаем все

$ ./network.sh
$ make up-w1 up-w2

Смотрим в админку траефика http://127.0.0.1:8080/dashboard/#/http/routers

traefik-makefile-multi_env.png

Заходим по урлам

http://website1.my-docker.localhost/

http://website2.my-docker.localhost/

И видим что сайты отлично работают.

website1-makefile-multi_env.png
website2-makefile-multi_env.png

Для остановки пишем

$ make stop-w1 stop-w2

Таким образом можно в мгновение запускать нужный сайт одной командой со всеми нужными конфигами.

 

Исходники по ссылке: https://github.com/onesixromcom/docker_makefile_env_load

В данной версии был убран контейнер с базой для ускорения запуска. У вас он конечно будет.

 

PS: согласен, такая копипаста команд баша режет глаз. Но пока не было времени разобраться. Как вариант, можно закинуть это в sh файл и передавать ему допольнительные команды после инициализации переменных. Но в другой раз.

Добавить комментарий

Содержимое данного поля является приватным и не предназначено для показа.
  • HTML-теги не обрабатываются и показываются как обычный текст
     .ooo    oooo                                            oooooooooo.   
.88' `888 `888' `Y8b
d88' 888 oooo .ooooo. .ooooo. oooo ooo 888 888
d888P"Ybo. 888 .8P' d88' `"Y8 d88' `88b `88. .8' 888 888
Y88[ ]88 888888. 888 888ooo888 `88..8' 888 888
`Y88 88P 888 `88b. 888 .o8 888 .o `888' 888 d88'
`88bod8' o888o o888o `Y8bod8P' `Y8bod8P' `8' o888bood8P'


Введите код, изображенный в стиле ASCII-арт.
рУССКИЙ
ИДИ НАХУЙ