Docker-compose-wait - элегантное решение проблемы зависимостей между контейнерами

31 авг 2025
1,707
142
15
5 месяцев

Build Status codecov

Проблема, которую все знают

Представьте: вы запускаете docker-compose с несколькими сервисами — допустим, ваше приложение зависит от PostgreSQL, Redis и MongoDB. В идеальном мире все контейнеры стартуют мгновенно и согласованно. В реальности же ваш основной сервис может начать работу раньше, чем будут готовы его зависимости, что приводит к ошибкам соединения и хаосу в логах.

Именно эту проблему решает docker-compose-wait — маленький, но мощный инструмент для управления порядком запуска контейнеров.

Что это за инструмент?

docker-compose-wait — это легковесная утилита на Rust, которая:

  • Позволяет дождаться готовности зависимых сервисов
  • Поддерживает несколько стратегий ожидания
  • Работает не только с docker-compose, но и с Kubernetes и другими оркестраторами
  • Имеет минимальные требования к ресурсам

Ключевые возможности

1. Ожидание доступности портов

Основной сценарий — дождаться, когда нужные TCP-порты станут доступны. Просто укажите переменную окружения:

Реклама
WAIT_HOSTS: postgres:5432, redis:6379, mongo:27017

2. Ожидание файлов

Иногда нужно дождаться появления файла или директории:

WAIT_PATHS: /var/lib/mysql/data, /tmp/ready.flag

3. Гибкая настройка таймаутов

Полный контроль над временем ожидания:

WAIT_TIMEOUT=60  # Максимальное время ожидания (сек)
WAIT_SLEEP_INTERVAL=5  # Пауза между проверками
WAIT_BEFORE=10  # Задержка перед началом проверок

Как это работает технически

Утилита написана на Rust, что обеспечивает:

  • Минимальный размер исполняемого файла (всего 2.5MB)
  • Отсутствие зависимостей (статическая сборка с MUSL)
  • Поддержку различных архитектур (x86_64, ARM, aarch64)

Практическое применение

Стандартный сценарий в Dockerfile

FROM alpine

# Добавляем утилиту ожидания
COPY --from=ghcr.io/ufoscout/docker-compose-wait:latest /wait /wait

# Ваше приложение
COPY app /app

# Запуск с ожиданием зависимостей
CMD /wait && /app

Использование в окружениях без shell

Для минималистичных образов (например, scratch или distroless):

FROM scratch

COPY --from=ghcr.io/ufoscout/docker-compose-wait:latest /wait /wait
COPY app /app

ENV WAIT_COMMAND="/app arg1 arg2"
ENTRYPOINT ["/wait"]

Почему стоит попробовать

  • Простота: Добавляется в контейнер парой строк
  • Надежность: 1700+ звезд на GitHub и активное сообщество
  • Гибкость: Поддержка различных стратегий ожидания
  • Производительность: Минимальные накладные расходы

Особенно полезно для:

  • Разработчиков микросервисных архитектур
  • DevOps-инженеров, настраивающих сложные контейнерные среды
  • Всех, кто устал от проблем с порядком запуска контейнеров

Альтернативы и сравнение

Хотя существуют другие решения (например, wait-for-it или собственные скрипты), docker-compose-wait выделяется:

  1. Поддержкой нескольких типов зависимостей (не только TCP)
  2. Возможностью работы без shell
  3. Лучшей интеграцией с современными практиками Docker

docker-compose-wait — это тот редкий случай, когда простое решение закрывает реальную боль разработчиков. Если вы еще не используете подобные инструменты в своих контейнерах, самое время попробовать — это займет буквально 5 минут, а сэкономит часы отладки.

Для начала просто добавьте утилиту в свой Dockerfile и укажите зависимости через переменные окружения. Ваши контейнеры скажут вам спасибо!

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.