100 lines
4.4 KiB
Bash
100 lines
4.4 KiB
Bash
#!/usr/bin/env bash
|
|
# ==============================================================================
|
|
# Bash 13: Docker & Container Lifecycle Scripting
|
|
# ==============================================================================
|
|
# In diesem Modul lernst du, wie Container-Umgebungen über Bash-Pipelines
|
|
# überwacht, gepollt, gesichert (Volume-Backups) und bereinigt werden.
|
|
# ==============================================================================
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# TODO 1: Container Health-Polling mit Retry-Schleife & Timeout
|
|
# ------------------------------------------------------------------------------
|
|
# Implementiere die Funktion `poll_container_health`.
|
|
# Parameter:
|
|
# $1: Container-Name / ID (z.B. "production-db")
|
|
# $2: Maximale Anzahl Versuche (Default: 5)
|
|
# $3: Wartezeit zwischen Versuchen in Sekunden (Default: 1)
|
|
# Verhalten:
|
|
# - Führt in einer Schleife `docker inspect --format='{{.State.Health.Status}}' "$1"` aus
|
|
# (oder nutzt den übergebenen / gemockten docker-Befehl).
|
|
# - Wenn der Status "healthy" ist: Gib "CONTAINER_HEALTHY: $1" aus und return 0.
|
|
# - Nach Erreichen von max_retries ohne "healthy": Gib "CONTAINER_TIMEOUT: $1" aus und return 1.
|
|
# ------------------------------------------------------------------------------
|
|
poll_container_health() {
|
|
local container_name="${1:-}"
|
|
local max_retries="${2:-5}"
|
|
local sleep_sec="${3:-1}"
|
|
|
|
# TODO: Validiere Container-Name
|
|
# TODO: Polling-Schleife implementieren
|
|
echo "TODO: Implementiere poll_container_health"
|
|
return 1
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# TODO 2: Docker Volume Backup-Kommando generieren
|
|
# ------------------------------------------------------------------------------
|
|
# Implementiere die Funktion `build_volume_backup_command`.
|
|
# Parameter:
|
|
# $1: Volume-Name (z.B. "postgres_data")
|
|
# $2: Zielverzeichnis auf Host (z.B. "/backups")
|
|
# $3: Dateiname des Archivs (z.B. "db_backup.tar.gz")
|
|
# Verhalten:
|
|
# - Erzeugt den offiziellen Docker-Pattern-Befehl zur Datensicherung:
|
|
# docker run --rm -v <volume>:/volume_data -v <host_dir>:/backup alpine tar czf /backup/<archive> -C /volume_data .
|
|
# - Bei fehlenden Parametern: Return 1.
|
|
# ------------------------------------------------------------------------------
|
|
build_volume_backup_command() {
|
|
local volume="${1:-}"
|
|
local host_dir="${2:-}"
|
|
local archive="${3:-}"
|
|
|
|
# TODO: Validiere Parameter
|
|
# TODO: Gib formatierten docker run Befehl aus
|
|
echo "TODO: Implementiere build_volume_backup_command"
|
|
return 1
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# TODO 3: Docker System Prune Befehl mit Filtern generieren
|
|
# ------------------------------------------------------------------------------
|
|
# Implementiere die Funktion `build_docker_prune_command`.
|
|
# Parameter:
|
|
# $1: All-Flag ("true" oder "false") -> entfernt auch ungenutzte Images, nicht nur dangling
|
|
# $2: Until-Stunden (optional, z.B. "24" oder "168")
|
|
# Verhalten:
|
|
# - Basisbefehl: `docker system prune -f`
|
|
# - Wenn All-Flag "true": `-a` anhängen
|
|
# - Wenn Until-Stunden angegeben: `--filter "until=<hours>h"` anhängen
|
|
# - Beispiel: `docker system prune -f -a --filter "until=24h"`
|
|
# ------------------------------------------------------------------------------
|
|
build_docker_prune_command() {
|
|
local all_flag="${1:-false}"
|
|
local until_hours="${2:-}"
|
|
|
|
# TODO: Baue prune Befehl zusammen und gib ihn aus
|
|
echo "TODO: Implementiere build_docker_prune_command"
|
|
return 1
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# TODO 4: Container Statistiken (JSON) parsen
|
|
# ------------------------------------------------------------------------------
|
|
# Implementiere die Funktion `parse_container_stats_json`.
|
|
# Parameter:
|
|
# $1: JSON-String mit Metriken
|
|
# Beispiel: '{"name":"api_srv","cpu":"4.2%","mem_usage":"210MiB / 2GiB"}'
|
|
# Verhalten:
|
|
# - Extrahiert `name`, `cpu` und `mem_usage` via `jq` (oder Bash-Mitteln).
|
|
# - Gibt formatierten String aus:
|
|
# "CONTAINER: <name> | CPU: <cpu> | MEM: <mem_usage>"
|
|
# - Bei ungültigem/leerem JSON: Return 1.
|
|
# ------------------------------------------------------------------------------
|
|
parse_container_stats_json() {
|
|
local json_str="${1:-}"
|
|
|
|
# TODO: Validiere JSON
|
|
# TODO: Extrahiere Felder und gib Format aus
|
|
echo "TODO: Implementiere parse_container_stats_json"
|
|
return 1
|
|
}
|