На сервере запущено несколько сайтов. Автодеплой через гитлаб настроен следующим образом:
1. После билда образ загружается на сервер
2. В папку проекта (в которой есть файл .env, монтируемые папки и т.п.) загружается docker-compose.yml примерно такого вида (удалил то, что не относится к теме):
version: '3.2'
services:
web:
image: project-name
environment:
- DB_HOST=${DB_HOST:-db}
- DB_DATABASE=${DB_DATABASE:-project-name}
- DB_USER=${DB_USER:-project-name}
- DB_PASSWORD=${DB_PASSWORD:-password}
db:
image: mariadb:10.3.8
deploy:
resources:
limits:
memory: ${LIMIT_DB_MEM:-80M}
environment:
- MYSQL_RANDOM_ROOT_PASSWORD=yes
- MYSQL_DATABASE=${DB_DATABASE:-project-name}
- MYSQL_USER=${DB_USER:-project-name}
- MYSQL_PASSWORD=${DB_PASSWORD:-password}
3. Чтобы переменные окружения из .env загрузились:
docker-compose config > docker-stack.yml
4. И:
docker stack deploy -c docker-stack.yml project-name
Кластера как такового у меня нет, сервер один и docker stack используется исключительно для deploy-resources-limits, без которых мой маленький vps иногда захлёбывается.
Тем не менее для каждого из трёх проектов в итоге запущено три отдельных инстанса БД, каждой из которых на проде я в состоянии выделить в районе 100-150 МБ, что очень неприятно.
Поэтому хочется запустить одну БД (лучше тоже в докере) и все сайты подключить к ней, а их базы, прописанные в docker-compose.yml, при этом не запускать.
Но для разработчиков всё должно остаться, как было:
docker-compose up --build
и всё само поднимается, никакой возни с БД, сетью и т.п.
Мой вопрос: можно ли текущую конфигурацию переработать так, чтобы при определённых переменных в .env (например, при DB_HOST не равном db), сервис db не запускался? И как в таком случае сервисам web дать доступ к внешней базе данных силами docker-compose файла и переменных окружения (в докеровских networks я очень слаб)?