docker-compose.yml
должен содержать только определения канонических услуг.
Все, что относится к среде сборки (например, dev vs prod), должно быть объявлено в отдельном файле docker-compose.override.yml
.Каждая среда сборки может иметь свою собственную версию этого файла.
Объявление build: web
не относится к docker-compose.yml
, так как предполагается, что оно выполняется только локально (и, возможно, на сервере сборки), а не вproduction.
Таким образом, в приведенном выше примере это будет выглядеть так: docker-compose.yml
:
version: '3'
services:
db:
image: "postgres"
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=mysecretpassword
web:
depends_on: [ db ]
ports:
- "80:80"
И это будет значение по умолчанию docker-compose.override.yml
для локальной разработки:
version: '3'
services:
web:
build: web
Запуск docker-compose up --build -d
теперь создает последние изменения кода и запускает наше приложение локально.
Также может быть другая версия docker-compose.override.build.yml
, предназначенная для сервера сборки / CI:
version: '3'
services:
web:
build: web
image: mydockeruser/web
Запуск docker-compose -f docker-compose.yml -f docker-compose.override.build.yml push
создаст последние изменения кода и отправит образ в его реестр / хранилище.
Наконец, может быть другая версия docker-compose.override.prod.yml
:
version: '3'
services:
web:
image: mydockeruser/web
Развертывание в рабочей среде (только на одном хосте Docker, а не в кластере) теперь может быть таким же простым, как копирование только docker-compose.yml
и docker-compose.override.prod.yml
и запуск docker-compose -f docker-compose.yml -f docker-compose.override.prod.yml up -d
.