Позвольте мне представить, что у меня есть 3 составных файла (только фокус на сервисе MySQL)
докер-compose.yml
докер-compose.staging.yml
докер-compose.prod.yml
В моем докере compose.yml у меня есть основные вещи для mysql с целью сборки dev als
version: "3.4"
services:
mysql:
build:
target: dev
...
И начните с
docker-compose up -d
В моей промежуточной среде я хотел бы предоставить порт 3306, но также хотел бы иметь другую цель сборки, поэтому я бы создал docker-compose.staging.yml со следующим содержимым.
version: "3.4"
services:
mysql:
build
target: prod
ports:
- 3306:3306
И объединить его с
docker-compose -f docker-compose.yml -f docker-compose.staging.yml up -d
Таким образом, цель сборки перезаписывается, и порт 3306 теперь доступен снаружи.
Теперь я хочу то же самое в docker-compose.prod.yml, просто не открывая порт 3306 снаружи ... Как я могу переопределить директиву ports, чтобы порты не были открыты?
Я попытался положить пустой массив в prod.yml без успеха (порт по-прежнему открыт):
version: "3.4"
services:
mysql:
ports: []
В конце я бы хотел сложить команду up следующим образом:
docker-compose -f docker-compose.yml -f docker-compose.staging.yml -f docker-compose.prod.yml up -d
Я также знаю, что в документах написано
Для портов с несколькими значениями параметров, expose, external_links, dns, dns_search и tmpfs, Compose объединяет оба набора значений
Но как мне достичь цели без дублирования конфигурации?
Да, конечно, я мог бы опустить docker-compose.staging.yml, но в staging.yml определены этапы сборки, которые также должны использоваться на этапе prod, чтобы не было никаких различий между встроенным контейнером.
Так что дублирование вещей на самом деле не вариант.
Спасибо