Aufgaben-Python/courses/bash/13_docker_und_container_scripting/aufgabe.sh

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
}