最終更新 1 month ago

Restart des container declarant /var/run/docker.sock dasn le compose .

docker-systemd-sock-restartauto.md Raw

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

mkdir -p /home/tools/SH

1.2 Créer le script

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

chown root:root /home/tools/SH/docker-restart-sock.sh
chmod 750 /home/tools/SH/docker-restart-sock.sh

1.4 Test manuel

/home/tools/SH/docker-restart-sock.sh

Étape 2 – Création du service systemd

2.1 Créer le service

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

systemctl daemon-reload
systemctl enable docker-sock-restart.service

Étape 3 – Vérifications

Lancement manuel

systemctl start docker-sock-restart.service

Logs du service

journalctl -u docker-sock-restart.service -n 50

Ordre d’exécution Docker → script

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