• 22. června 2022

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
career

Zajímá tě Docker?

Mrkni se, jestli by ses nám nehodil