Наряду с некоторыми другими у меня возникают проблемы с использованием архитектуры приложений микро-сервисов и использованием 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