
Healthchecks в Docker Compose для Laravel: как сделать так, чтобы сервисы запускались в правильном порядке
Prog-Time 11 минут назад Healthchecks в Docker Compose для Laravel: как сделать так, чтобы сервисы запускались в правильном порядке 3 мин 274 PHP * Laravel * DevOps * Серверная оптимизация * Качество кода * Туториал...
Вот важная новость с фронта ИИ: Prog-Time 11 минут назад Healthchecks в Docker Compose для Laravel: как сделать так, чтобы сервисы запускались в правильном порядке 3 мин 274 PHP * Laravel * DevOps * Серверная оптимизация * Качество кода * Туториал Recovery Mode Если вы хоть раз поднимали Laravel-проект в Docker Compose, наверняка сталкивались с ситуацией: контейнер с приложением стартует раньше, чем база данных успевает принять соединения, и миграции падают с ошибкой SQLSTATE или Connection refused. Перезапустишь — всё работает. На локалке терпимо, но в продакшене — это в падающие деплои.
По умолчанию Docker считает контейнер «живым», если его процесс запущен. Но это не всегда означает, что сервис внутри готов к работе. Решение — правильно настроенные healthcheck’и и условие depends_on с параметром condition: service_healthy.
Технические детали
В этой статье разберём, как это сделать для типичного стека Laravel: PHP-FPM, PostgreSQL, Redis и Nginx. Почему depends_on без healthcheck не работаетМногие думают, что depends_on: заставит контейнер с приложением ждать, пока база данных будет готова. На самом деле Docker Compose ждёт только запуска контейнера — то есть момента, когда процесс внутри стартовал.
Между «процесс запустился» и «база готова принимать запросы» может пройти 5–15 секунд, особенно при первой инициализации. Чтобы Compose действительно ждал готовности сервиса, нужно:Определить healthcheck у зависимого сервиса (БД, Redis и т. В сервисе-потребителе указать depends_on в расширенной форме с condition: service_healthy.
Healthcheck для PostgreSQLВ официальный образ Postgres встроена утилита pg_isready — она и есть самая надёжная проверка готовности:services: db: image: postgres:16-alpine environment: POSTGRES_DB: app POSTGRES_USER: app POSTGRES_PASSWORD: secret volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: interval: 5s timeout: 3s retries: 10 start_period: 10sВажный момент — параметр start_period. Он задаёт «грейс-период»: в течение этого времени неуспешные проверки не считаются провалами. Для Postgres это критично, потому что при первом запуске инициализируется PGDATA, и pg_isready временно отвечает «not accepting connections».
Отраслевые последствия
Healthcheck для Redisredis: image: redis:7-alpine healthcheck: test: interval: 5s timeout: 3s retries: 5 start_period: 5sКоманда redis-cli ping возвращает PONG, когда сервер готов. Если у вас включена авторизация, добавьте -a $REDIS_PASSWORD или используйте переменную окружения REDISCLI_AUTH, чтобы пароль не светился в docker ps. Healthcheck для PHP-FPMС PHP-FPM сложнее: в стандартный образ php:8.
3-fpm-alpine не входит ни curl, ни wget. Самый универсальный способ — использовать встроенный в PHP-FPM статус-пинг. Включаем его в конфиге пула: app: build: context: .
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




