Я пытаюсь настроить основной файл для создания докеров, который содержит такие вещи, как база данных, аутентификация Firebase, эмулятор pubsub и т. д. Этот основной файл находится в родительском каталоге, и в каждой подпапке есть файлы для создания докеров. Я следую архитектуре микросервисов, но мне не нужен один большой компоновочный файл, поскольку количество микросервисов превышает 50, и в конечном итоге он использует много ресурсов. Итак, мне удалось создать файлы в той же сети докеров, но проблема, с которой я столкнулся сейчас, заключается в том, что я не могу использовать имя службы в файле docker-compose родительской папки внутри файла docker-compose дочерней папки.
Вот пример службы docker-compose в родительской папке:
postgres_db:
image: postgres:latest
restart: always
environment:
- POSTGRES_PASSWORD=postgrespw
ports:
- "5432:5432"
volumes:
- postgres:/var/lib/postgresql/data
А вот пример службы docker-compose в дочерней папке:
service_1:
build:
context: ../../
dockerfile: ./services/service_1/Dockerfile.dev
target: development
restart: always
environment:
- DATABASE_URL=postgresql+psycopg2://postgres:postgrespw@postgres_db:5432/localdb
- PORT=8080
ports:
- "8080:8080"
volumes:
- ../../lib/:/app/lib
- ../../services/service_1/:/app
depends_on:
- postgres_db
Это вызывает следующую ошибку:
служба "service_1" зависит от неопределенной службы postgres_db: недопустимо составить проект
Мне нужно иметь возможность использовать имя службы родительского файла docker-compose внутри дочернего файла docker-compose.
depends_on
цель состоит в том, чтобы обрабатывать зависимости контейнеров в одном файле компоновки и отображать контейнеры в порядке, основанном на их зависимостях.
Вы не можете использовать их между файлами компоновки.
Вам нужно обработать это в потоке вашего приложения или написать сценарий точки входа для ваших контейнеров, который проверяет доступность вспомогательных служб, от которых зависит ваше приложение, перед запуском вашего приложения.
Вы не можете ссылаться на информацию из другого файла компоновки. «depend_on» должен быть сервисом, на который есть ссылка в том же файле.
Если вы пытаетесь запускать подразделы своего стека в компоновке, вы можете попробовать функцию «профилей» в docker compose. Файл компоновки по-прежнему будет большим, но вам не придется запускать все определенные службы одновременно.
Спасибо, профили выглядят полезными, и я посмотрю на них. Это, вероятно, распространенный сценарий, так что знаете ли вы, каковы лучшие практики в этом отношении? Являются ли профили обычным способом?
@AsadAmirKhwaja Я не думаю, что существует множество лучших практик для профилей. Это довольно просто, вы просто группируете любые сервисы, которые хотите запускать вместе с профилем. Я не могу сказать, насколько это распространено по сравнению с несколькими файлами компоновки или пользовательскими сценариями bash, которые запускают контейнеры, но я думаю, что это лучшее решение для вашего случая, чем любой из них.
вы должны иметь возможность ссылаться на контейнеры по имени, если они находятся в одной сети, но
depends_on
основан на файле компоновки, а не на запущенных контейнерах. Таким образом, вам придется удалитьdepends_on
и, если это проблема, обойти ее — в любом случае рекомендуется, чтобы ваше приложение «поднималось» и проходило проверки работоспособности, даже если службы, от которых оно зависит, не работают, иначе вы можете создавать цепочки отказов или даже циклические зависимости.