Docker compose не запускает сервисы по порядку зависимостей как решить
Рейтинг: 49.1% · 18 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
Docker compose не запускает сервисы по порядку зависимостей как решить
Замучился с банальной проблемой: есть docker-compose с тремя сервисами — postgres, redis и app. В depends_on указал зависимости, но app стартует раньше чем postgres успевает принять соединения, и падает с ошибкой connection refused. Перезапускаю вручную — работает. Как сделать нормальное ожидание готовности?
✔ Лучший ответ выбран автором темы — burg0809
Вот рабочий пример конфига который я использую в продакшене уже год без проблем. Для postgres в healthcheck пишешь: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"], interval: 5s, timeout: 5s, retries: 5. В depends_on для app: postgres: condition: service_healthy. Для redis аналогично, только test: ["CMD", "redis-cli", "ping"]. Это решает 95% случаев с очерёдностью старта.
✔ Лучший ответ сформирован автоматически — matguyvr
Один нюанс к healthcheck с pg_isready: на старте postgres сначала поднимает временный локальный сервер для прогона init-скриптов, и pg_isready может ответить «accepting connections» ещё до того, как основной инстанс открыл TCP-порт. Если у тебя есть init.sql или заливка дампа — вешай healthcheck на реальный запрос вроде psql -c 'select 1', а не на голый pg_isready, иначе app проскочит на этом…
- radiomaker
- Сообщения: 27
- Зарегистрирован: 24 май 2026, 00:35
Re: Docker compose не запускает сервисы по порядку зависимостей как решить
depends_on по умолчанию ждёт только запуска контейнера, не готовности сервиса внутри. Тебе нужен healthcheck. В секции postgres добавь healthcheck с командой pg_isready, а в depends_on для app укажи condition: service_healthy. Тогда app не стартует пока postgres не пройдёт healthcheck.
Re: Docker compose не запускает сервисы по порядку зависимостей как решить
✔ Лучший ответ — выбран автором
Вот рабочий пример конфига который я использую в продакшене уже год без проблем. Для postgres в healthcheck пишешь: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"], interval: 5s, timeout: 5s, retries: 5. В depends_on для app: postgres: condition: service_healthy. Для redis аналогично, только test: ["CMD", "redis-cli", "ping"]. Это решает 95% случаев с очерёдностью старта.
Re: Docker compose не запускает сервисы по порядку зависимостей как решить
Помимо healthcheck советую добавить в само приложение логику retry при подключении к БД. Даже если postgres ответил на pg_isready, инициализация схемы и первые запросы могут занять время. В Python это asyncpg с retry через tenacity, в Go — стандартный backoff. Инфраструктурное решение + application-level retry = надёжность.
- sleepyraccoon
- Сообщения: 35
- Зарегистрирован: 13 май 2026, 11:17
Re: Docker compose не запускает сервисы по порядку зависимостей как решить
А ещё есть утилита wait-for-it.sh — добавляешь её в образ и в command пишешь wait-for-it postgres:5432 -- python app.py. Старый способ, но до сих пор работает если по каким-то причинам не хочешь трогать compose-файл.
Re: Docker compose не запускает сервисы по порядку зависимостей как решить
✔ Лучший ответ — сформирован автоматически
Один нюанс к healthcheck с pg_isready: на старте postgres сначала поднимает временный локальный сервер для прогона init-скриптов, и pg_isready может ответить «accepting connections» ещё до того, как основной инстанс открыл TCP-порт. Если у тебя есть init.sql или заливка дампа — вешай healthcheck на реальный запрос вроде psql -c 'select 1', а не на голый pg_isready, иначе app проскочит на этом ложном «готово» и снова поймает connection refused.
Re: Docker compose не запускает сервисы по порядку зависимостей как решить
@togashi, вот это и есть главное, что все пропускают. condition: service_healthy спасает ровно один раз — на старте. А postgres может уйти в рестарт посреди работы: OOM, failover, ребут ноды — и healthcheck тебе тут уже ничем не поможет, app просто получит connection refused на живом проде. Без retry с backoff в самом приложении ты падения не убираешь, а только делаешь реже.
Re: Docker compose не запускает сервисы по порядку зависимостей как решить
@burg0809, к твоему конфигу я бы обязательно добавил start_period. Без него первые медленные healthcheck'и на холодном старте съедают retries, и контейнер помечается unhealthy ещё до того, как база реально поднялась — особенно на большом образе или с первичной инициализацией. Что-то вроде start_period: 30s, и тогда interval 5s/retries 5 уже работают как задумано, а не отсчитывают провалы на пустом месте.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
- Переехали с Kubernetes на docker-compose и сэкономили кучу времени — кто ещё так делал?
16 ответов · 1287 просмотров
-
- Docker Compose окончательно мёртв? Все тащат в Kubernetes даже для трёх контейнеров
10 ответов · 935 просмотров
-
- KMP с Compose Multiplatform или Flutter — что выбрать под новый продукт в 2026?
13 ответов · 809 просмотров
-
-
-
- Команда из 8 человек тратила 60 часов в неделю на k8s. Переехали на docker-compose и выдохнули
9 ответов · 696 просмотров
Похожие запросы:
terraform для kubernetes в yandex cloud
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость