Как переопределить docker-compose значения в нескольких объединенных файлах? - PullRequest
0 голосов
/ 09 мая 2018

Позвольте мне представить, что у меня есть 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, чтобы не было никаких различий между встроенным контейнером. Так что дублирование вещей на самом деле не вариант.

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Я бы настоятельно рекомендовал просто не использовать команду target в ваших файлах композиции. Я считаю чрезвычайно полезным создать единый образ для локального / промежуточного / производственного процесса - собрать один раз, протестировать его и развернуть в каждой среде. В этом случае вы меняете вещи, используя переменные окружения или смонтированные секретные файлы / файлы конфигурации.

Кроме того, использование compose для создания изображений ... хрупко. Я бы порекомендовал создавать изображения в системе CI, помещать их в реестр, а затем использовать теги версий изображений в вашем файле компоновки - это гораздо более воспроизводимая система.

0 голосов
/ 09 мая 2018

Возможно, вы захотите использовать ключ extends в ваших композиционных файлах, например так:

mysql:
  extends:
    file: docker-compose.yml
    service: mysql
  ports:
    - 3306:3306
  # other definitions 

Несмотря на то, что вам придется изменить свою композиционную версию с 3.4 на <<code>3 (например, 2.3), потому что v3 не поддерживает эту функцию ref , поскольку существует запрос на открытую функцию висит долго.

Важное замечание здесь заключается в том, что вы не должны предоставлять никаких портов в базовом файле docker-compose.yml, только на определенных композициях.

Официальные документы для расширений

редактировать

Предложение

target не поддерживается в v2.0, поэтому я настроил ответ так, чтобы он соответствовал требованиям extends и target. Это составляет v2.3.

редактировать из комментариев

Поскольку требуется ключевое слово deploy, то требуется compose v3. А пока что нет возможности расширять композиции. Я прочитал в каком-то официальном документе (не могу найти его сейчас для ссылки), что они побуждают нас использовать плоские композиции, специфичные для среды , так что это всегда понятно. Также Docker заявляет, что это трудно реализовать в v3 (см. Выше), и в ближайшее время он не будет реализован. Вы должны использовать отдельные файлы компоновки для каждой среды.

...