# Tutoriel complet – Redémarrage automatique des containers utilisant docker.sock ## Contexte Sur Debian, lors d’une mise à jour Docker (`apt upgrade`) : * le service `docker.service` est redémarré * le socket `/var/run/docker.sock` est recréé * les containers qui montent ce socket (Portainer, Dozzle, Telegraf, etc.) restent **UP** mais ne fonctionnent plus * un `docker compose down && up -d` corrige le problème mais est destructif (réseaux recréés, coupure de service) Même avec `live-restore`, ce problème persiste car le **socket Docker est perdu**. --- ## Objectif * Détecter automatiquement les containers qui utilisent `/var/run/docker.sock` * Les redémarrer **juste après chaque redémarrage de Docker** * Ne toucher à aucun autre container * Éviter totalement `docker compose down/up` --- ## Principe de la solution 1. Un script shell détecte les containers montant `/var/run/docker.sock` 2. Le script redémarre uniquement ces containers 3. Un service systemd exécute ce script **après le redémarrage de Docker** --- ## Étape 1 – Création du script ### 1.1 Créer le répertoire ```bash mkdir -p /home/tools/SH ``` ### 1.2 Créer le script ```bash cat > /home/tools/SH/docker-restart-sock.sh <<'EOF' #!/bin/sh printf "%-20s %-30s %-18s %-10s\n" "CONTAINER" "IMAGE" "RESTART" "UP(s)" for id in $(docker ps -aq); do if docker inspect -f '{{range .Mounts}}{{.Source}}{{end}}' "$id" | grep -q '/var/run/docker.sock'; then name=$(docker inspect -f '{{.Name}}' "$id" | sed 's#^/##') image=$(docker inspect -f '{{.Config.Image}}' "$id") restartp=$(docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' "$id") docker restart "$id" >/dev/null 2>&1 start=$(docker inspect -f '{{.State.StartedAt}}' "$id") now=$(date -u +"%Y-%m-%dT%H:%M:%S.%NZ") up=$(($(date -d "$now" +%s) - $(date -d "$start" +%s))) printf "%-20s %-30s %-18s %-10s\n" "$name" "$image" "$restartp" "$up" fi done EOF ``` ### 1.3 Sécuriser le script ```bash chown root:root /home/tools/SH/docker-restart-sock.sh chmod 750 /home/tools/SH/docker-restart-sock.sh ``` ### 1.4 Test manuel ```bash /home/tools/SH/docker-restart-sock.sh ``` --- ## Étape 2 – Création du service systemd ### 2.1 Créer le service ```bash cat > /etc/systemd/system/docker-sock-restart.service <<'EOF' [Unit] Description=Restart containers using docker.sock after Docker restart After=docker.service Requires=docker.service [Service] Type=oneshot ExecStart=/home/tools/SH/docker-restart-sock.sh TimeoutStartSec=0 [Install] WantedBy=multi-user.target EOF ``` ### 2.2 Activer le service ```bash systemctl daemon-reload systemctl enable docker-sock-restart.service ``` --- ## Étape 3 – Vérifications ### Lancement manuel ```bash systemctl start docker-sock-restart.service ``` ### Logs du service ```bash journalctl -u docker-sock-restart.service -n 50 ``` ### Ordre d’exécution Docker → script ```bash journalctl -u docker.service -u docker-sock-restart.service --no-pager ``` --- ## Résultat final * Mise à jour Docker ou reboot * `docker.service` redémarre * `/var/run/docker.sock` est recréé * `docker-sock-restart.service` s’exécute automatiquement * seuls les containers utilisant `docker.sock` sont redémarrés * plus jamais besoin de `docker compose down && up -d` --- ## Containers typiquement concernés * portainer * dozzle / dozzle-agent * uptime-kuma * telegraf * watchtower * lazydocker * dockge --- ## Notes * Compatible avec `live-restore` * Pas de boucle de redémarrage * Impact nul sur les autres containers * Solution fiable, propre et maintenable