Микро сервисы с Docker Compose: один и тот же контейнер, несколько проектов - PullRequest
0 голосов
/ 18 сентября 2018

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

Резюме: У меня есть X проекты микросервисов (давайте назовем их project A, project B и project C. Каждый микро сервис зависит от одних и тех же контейнеров (давайте назовем эти dependency D и dependency E.

Проблема: В идеале, проекты A, B и C будут ALL иметь обе зависимости (D & E) в своих файлах docker-compose.yml; однако это становится проблемой, так как docker compose видит их как дубликаты контейнеров, когда в действительности я хотел бы использовать их повторно. Вот сообщение об ошибке, которое обычно видно:

ОШИБКА: для A Невозможно создать контейнер для службы A: b'Conflict. имя контейнера "/ A" уже используется контейнером "sha". Ты должен удалите (или переименуйте) этот контейнер, чтобы иметь возможность повторно использовать это имя. '

Из того, что я видел, люди рекомендуют вам определить контейнер в одном проекте и ссылаться на него , используя networks и внешние ссылки. Хотя это работает, оно вводит зависимость от другого yml-файла docker-compose (файла, который определяет зависимость!).

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

Были ли другие люди в мире без репо (особенно с микросервисами) успешнее с другим подходом?


Меня попросили уточнить некоторые примеры:

Вот как выглядят 2 разных составных файла yml для project A и project B:

Проект A:

version: '2'
services:
  dependencyD:
    image: dependencyD:latest
    container_name: dependencyD

  dependencyE:
    image: dependencyE:latest
    container_name: dependencyE

  projectA:
    image: projectA:latest
    container_name: projectA
    depends_on:
      - dependencyD
      - dependencyE

Проект B:

version: '2'
services:
  dependencyD:
    image: dependencyD:latest
    container_name: dependencyD

  dependencyE:
    image: dependencyE:latest
    container_name: dependencyE

  projectB:
    image: projectB:latest
    container_name: projectB
    depends_on:
      - dependencyD
      - dependencyE

1 Ответ

0 голосов
/ 18 сентября 2018

Существует функция под названием внешние ссылки . Из документов:

Ссылка на контейнеры, запущенная вне этого docker-compose.yml или даже вне Compose, особенно для контейнеров, предоставляющих общие или общие службы.

Наличие нескольких docker-compose.yml файлов также распространено для организации контейнеров в значимые группы. Возможно, ваш сценарий может использовать несколько файлов YAML и внешние ссылки 1011 *.

...