In questo articolo esamineremo nel dettaglio come possiamo gestire i controlli di integrità con Docker Compose.
I controlli di integrità sono un modo efficace per gestire i container all'interno di un contesto Docker Compose. Quando un container dipende da un altro container per funzionare correttamente, solitamente specifichiamo una regola depends_on
nel blocco del container di destinazione.
Tuttavia, questa regola non implica che Docker eseguirà un controllo sullo stato del container specificato in questa regola. Significa invece che tale container verrà avviato prima del container di destinazione. In altre parole, è solo un modo per definire un ordine sequenziale nell'avvio dei container.
Supponiamo che la nostra app dipenda da un database e che il database debba essere pronto ad accettare connessioni dalla nostra app. Ecco un esempio di come possiamo utilizzare i controlli di integrità in questo scenario:
db:
image: postgres
container_name: db
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
ports:
- "127.0.0.1:5432:5432"
volumes:
- dbdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "${DB_USER}"]
interval: 10s
timeout: 5s
retries: 5
app:
depends_on:
db:
condition: service_healthy
Il blocco healthcheck
ha le seguenti proprietà:
test
: Il comando shell che esegue il test. In questo caso specifico, l'utilità da riga di comando utilizzata è incorporata, ma in molti altri casi, ad esempio se è necessario usare curl, lo strumento a riga di comando deve essere installato nel Dockerfile durante la fase di build del container.interval
: L'intervallo, in secondi, tra ogni esecuzione del test.timeout
: Il tempo, in secondi, da attendere prima di ottenere una risposta dal test.retries
: Quante volte è necessario ripetere lo stesso test se si verifica un errore.
Nel nostro container app
, il blocco depends_on
specifica quando questo container deve essere avviato, ovvero quando il container db
raggiunge lo stato Healthy
.
Quindi, se eseguiamo docker compose up -d
, l'intero processo sarà il seguente:
db
si avvia e rimane nello statoUnhealthy
finché un test non ha successo.app
si avvia e rimane nello statoCreated
perchédb
è ancoraUnhealthy
.- Un test ha successo e
db
diventaHealthy
. - Poiché ora
db
èHealthy
,app
diventaStarted
e viene effettivamente avviato.
Conclusione
La procedura descritta sopra rappresenta un flusso normale nel processo di avvio dei container in un contesto Docker Compose. In caso di errori, il modo più rapido per risolvere i problemi di avvio è consultare i log del container con il comando docker container logs container-id
per verificare perché il container restituisce uno stato di Error
.