Docker-compose-wait - элегантное решение проблемы зависимостей между контейнерами
Проблема, которую все знают
Представьте: вы запускаете 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 выделяется:
- Поддержкой нескольких типов зависимостей (не только TCP)
- Возможностью работы без shell
- Лучшей интеграцией с современными практиками Docker
docker-compose-wait — это тот редкий случай, когда простое решение закрывает реальную боль разработчиков. Если вы еще не используете подобные инструменты в своих контейнерах, самое время попробовать — это займет буквально 5 минут, а сэкономит часы отладки.
Для начала просто добавьте утилиту в свой Dockerfile и укажите зависимости через переменные окружения. Ваши контейнеры скажут вам спасибо!
