Gestion Automatisée des Conteneurs Docker avec Timeout et Recréation / Automated Docker Container Management with Timeout and Auto-Recreation
🎯 Objectif :
Créer un script pour :
- Lister les conteneurs actifs (sauf Portainer)
- Sauvegarder les informations essentielles (ID, nom, ports, volumes)
- Arrêter les conteneurs pour la maintenance (sans toucher à Portainer)
- Redémarrer automatiquement après 4 heures (ou sur commande)
- Recréer les conteneurs supprimés avec leurs anciens ports et volumes
Cela vous permet de gérer vos conteneurs sereinement tout en conservant l’accès à votre interface Portainer ! 🔒
🛠 Le Script : manage_containers.sh
Voici le code complet à copier :
#!/bin/bash
# Fichier pour stocker les informations des conteneurs
CONTAINER_FILE="/tmp/containers_info.txt"
TIMEOUT=14400 # 4 heures en secondes
EXCLUDED_CONTAINER="portainer" # Conteneur à exclure de l'arrêt/redémarrage
# Fonction pour lister et sauvegarder les conteneurs avec des détails
list_and_save_containers() {
echo "🔍 Liste des conteneurs en cours d'exécution (hors $EXCLUDED_CONTAINER)..."
docker ps --format "{{.ID}} {{.Names}} {{.Ports}} {{.Mounts}}" | grep -v "$EXCLUDED_CONTAINER" > "$CONTAINER_FILE"
if [[ ! -s $CONTAINER_FILE ]]; then
echo "✅ Aucun conteneur en cours d'exécution (hors $EXCLUDED_CONTAINER)."
exit 0
fi
echo "📄 Informations des conteneurs enregistrées dans : $CONTAINER_FILE"
cat "$CONTAINER_FILE"
}
# Fonction pour arrêter les conteneurs (hors Portainer)
stop_containers() {
echo "🛑 Arrêt des conteneurs (hors $EXCLUDED_CONTAINER)..."
while read -r container_id container_name container_ports container_mounts; do
if [[ "$container_name" != "$EXCLUDED_CONTAINER" ]]; then
echo "➡️ Arrêt du conteneur : $container_name ($container_id)"
docker stop "$container_id"
fi
done < "$CONTAINER_FILE"
echo "✔️ Tous les conteneurs listés (sauf $EXCLUDED_CONTAINER) sont arrêtés."
}
# Fonction pour redémarrer ou recréer les conteneurs
restart_or_recreate_containers() {
echo "🔁 Redémarrage ou recréation des conteneurs (hors $EXCLUDED_CONTAINER)..."
while read -r container_id container_name container_ports container_mounts; do
if [[ "$container_name" != "$EXCLUDED_CONTAINER" ]]; then
# Vérifier si le conteneur existe encore
if docker ps -a --format "{{.ID}}" | grep -q "$container_id"; then
echo "➡️ Redémarrage du conteneur : $container_name ($container_id)"
docker start "$container_id"
else
echo "⚠️ Conteneur $container_name introuvable. Recréation..."
# Recréer le conteneur avec des options basiques
recreate_command="docker run -d --name $container_name"
# Ajouter les ports si présents
if [[ -n $container_ports ]]; then
for port_mapping in $(echo $container_ports | tr ',' ' '); do
recreate_command+=" -p $port_mapping"
done
fi
# Ajouter les volumes si présents
if [[ -n $container_mounts ]]; then
for volume_mapping in $(echo $container_mounts | tr ',' ' '); do
recreate_command+=" -v $volume_mapping"
done
fi
# Afficher la commande de recréation (l'image reste à préciser)
echo "🔧 Commande de recréation :"
echo "$recreate_command <image>"
echo "❗ Remplacez '<image>' par l'image Docker d'origine pour finaliser la recréation."
fi
fi
done < "$CONTAINER_FILE"
echo "🚀 Redémarrage/recréation terminé."
}
# Exécution du script
case "$1" in
start)
list_and_save_containers
stop_containers
echo "🟠 Conteneurs arrêtés (hors $EXCLUDED_CONTAINER). Vous avez 4 heures pour effectuer votre action."
echo "⏳ Après 4 heures, les conteneurs seront redémarrés automatiquement."
# Délai de 4 heures
sleep "$TIMEOUT"
echo "⏰ Timeout atteint : redémarrage automatique des conteneurs..."
restart_or_recreate_containers
;;
restart)
if [[ ! -f $CONTAINER_FILE ]]; then
echo "❗ Fichier des conteneurs non trouvé. Lancez './manage_containers.sh start' d'abord."
exit 1
fi
restart_or_recreate_containers
;;
*)
echo "Usage : $0 {start|restart}"
exit 1
;;
esac
🚀 Comment l’utiliser :
-
Créer le script :
nano manage_containers.sh
-
Donner les droits d’exécution :
chmod +x manage_containers.sh
-
Lancer le processus d’arrêt et de sauvegarde :
./manage_containers.sh start
-
Après votre intervention (ou après le timeout de 4h) :
- Les conteneurs sont redémarrés automatiquement.
- Si un conteneur a été supprimé, la commande de recréation s’affiche pour vous guider ! 🚨
-
Redémarrer manuellement avant le timeout :
./manage_containers.sh restart
🧠 Pourquoi stocker plus d’infos sur les conteneurs ?
On sauvegarde les :
- ID du conteneur
- Nom
- Ports exposés
- Volumes montés
➡️ Ça permet de recréer un conteneur avec sa configuration si jamais il a été supprimé par accident.
🛡️ Timeout de 4 heures :
Avec le sleep 14400
, vous avez 4 heures pour faire votre maintenance avant que les conteneurs ne redémarrent tout seuls. Vous pouvez ajuster cette valeur à votre convenance.
🏁 Conclusion :
Avec ce script, vous pouvez :
✔️ Sauvegarder l’état de vos conteneurs
✔️ Arrêter les conteneurs proprement
✔️ Redémarrer automatiquement après un délai
✔️ Recréer les conteneurs supprimés avec leurs ports et volumes
✔️ Gagner du temps et réduire les erreurs lors des maintenances
C’est une base solide pour sécuriser vos déploiements Docker sur Debian ! 🐳
Here’s your article translated into English, ready to save in Bookstack! 📚 🚀
🎯 Goal:
Create a script to:
- List active containers (except Portainer)
- Save essential information (ID, name, ports, volumes)
- Stop containers for maintenance (without affecting Portainer)
- Automatically restart after 4 hours (or on command)
- Recreate deleted containers with their previous ports and volumes
This allows you to manage your containers with peace of mind while maintaining access to your Portainer interface! 🔒
🛠 The Script: manage_containers.sh
Here’s the full code to copy:
#!/bin/bash
# File to store container information
CONTAINER_FILE="/tmp/containers_info.txt"
TIMEOUT=14400 # 4 hours in seconds
EXCLUDED_CONTAINER="portainer" # Container to exclude from stop/restart
# Function to list and save container details
list_and_save_containers() {
echo "🔍 Listing running containers with details..."
docker ps --format "{{.ID}} {{.Names}} {{.Ports}} {{.Mounts}}" | grep -v "$EXCLUDED_CONTAINER" > "$CONTAINER_FILE"
if [[ ! -s $CONTAINER_FILE ]]; then
echo "✅ No running containers (excluding $EXCLUDED_CONTAINER)."
exit 0
fi
echo "📄 Container information saved to: $CONTAINER_FILE"
cat "$CONTAINER_FILE"
}
# Function to stop containers (excluding Portainer)
stop_containers() {
echo "🛑 Stopping containers (excluding $EXCLUDED_CONTAINER)..."
while read -r container_id container_name container_ports container_mounts; do
if [[ "$container_name" != "$EXCLUDED_CONTAINER" ]]; then
echo "➡️ Stopping container: $container_name ($container_id)"
docker stop "$container_id"
fi
done < "$CONTAINER_FILE"
echo "✔️ All listed containers (except $EXCLUDED_CONTAINER) stopped."
}
# Function to restart or recreate containers
restart_or_recreate_containers() {
echo "🔁 Restarting or recreating containers (excluding $EXCLUDED_CONTAINER)..."
while read -r container_id container_name container_ports container_mounts; do
if [[ "$container_name" != "$EXCLUDED_CONTAINER" ]]; then
# Check if the container still exists
if docker ps -a --format "{{.ID}}" | grep -q "$container_id"; then
echo "➡️ Restarting container: $container_name ($container_id)"
docker start "$container_id"
else
echo "⚠️ Container $container_name not found. Recreating..."
# Recreate the container with basic options
recreate_command="docker run -d --name $container_name"
# Add ports if present
if [[ -n $container_ports ]]; then
for port_mapping in $(echo $container_ports | tr ',' ' '); do
recreate_command+=" -p $port_mapping"
done
fi
# Add volumes if present
if [[ -n $container_mounts ]]; then
for volume_mapping in $(echo $container_mounts | tr ',' ' '); do
recreate_command+=" -v $volume_mapping"
done
fi
# Show the recreation command (image needs to be specified)
echo "🔧 Recreation command:"
echo "$recreate_command <image>"
echo "❗ Replace '<image>' with the original Docker image to complete the recreation."
fi
fi
done < "$CONTAINER_FILE"
echo "🚀 Restart/recreation complete."
}
# Script execution
case "$1" in
start)
list_and_save_containers
stop_containers
echo "🟠 Containers stopped (excluding $EXCLUDED_CONTAINER). You have 4 hours to complete your action."
echo "⏳ After 4 hours, containers will restart automatically."
# 4-hour timeout
sleep "$TIMEOUT"
echo "⏰ Timeout reached: Automatically restarting containers..."
restart_or_recreate_containers
;;
restart)
if [[ ! -f $CONTAINER_FILE ]]; then
echo "❗ Container file not found. Run './manage_containers.sh start' first."
exit 1
fi
restart_or_recreate_containers
;;
*)
echo "Usage: $0 {start|restart}"
exit 1
;;
esac
🚀 How to Use It:
-
Create the script:
nano manage_containers.sh
-
Make it executable:
chmod +x manage_containers.sh
-
Start the process to stop and save containers:
./manage_containers.sh start
-
After your maintenance (or after the 4-hour timeout):
- Containers restart automatically.
- If a container was deleted, a recreation command appears to help you restore it! 🚨
-
Restart manually before the timeout:
./manage_containers.sh restart
🧠 Why Save More Container Info?
We save:
- Container ID
- Name
- Exposed ports
- Mounted volumes
➡️ This lets you recreate a container with its configuration if it gets deleted.
🛡️ 4-Hour Timeout:
With sleep 14400
, you get 4 hours to perform maintenance before containers automatically restart. You can change this value to fit your needs.
🏁 Conclusion:
With this script, you can:
✔️ Save container state
✔️ Stop containers safely
✔️ Automatically restart after a delay
✔️ Recreate deleted containers with their ports and volumes
✔️ Save time and avoid errors during maintenance
It’s a solid base to secure your Docker deployments on Debian! 🐳
No Comments