docker-systemd-sock-restartauto.md
· 1.3 KiB · Markdown
原始檔案
# Redémarrage automatique des containers utilisant docker.sock
## Problème
Lors d’une mise à jour Docker :
- `dockerd` redémarre
- le socket `/var/run/docker.sock` est recréé
- les containers qui l’utilisent (Portainer, Dozzle, Telegraf, etc.)
restent UP mais ne fonctionnent plus
- `docker compose down/up` corrige car il recrée tout
## Solution
Redémarrer automatiquement **uniquement** les containers
qui montent `/var/run/docker.sock`, juste après le redémarrage de Docker.
---
## 1. Script de détection + restart
Créer le script :
```bash
mkdir -p /home/tools/SH
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
Redémarrage automatique des containers utilisant docker.sock
Problème
Lors d’une mise à jour Docker :
dockerdredémarre- le socket
/var/run/docker.sockest recréé - les containers qui l’utilisent (Portainer, Dozzle, Telegraf, etc.) restent UP mais ne fonctionnent plus
docker compose down/upcorrige car il recrée tout
Solution
Redémarrer automatiquement uniquement les containers
qui montent /var/run/docker.sock, juste après le redémarrage de Docker.
1. Script de détection + restart
Créer le script :
mkdir -p /home/tools/SH
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