Gymterview
middle

Что такое health check в Docker?

Health check — это механизм Docker, позволяющий определять, работает ли приложение внутри контейнера корректно. По результатам проверки контейнер получает один из статусов: healthy, unhealthy или starting.

Определение в Dockerfile

Пример
HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=60s \
  CMD wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1

Параметры

Параметр Описание По умолчанию
--interval Как часто выполнять проверку 30 с
--timeout Максимальное время ожидания ответа 30 с
--retries Сколько неудачных проверок подряд для статуса unhealthy 3
--start-period Начальный период, в течение которого неудачные проверки не учитываются 0 с

Определение в docker-compose.yml

Пример
services:
  app:
    build: .
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider",
             "http://localhost:8080/actuator/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s

Использование с depends_on (Compose V2)

Пример
services:
  app:
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U admin -d mydb"]
      interval: 10s
      timeout: 5s
      retries: 5

Spring Boot Actuator

Для Spring Boot рекомендуется использовать Spring Boot Actuator (/actuator/health):

Пример
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Пример
# application.yml
management:
  endpoints:
    web:
      exposure:
        include: health
  endpoint:
    health:
      show-details: never

В Alpine-образах curl отсутствует по умолчанию, поэтому используйте wget (он есть в Alpine).

На собеседовании: health check нужен для двух целей: (1) Docker/оркестратор знает, жив ли контейнер, (2) depends_on с condition: service_healthy позволяет ждать реальной готовности сервиса, а не просто запуска контейнера. Для Spring Boot — используйте Actuator endpoint. Не забудьте про start_period — без него health check будет считать контейнер unhealthy во время запуска приложения.