MySql in docker - common issues
Problém:
Než se načte kontejner s databází, tak už aplikace chce vykonat nějaký dotaz do DB. Typicky se to týká třeba migrací při vytváření úplně nové instance projektu. Jelikož databáze neodpoví, tak se kontejner s aplikací killne.
Řešení?
Jednoduché řešení je přidat HealthCheck na pingnutí DB a v kontejneru aplikace přidat závislost (depends_on) jestli je kontejner s databází healthy.
Příklad
HealthCheck
Přidává se do db service
healthcheck:
test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
timeout: 5s
interval: 5s
retries: 10
Závislost
Přidává se do aplikační service
depends_on:
db:
condition: service_healthy
Výsledek
Výsledný “ořezaný” docker-compose:
version: "3.8"
services:
db:
image: "mysql:8"
=> healthcheck:
test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
timeout: 5s
interval: 5s
retries: 10
command: [ "mysqld", "--character-set-server=utf8", "--collation-server=utf8_general_ci" ]
app:
build: .
command: [ "sh", "-c", "scripts/run_server.sh" ]
env_file:
- .env
ports:
- "8000:8000"
=> depends_on:
db:
condition: service_healthy
✖