MySql in docker - common issues
The problem:
Before the database container is loaded, the application wants to execute some query to the DB. Typically, this is related to migrations when creating a completely new project instance. Since the database does not respond, the application container is killed.
The solution?
A simple solution is to add HealthCheck to the DB ping and add a dependency (depends_on) in the application container if the database container is healthy.
An example
HealthCheck
Is added to a db service
healthcheck:
test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
timeout: 5s
interval: 5s
retries: 10
Dependency
It is added to the application service.
depends_on:
db:
condition: service_healthy
The result
The resulting "trimmed" 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
✖