diff --git a/dockernet-inspector.v1.sh b/dockernet-inspector.v1.sh index f985c64..b6dd883 100644 --- a/dockernet-inspector.v1.sh +++ b/dockernet-inspector.v1.sh @@ -7,6 +7,7 @@ # - Belegte IPs je Netzwerk und netzwerkuebergreifend ausgeben # - Ungenutzte Netzwerke (ohne Container) anzeigen # - Netzwerke interaktiv auswaehlen und loeschen +# - Alle ungenutzten, loeschbaren Netzwerke auf einmal entfernen # Verwendung: bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONS] # Befehle: # networks - Alle Docker Netzwerke auflisten @@ -15,14 +16,14 @@ # ips-all - Belegte IPs in allen Netzwerken # unused-networks - Netzwerke ohne verbundene Container # delete-networks - Netzwerke interaktiv auswaehlen und loeschen +# delete-unused-networks - Alle ungenutzten, loeschbaren Netzwerke loeschen # help, -h, --help - Diese Hilfe anzeigen # Autor: Patrick Asmus # Web: https://www.cleveradmin.de # Git-Reposit.: https://git.techniverse.net/scriptos/dockernet-inspector.git -# Version: 1.6.0 -# Datum: 10.04.2026 -# Modifikation: Schutz fuer Docker-Standardnetzwerke (bridge, host, none) hinzugefuegt; -# Detailansicht zeigt Hinweis statt Bridge-Daten, Loeschen wird blockiert +# Version: 1.7.0 +# Datum: 08.05.2026 +# Modifikation: Sammelloeschung fuer ungenutzte Docker-Netzwerke hinzugefuegt ##################################################### set -uo pipefail @@ -41,10 +42,15 @@ print_table_title() { print_rule "=" } +is_protected_network() { + local net="$1" + [[ "$net" == "bridge" || "$net" == "host" || "$net" == "none" || "$net" == "ingress" || "$net" == "docker_gwbridge" ]] +} + # Hilfe-Funktion show_help() { cat < - Alias fuer 'inspect ' $0 help - Diese Hilfe anzeigen @@ -63,7 +70,9 @@ BEFEHLE: ips-all Zeigt alle belegten IPv4-Adressen in allen Netzwerken (aufsteigend) unused-networks Zeigt alle Docker Netzwerke ohne verbundene Container delete-networks Netzwerk per Nummer auswaehlen und loeschen; - Docker-Standardnetzwerke (bridge, host, none) sind geschuetzt + Docker-Standard- und Systemnetzwerke sind geschuetzt + delete-unused-networks Loescht alle ungenutzten Docker Netzwerke nach Bestaetigung; + bridge, host, none, ingress und docker_gwbridge sind geschuetzt inspect Zeigt detaillierte Informationen zu einem Netzwerk: - Netzwerktyp (Driver) - Bridge-Interface @@ -78,6 +87,7 @@ BEISPIELE: $0 ips-all $0 unused-networks $0 delete-networks + $0 delete-unused-networks $0 inspect mynetwork $0 mynetwork $0 -h @@ -219,7 +229,7 @@ delete_networks() { local i for ((i=0; i<${#net_array[@]}; i++)); do local suffix="" - [[ "${net_array[$i]}" == "bridge" || "${net_array[$i]}" == "host" || "${net_array[$i]}" == "none" ]] && suffix=" (Standard - nicht loeschbar)" + is_protected_network "${net_array[$i]}" && suffix=" (geschuetzt - nicht loeschbar)" printf " %d. %s%s\n" "$((i+1))" "${net_array[$i]}" "$suffix" done echo "" @@ -236,8 +246,8 @@ delete_networks() { fi local selected_net="${net_array[$((choice-1))]}" - if [[ "$selected_net" == "bridge" || "$selected_net" == "host" || "$selected_net" == "none" ]]; then - echo "FEHLER: '$selected_net' ist ein Docker-Standardnetzwerk und kann nicht geloescht werden." + if is_protected_network "$selected_net"; then + echo "FEHLER: '$selected_net' ist ein geschuetztes Docker-Netzwerk und kann nicht geloescht werden." return 1 fi echo "" @@ -250,11 +260,92 @@ delete_networks() { echo "" if docker network rm "$selected_net" 2>/dev/null; then echo "OK: Netzwerk '$selected_net' erfolgreich geloescht." + return 0 else echo "FEHLER: Netzwerk '$selected_net' konnte nicht geloescht werden (wird moeglicherweise noch genutzt)." + return 1 fi } +delete_unused_networks() { + local nets net containers driver scope + local -a delete_candidates + local -a protected_unused + + nets="$(docker network ls --format '{{.Name}}' 2>/dev/null || true)" + if [[ -z "$nets" ]]; then + echo "Fehler: Keine Docker Netzwerke gefunden." + return 1 + fi + + delete_candidates=() + protected_unused=() + + while read -r net; do + [[ -z "${net:-}" ]] && continue + containers="$(docker network inspect "$net" --format '{{len .Containers}}' 2>/dev/null || true)" + if [[ "${containers:-0}" -eq 0 ]]; then + if is_protected_network "$net"; then + protected_unused+=("$net") + else + delete_candidates+=("$net") + fi + fi + done < <(printf "%s\n" "$nets") + + if ((${#delete_candidates[@]} == 0)); then + echo "Keine ungenutzten, loeschbaren Docker Netzwerke gefunden." + if ((${#protected_unused[@]} > 0)); then + echo "Geschuetzte ungenutzte Netzwerke werden uebersprungen: ${protected_unused[*]}" + fi + return 0 + fi + + print_table_title "Ungenutzte Docker Netzwerke, die geloescht werden koennen:" + local table_data + table_data=$'NAME\tDRIVER\tSCOPE\n' + for net in "${delete_candidates[@]}"; do + driver="$(docker network inspect "$net" --format '{{.Driver}}' 2>/dev/null || true)" + scope="$(docker network inspect "$net" --format '{{.Scope}}' 2>/dev/null || true)" + table_data+="${net}"$'\t'"${driver}"$'\t'"${scope}"$'\n' + done + print_dynamic_table "$table_data" + + if ((${#protected_unused[@]} > 0)); then + echo "" + echo "Geschuetzte ungenutzte Netzwerke werden nicht geloescht: ${protected_unused[*]}" + fi + + echo "" + read -rp "Alle oben aufgefuehrten ungenutzten Netzwerke wirklich loeschen? [j/N]: " confirm + if [[ "$confirm" != "j" && "$confirm" != "J" ]]; then + echo "Abgebrochen." + return 0 + fi + + local success_count=0 + local fail_count=0 + echo "" + for net in "${delete_candidates[@]}"; do + if is_protected_network "$net"; then + echo "SKIP: Netzwerk '$net' ist geschuetzt." + continue + fi + + if docker network rm "$net" >/dev/null 2>&1; then + echo "OK: Netzwerk '$net' erfolgreich geloescht." + ((success_count++)) + else + echo "FEHLER: Netzwerk '$net' konnte nicht geloescht werden (wird moeglicherweise wieder genutzt)." + ((fail_count++)) + fi + done + + echo "" + echo "Ergebnis: $success_count geloescht, $fail_count fehlgeschlagen." + ((fail_count == 0)) +} + # Interaktive Menü-Funktion interactive_menu() { while true; do @@ -269,9 +360,10 @@ interactive_menu() { echo "4. Alle belegten IPs anzeigen" echo "5. Ungenutzte Netzwerke anzeigen" echo "6. Netzwerke loeschen" + echo "7. Alle ungenutzten Netzwerke loeschen" echo "0. Beenden" echo "" - read -rp "Bitte waehlen Sie eine Option (0-6): " choice + read -rp "Bitte waehlen Sie eine Option (0-7): " choice echo "" case "$choice" in @@ -309,12 +401,15 @@ interactive_menu() { 6) delete_networks ;; + 7) + delete_unused_networks + ;; 0) echo "Auf Wiedersehen!" exit 0 ;; *) - echo "FEHLER: Ungueltige Eingabe '$choice'. Bitte geben Sie eine Nummer zwischen 0 und 6 ein." + echo "FEHLER: Ungueltige Eingabe '$choice'. Bitte geben Sie eine Nummer zwischen 0 und 7 ein." sleep 1 ;; esac @@ -428,7 +523,11 @@ case "$COMMAND" in ;; delete-networks) delete_networks - exit 0 + exit $? + ;; + delete-unused-networks) + delete_unused_networks + exit $? ;; help | -h | --help) show_help diff --git a/docs/examples.md b/docs/examples.md index 801a386..d11e467 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -57,9 +57,11 @@ Dockerdet Inspector - Interaktives Menü 3. IPs eines Netzwerks anzeigen 4. Alle belegten IPs anzeigen 5. Ungenutzte Netzwerke anzeigen +6. Netzwerke loeschen +7. Alle ungenutzten Netzwerke loeschen 0. Beenden -Bitte waehlen Sie eine Option (0-5): +Bitte waehlen Sie eine Option (0-7): ``` ## `unused-networks` @@ -72,3 +74,23 @@ NAME DRIVER SCOPE old-backend bridge local test-network bridge local ``` + +## `delete-unused-networks` + +```text +Ungenutzte Docker Netzwerke, die geloescht werden koennen: +================================================================================ +NAME DRIVER SCOPE +-------------------------------------------------------------------------------- +old-backend bridge local +test-network bridge local + +Geschuetzte ungenutzte Netzwerke werden nicht geloescht: bridge none + +Alle oben aufgefuehrten ungenutzten Netzwerke wirklich loeschen? [j/N]: j + +OK: Netzwerk 'old-backend' erfolgreich geloescht. +OK: Netzwerk 'test-network' erfolgreich geloescht. + +Ergebnis: 2 geloescht, 0 fehlgeschlagen. +``` diff --git a/docs/usage.md b/docs/usage.md index 0b6c249..cb46264 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -15,6 +15,8 @@ Das Script startet ein interaktives Menü mit folgenden Optionen: - **3** – IPs eines Netzwerks anzeigen (mit Netzwerk-Auswahl) - **4** – Alle belegten IPs anzeigen - **5** – Ungenutzte Netzwerke anzeigen +- **6** – Netzwerke löschen +- **7** – Alle ungenutzten, löschbaren Netzwerke löschen - **0** – Beenden Bei den Optionen **2** und **3** wird eine Netzwerkliste angezeigt, aus der per Nummer ausgewählt werden kann. @@ -35,6 +37,8 @@ bash ./dockernet-inspector.v1.sh [BEFEHL] [OPTIONEN] | `ips ` | Zeigt alle belegten IPv4-Adressen im angegebenen Netzwerk | | `ips-all` | Zeigt alle belegten IPv4-Adressen in allen Docker-Netzwerken (aufsteigend sortiert) | | `unused-networks` | Zeigt alle Docker-Netzwerke ohne verbundene Container | +| `delete-networks` | Löscht ein interaktiv ausgewähltes Netzwerk | +| `delete-unused-networks` | Löscht alle ungenutzten, löschbaren Docker-Netzwerke nach Bestätigung | | `` | Alias für `inspect ` (Rückwärtskompatibilität) | | `help`, `-h`, `--help` | Zeigt die Hilfe an | @@ -47,6 +51,8 @@ bash ./dockernet-inspector.v1.sh my-custom-network bash ./dockernet-inspector.v1.sh ips dockernet bash ./dockernet-inspector.v1.sh ips-all bash ./dockernet-inspector.v1.sh unused-networks +bash ./dockernet-inspector.v1.sh delete-networks +bash ./dockernet-inspector.v1.sh delete-unused-networks bash ./dockernet-inspector.v1.sh help ```