Closed kurmann closed 5 months ago
Ja, genau! argparse
übernimmt die Aufgabe, die Argumente zur Laufzeit des Skripts zu parsen und an die entsprechenden Funktionen weiterzuleiten. Dies ermöglicht eine flexible und saubere Handhabung der Kommandozeilenargumente, sodass verschiedene Skripte mit ihren spezifischen Parametern ausgeführt werden können.
argparse
parst die Kommandozeilenargumente:
argparse
, um die Argumente aus der Kommandozeile zu lesen. Dabei wird der erste Parameter als Skriptname (script
) und die restlichen Parameter als zusätzliche Argumente (args
) behandelt.AWS CLI Konfiguration:
Ausführung des gewünschten Skripts:
supervisor.py
)Hier ist das vollständige Supervisor-Skript nochmals, das die Argumente parst und die entsprechenden Skripte mit ihren spezifischen Parametern ausführt:
import os
import subprocess
import sys
import argparse
def configure_aws():
"""Konfiguriert die AWS CLI mit Zugangsdaten aus Umgebungsvariablen."""
aws_access_key_id = os.getenv('AWS_ACCESS_KEY_ID')
aws_secret_access_key = os.getenv('AWS_SECRET_ACCESS_KEY')
aws_default_region = os.getenv('AWS_DEFAULT_REGION', 'eu-west-1')
if not aws_access_key_id or not aws_secret_access_key:
print("AWS_ACCESS_KEY_ID oder AWS_SECRET_ACCESS_KEY ist nicht gesetzt.")
print("Bitte setze die Umgebungsvariablen AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY.")
return False
try:
subprocess.run(['aws', 'configure', 'set', 'aws_access_key_id', aws_access_key_id], check=True)
subprocess.run(['aws', 'configure', 'set', 'aws_secret_access_key', aws_secret_access_key], check=True)
subprocess.run(['aws', 'configure', 'set', 'region', aws_default_region], check=True)
print("AWS CLI Konfiguration abgeschlossen.")
return True
except subprocess.CalledProcessError as e:
print(f"Fehler bei der AWS CLI Konfiguration: {e}")
return False
def run_script(script_name, args):
script_path = f"/usr/src/app/scripts/{script_name}.py"
if os.path.exists(script_path):
command = ['python3', script_path] + args
subprocess.run(command, check=True)
else:
print(f"Skript {script_name} existiert nicht.")
def main():
parser = argparse.ArgumentParser(description="Supervisor für S3 Restore Utilities")
parser.add_argument('script', type=str, help="Name des auszuführenden Skripts")
parser.add_argument('args', nargs=argparse.REMAINDER, help="Zusätzliche Argumente für das Skript")
args = parser.parse_args()
if configure_aws():
run_script(args.script, args.args)
if __name__ == "__main__":
main()
docker-compose.yml
)Hier ist das docker-compose.yml
, das das Supervisor-Skript als entrypoint
konfiguriert:
version: '3.8'
services:
s3-restore-utilities:
image: kurmann/s3-restore-utilities:latest
container_name: s3-restore-utilities
volumes:
- /volume1/docker/s3-restore-utilities/downloads:/usr/src/app/downloads
- /volume1/docker/s3-restore-utilities/logs:/usr/src/app/logs
- ./supervisor.py:/usr/local/bin/supervisor.py # Bind mount das Supervisor-Skript
env_file:
- .env
entrypoint: ["python3", "/usr/local/bin/supervisor.py"]
tty: true
stdin_open: true
volumes:
downloads:
logs:
Hier sind einige Beispiele, wie du die verschiedenen Skripte mit den jeweiligen Parametern ausführen kannst:
List Buckets Skript ausführen (ohne zusätzliche Parameter):
docker-compose run s3-restore-utilities list_buckets
Restore Deep Glacier Skript ausführen (mit zusätzlichen Parametern):
docker-compose run s3-restore-utilities restore_deep_glacier dein-bucket-name pfad/zum/verzeichnis Bulk
Check Restore Status Skript ausführen (mit zusätzlichen Parametern):
docker-compose run s3-restore-utilities check_restore_status dein-bucket-name pfad/zum/verzeichnis
Download S3 Directory Skript ausführen (mit zusätzlichen Parametern):
docker-compose run s3-restore-utilities download_s3_directory dein-bucket-name pfad/zum/verzeichnis lokaler-pfad
argparse
, um die Argumente zu parsen und die entsprechenden Skripte mit den richtigen Parametern auszuführen.entrypoint
, um das Supervisor-Skript auszuführen.Mit diesem Ansatz kannst du unterschiedliche Parameter für verschiedene Skripte angeben und sicherstellen, dass der Benutzer auf fehlende Parameter hingewiesen wird.
Einmalige Ausführung:
Dauerhafte Dienste:
Über die Shell:
docker run
docker exec
docker-compose up
docker run my-container python3 script.py
docker run -d -p 80:80 my-webserver
Über Netzwerk (Port-Aufrufe):
docker run -d -p 80:80 my-webserver
, Zugriff über http://localhost
.Docker CLI:
docker run
: Startet einen neuen Container.docker exec
: Führt einen Befehl in einem laufenden Container aus.docker stop
: Stoppt einen laufenden Container.Docker Compose:
docker-compose up
: Startet alle definierten Dienste.docker-compose down
: Stoppt und entfernt alle definierten Dienste.docker-compose.yml
.Docker Swarm/Kubernetes:
docker swarm init
, docker service create
kubectl apply
, kubectl get pods
Direktzugriff:
docker exec -it my-container /bin/sh
curl http://localhost:8080/api
Indirekter Zugriff:
http://localhost
Einmalige Ausführung vs. Dauerhafte Dienste:
Aufrufmethoden:
Verwaltungstools:
Zugriffsarten auf Container:
Durch die Verwendung dieser Ansätze kannst du flexibel und effizient Container-Anwendungen entwickeln, bereitstellen und verwalten, unabhängig von der zugrunde liegenden Technologie oder dem spezifischen Anwendungsfall.