Как поднимается Clinic: docker compose, Makefile, порядок запуска, healthcheck
↑ 7.6 DevOps для бэкенд-разработчика · ← Предыдущая · → Следующая
Зачем это на собесе
Умение поднять многосервисное окружение одной командой и объяснить порядок запуска.
Примечание
Пример обобщён (сервисы
api,worker,postgres,kafka).
Объяснение
Docker Compose описывает набор сервисов в одном файле, Makefile даёт короткие команды для команды.
services:
postgres:
image: postgres:16
environment: { POSTGRES_PASSWORD_FILE: /run/secrets/pg_pass }
volumes: [pgdata:/var/lib/postgresql/data]
healthcheck: { test: ["CMD-SHELL", "pg_isready -U postgres"], interval: 5s, retries: 10 }
migrate:
image: registry.example.com/orders-migrations:${TAG}
depends_on: { postgres: { condition: service_healthy } }
api:
image: registry.example.com/orders-api:${TAG}
env_file: [.env]
depends_on:
migrate: { condition: service_completed_successfully }
kafka: { condition: service_healthy }
ports: ["8080:8080"]
healthcheck: { test: ["CMD", "wget", "-qO-", "http://localhost:8080/health/ready"], interval: 10s }
restart: unless-stopped
volumes: { pgdata: {} }up: ; docker compose up -d
down: ; docker compose down
logs: ; docker compose logs -f --tail=200 api
migrate: ; docker compose run --rm migrate
reset-db: ; docker compose down -v && docker compose up -d postgres migrateПорядок запуска: инфраструктура (БД, брокер, хранилище) → миграции (одноразовая задача) → сервисы → шлюз/фронтенд.
depends_on с condition: service_healthy ждёт готовности, а не просто запуска контейнера; при этом приложение всё равно должно уметь переподключаться к зависимостям.
Нюансы и подводные камни
- Только
depends_onбез healthcheck не гарантирует готовность БД. - Данные в volumes переживают
down, но неdown -v. latest-теги и «плавающие» образы делают окружение невоспроизводимым.- Compose подходит для dev/staging и небольших продов; для масштабирования — Kubernetes.
- Порядок запуска ≠ надёжность: сервисы должны переживать перезапуск зависимостей.
Практика
- Соберите compose-окружение: БД, брокер, API с миграциями и health checks.
- Добавьте
make up/down/logs/reset-db. - Остановите БД и проверьте, что API восстанавливается сам.
Вопросы с ответами
Гарантирует ли depends_on готовность зависимости?
Только с
condition: service_healthyи настроенным healthcheck.
Зачем отдельный сервис миграций?
Схема применяется один раз до запуска приложения, независимо от числа реплик.