docker-systemd-sock-restartauto.md
· 3.6 KiB · Markdown
Eredeti
# 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
Tutoriel complet – Redémarrage automatique des containers utilisant docker.sock
Contexte
Sur Debian, lors d’une mise à jour Docker (apt upgrade) :
- le service
docker.serviceest redémarré - le socket
/var/run/docker.sockest recréé - les containers qui montent ce socket (Portainer, Dozzle, Telegraf, etc.) restent UP mais ne fonctionnent plus
- un
docker compose down && up -dcorrige 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
- Un script shell détecte les containers montant
/var/run/docker.sock - Le script redémarre uniquement ces containers
- 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.serviceredémarre/var/run/docker.sockest recréédocker-sock-restart.services’exécute automatiquement- seuls les containers utilisant
docker.socksont 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