https://docs.docker.com/compose/compose-file/#depends_on прямо говорит:
Есть несколько вещей, о которых следует помнить при использованииависимый_он:
- disabled_on не ждет, пока db и redis будут «готовы» перед запуском web - только до их запуска. Если вам нужно дождаться готовности услуги,
и рекомендует вам реализовать логику для ожидания раскрутки mongodb и быть готовым принимать соединения самостоятельно: https://docs.docker.com/compose/startup-order/
В вашем случае это может быть что-то вроде:
CMD wait-for-db.sh && mix phx.server
, где wait-for-db.sh
может быть простым
#!/bin/bash
until nc -z localhost 27017; do echo "waiting for db"; sleep 1; done
, для которого вам необходимо установить nc
и wait-for-db.sh
в контейнере.
Существует множество других альтернативных инструментов для проверки, прослушивает ли контейнер db целевой порт.
UPDATE:
Сетевое соединение между контейнерами описано в https://docs.docker.com/compose/networking/:
Когда вы запускаете docker-compose, происходит следующее:
- Создается сеть с именем
myapp_default
, где myapp
- это имя каталога, в котором хранится docker-compose.yml
.
- Контейнер создается с использованием конфигурации Phoenix. Присоединяется к сети
myapp_default
под именем phoenix
.
- Контейнер создается с использованием конфигурации базы данных. Присоединяется к сети
myapp_default
под именем db
.
Теперь каждый контейнер может искать имя хоста phoenix
или db
и возвращать IP-адрес соответствующего контейнера. Например, код приложения Phoenix может подключиться к URL mongodb://db:27017
и начать использовать базу данных Mongodb.