Sammelloeschung fuer ungenutzte Docker-Netzwerke hinzugefuegt

This commit is contained in:
Patrick Asmus
2026-05-08 23:40:07 +02:00
parent e64a0324a2
commit ef187b36f7
3 changed files with 140 additions and 13 deletions

View File

@@ -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 <<HELP
Dockernet Inspector v1.6.0 - Docker Netzwerk Verwaltungstool
Dockernet Inspector v1.7.0 - Docker Netzwerk Verwaltungstool
VERWENDUNG:
$0 - Interaktiver Modus (Menü)
@@ -54,6 +60,7 @@ VERWENDUNG:
$0 ips-all - Belegte IPs in allen Netzwerken anzeigen
$0 unused-networks - Ungenutzte Netzwerke (ohne Container) anzeigen
$0 delete-networks - Netzwerke interaktiv auswaehlen und loeschen
$0 delete-unused-networks - Alle ungenutzten, loeschbaren Netzwerke loeschen
$0 <netzwerk> - Alias fuer 'inspect <netzwerk>'
$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 <netzwerk> 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

View File

@@ -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.
```

View File

@@ -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 <netzwerk>` | 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 |
| `<netzwerk>` | Alias für `inspect <netzwerk>` (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
```