Ожидание базы в Docker
Ожидание базы пускает приложение
только после того,
как сервер ответил
на проверку,
а не сразу после старта
процесса.
Простой порядок старта
готовности не ждёт,
а условие здоровья ждёт.
Тогда Node поднимается,
когда ping уже проходит
внутри db.
Сервис db
на mysql:9.7
с базой app
и пользователем app
получает проверку
с паузой 5 секунд:
services:
db:
image: mysql:9.7
environment:
MYSQL_ROOT_PASSWORD: demo
MYSQL_DATABASE: app
MYSQL_USER: app
MYSQL_PASSWORD: demo
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
web:
build: .
ports:
- "3000:3000"
depends_on:
db:
condition: service_healthy
Команда внутри проверки
спрашивает локальный сервер
через mysqladmin ping
с флагом -h localhost.
Сервис web
собирается из того же
скрипта с mysql2,
что и в уроке
про запрос:
база app,
таблица notes,
ответ hello
на порту 3000.
Пока статус db
не здоров,
web
не считается запущенным
по правилу зависимости.
Пересборка, подъём
и таблица notes:
docker compose up -d --build
docker compose exec db mysql -uapp -pdemo app -e "CREATE TABLE IF NOT EXISTS notes (id INT PRIMARY KEY AUTO_INCREMENT, body VARCHAR(255)); INSERT INTO notes (body) VALUES ('hello');"
В списке сервисов
web
появляется после
успешной проверки db.
Страница localhost:3000
отдаёт hello
без повторных обновлений
из-за неготовой базы.
Добавьте проверку готовности сервису db с паузой 5 секунд и свяжите сервис gate с условием здоровья db.
Поднимите проект в фоне и отметьте в списке сервисов, что gate стартует после успешной проверки db.