Skip to content

Instantly share code, notes, and snippets.

@garnajee
Created November 10, 2025 15:05
Show Gist options
  • Select an option

  • Save garnajee/7d505f737192a7afb57131dc321def21 to your computer and use it in GitHub Desktop.

Select an option

Save garnajee/7d505f737192a7afb57131dc321def21 to your computer and use it in GitHub Desktop.
#!/bin/bash
# Script pour lister les conteneurs Docker en cours d'exécution, leurs ports et noms.
# Prend un dossier en entrée (bien qu'il utilise principalement 'docker ps' qui est global).
# Syntaxe : ./check_docker_ports.sh [DOSSIER_DE_BASE]
# Fonction pour afficher l'aide
usage() {
echo "Utilisation: $0 [DOSSIER_DE_BASE]"
echo "Le dossier est optionnel, le script liste tous les conteneurs Docker en cours d'exécution."
exit 1
}
# Vérifier si docker est installé et accessible
if ! command -v docker &> /dev/null
then
echo "Erreur: La commande 'docker' n'a pas été trouvée. Assurez-vous que Docker est installé et dans le PATH."
exit 1
fi
# Le dossier d'entrée est ignoré dans cette version car 'docker ps' est global
# Si vous voulez filtrer les conteneurs par emplacement de docker-compose,
# le script deviendrait beaucoup plus complexe.
# Pour une liste des services UP & RUNNING, 'docker ps' est suffisant.
BASE_DIR=${1:-"."}
echo "Analyse des conteneurs Docker en cours d'exécution..."
echo "--------------------------------------------------------"
# Utiliser 'docker ps' avec l'option --format pour un parsing facile
# On récupère les colonnes suivantes : Noms (Names), Ports (Ports), Statut (Status)
# Le format est : "{{.Names}}\t{{.Ports}}\t{{.Status}}"
CONTAINERS_INFO=$(docker ps --format "{{.Names}}\t{{.Ports}}\t{{.Status}}")
# On prépare l'en-tête du tableau
# On utilise printf pour un formatage en colonne plus fiable
printf "| %-30s | %-40s | %-15s |\n" "Application (Nom du Conteneur)" "Ports Mappés (Hôte -> Conteneur)" "Statut"
printf "| %-30s | %-40s | %-15s |\n" "------------------------------" "----------------------------------------" "---------------"
# Parcourir chaque ligne d'information
IFS=$'\n'
for line in $CONTAINERS_INFO; do
# Séparer les champs par tabulation
NAME=$(echo "$line" | cut -f1)
PORTS_LINE=$(echo "$line" | cut -f2)
STATUS=$(echo "$line" | cut -f3)
# Vérifier si le conteneur a des ports mappés
if [[ -n "$PORTS_LINE" ]]; then
# Extraire les mappings Hôte:Port
# La ligne de ports est souvent du format '0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp'
# On ne garde que les parties qui nous intéressent (Hôte:Port -> Conteneur:Port)
# Le champ Ports peut contenir plusieurs mappings séparés par des virgules et des espaces.
# On remplace les virgules par des retours à la ligne pour un traitement par ligne
# et on boucle sur chaque mapping
# On extrait la partie Hôte:Port
HOST_PORTS=$(echo "$PORTS_LINE" | sed -E 's/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:)?([0-9]+->[0-9]+\/[a-z]+)/\2/g' | tr ',' '\n' | sed 's/^[ \t]*//')
# On affiche chaque mapping de port dans le tableau
FIRST_LINE=true
IFS_BACKUP=$IFS
IFS=$'\n'
for MAPPING in $HOST_PORTS; do
# S'il s'agit de la première ligne pour ce conteneur, on affiche le nom et le statut
if $FIRST_LINE ; then
printf "| **%-30s** | %-40s | %-15s |\n" "$NAME" "$MAPPING" "$STATUS"
FIRST_LINE=false
else
# Sinon, on affiche juste les ports sans répéter le nom/statut
printf "| %-30s | %-40s | %-15s |\n" "" "$MAPPING" ""
fi
done
IFS=$IFS_BACKUP # Rétablir l'IFS
else
# Conteneur sans mapping de port public
printf "| **%-30s** | %-40s | %-15s |\n" "$NAME" "AUCUN PORT PUBLIC" "$STATUS"
fi
printf "| %-30s | %-40s | %-15s |\n" "------------------------------" "----------------------------------------" "---------------"
done
echo ""
echo "✅ Opération terminée. Le tableau liste uniquement les conteneurs en statut 'Up'."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment