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

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

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 файл і передавати йому додаткові команди після ініціалізації змінних. Але в інший раз.