Compose вміє зливати кілька файлів: базова конфігурація + доповнення для конкретного оточення.
Автоматичне злиття: якщо поруч з compose.yaml є compose.override.yaml, docker compose up бере обидва - перевизначення застосовується поверх бази.
# compose.yaml - спільне для всіх оточень
services:
app:
image: myapp:${TAG:-latest}
environment:
APP_ENV: production
# compose.override.yaml - лише для локальної розробки (часто в .gitignore)
services:
app:
build: .
environment:
APP_ENV: local
APP_DEBUG: "true"
volumes:
- .:/var/www/html
ports:
- "127.0.0.1:8000:8000"
mailpit:
image: axllent/mailpit
Явний набір файлів - прапорець -f (файл override тоді не підхоплюється автоматично):
docker compose -f compose.yaml -f compose.prod.yaml up -d
docker compose -f compose.yaml -f compose.ci.yaml run --rm app php artisan test
Або через змінну COMPOSE_FILE=compose.yaml:compose.ci.yaml.
Правила злиття:
- одиночні значення (
image,command,restart) - заміняються значенням з пізнішого файлу; - словники (
environment,labels) - зливаються за ключами; - списки
ports,volumes- об'єднуються (з урахуванням однакових цілей), а не заміняються; !resetі!override- теги YAML, щоб явно скинути чи повністю замінити значення з базового файлу (наприклад, прибрати порти, оголошені в базі).
services:
app:
ports: !reset []
Відносні шляхи в усіх файлах обчислюються від першого файлу (базової директорії проєкту) - типова пастка при -f інша-папка/compose.yaml.
Перевірити результат злиття:
docker compose -f compose.yaml -f compose.prod.yaml config
Типові схеми:
compose.yaml(база) +compose.override.yaml(розробка, автоматично) +compose.prod.yaml(явно на сервері);- окремі файли для CI (без томів з кодом, з тестовою базою в пам'яті).
Альтернатива злиттю - include (підключення окремих частин) і профілі (сервіси, що вмикаються за потреби).