Utiliser les hooks de cycle de vie avec Compose
Hooks de cycle de vie des services
Quand Docker Compose exécute un conteneur, il utilise deux éléments, ENTRYPOINT et COMMAND, pour gérer ce qui se passe quand le conteneur démarre et s'arrête.
Cependant, il peut parfois être plus facile de gérer ces tâches séparément avec des hooks de cycle de vie - des commandes qui s'exécutent juste après le démarrage du conteneur ou juste avant qu'il ne s'arrête.
Les hooks de cycle de vie sont particulièrement utiles car ils peuvent avoir des privilèges spéciaux (comme s'exécuter en tant qu'utilisateur root), même quand le conteneur lui-même s'exécute avec des privilèges inférieurs pour la sécurité. Cela signifie que certaines tâches nécessitant des permissions plus élevées peuvent être effectuées sans compromettre la sécurité globale du conteneur.
Hooks post-démarrage
Les hooks post-démarrage sont des commandes qui s'exécutent après que le conteneur ait démarré, mais il n'y a pas de
temps défini pour quand exactement ils vont s'exécuter. Le timing d'exécution du hook n'est pas assuré pendant
l'exécution de l'entrypoint
du conteneur.
Dans l'exemple fourni :
- Le hook est utilisé pour changer la propriété d'un volume vers un utilisateur non-root (car les volumes sont créés avec la propriété root par défaut).
- Après le démarrage du conteneur, la commande
chown
change la propriété du répertoire/data
vers l'utilisateur1001
.
services:
app:
image: backend
user: 1001
volumes:
- data:/data
post_start:
- command: chown -R /data 1001:1001
user: root
volumes:
data: {} # un volume Docker est créé avec la propriété root
Hooks pré-arrêt
Les hooks pré-arrêt sont des commandes qui s'exécutent avant que le conteneur ne soit arrêté par une commande spécifique
(comme docker compose down
ou l'arrêter manuellement avec Ctrl+C
).
Ces hooks ne s'exécuteront pas si le conteneur s'arrête de lui-même ou est tué soudainement.
Dans l'exemple suivant, avant que le conteneur ne s'arrête, le script ./data_flush.sh
est
exécuté pour effectuer tout nettoyage nécessaire.
services:
app:
image: backend
pre_stop:
- command: ./data_flush.sh