В прошлой статье я рассмотрел запуск и управление несколькими контейнерами (сайтами) с помощью одного докер файла. Следующая задача - отдельные переменные для разных сайтов в 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
Заходим по урлам
http://website1.my-docker.localhost/
http://website2.my-docker.localhost/
И видим что сайты отлично работают.
Для остановки пишем
$ make stop-w1 stop-w2
Таким образом можно в мгновение запускать нужный сайт одной командой со всеми нужными конфигами.
Исходники по ссылке: https://github.com/onesixromcom/docker_makefile_env_load
В данной версии был убран контейнер с базой для ускорения запуска. У вас он конечно будет.
PS: согласен, такая копипаста команд баша режет глаз. Но пока не было времени разобраться. Как вариант, можно закинуть это в sh файл и передавать ему допольнительные команды после инициализации переменных. Но в другой раз.
Добавить комментарий