Profile picture for Admin

В прошлой статье я рассмотрел запуск и управление несколькими контейнерами (сайтами) с помощью одного докер файла. Следующая задача - отдельные переменные для разных сайтов в 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 файл и передавать ему допольнительные команды после инициализации переменных. Но в другой раз.

Add new comment

The content of this field is kept private and will not be shown publicly.
  • No HTML tags allowed.
  a88888b.   888888ba   d8888b.  d8888888P  d88888P 
d8' `88 88 `8b `88 .d8' d8'
88 a88aaaa8P' .aaadP' .d8' d8'
88 88 `8b. 88' .d8' d8'
Y8. .88 88 88 88. d8' d8'
Y88888P' dP dP Y88888P Y8888888P d8'

Enter the code depicted in ASCII art style.