docker-installationen/scripts/start_docker_services.py

87 lines
3.1 KiB
Python

#!/usr/bin/env python3
import os
import subprocess
import sys
from escape_handler import start_exit_handler
DOCKER_DIR = "/home/andiamolino/docker"
def get_running_containers():
"""Gibt eine Liste der laufenden Container zurück."""
result = subprocess.run(["docker", "ps", "--format", "{{.Names}}"], capture_output=True, text=True)
return result.stdout.strip().split('\n') if result.stdout else []
def stop_container(container_name):
"""Stoppt einen spezifischen Container."""
subprocess.run(["docker", "stop", container_name], check=True)
def start_docker_compose(dir_path):
"""Startet Docker-Compose in einem bestimmten Verzeichnis."""
print(f"Starte Docker-Compose in {dir_path}")
subprocess.run(["docker-compose", "up", "-d"], cwd=dir_path, check=True)
def get_docker_compose_dirs():
"""Findet alle Verzeichnisse mit einer docker-compose.yml Datei."""
dirs = []
for dir_name in os.listdir(DOCKER_DIR):
dir_path = os.path.join(DOCKER_DIR, dir_name)
if os.path.isdir(dir_path) and dir_name != "containerdaten":
if os.path.exists(os.path.join(dir_path, "docker-compose.yml")):
dirs.append(dir_path)
return dirs
def main():
start_exit_handler
running_containers = get_running_containers()
if running_containers:
print("Laufende Container:")
for container in running_containers:
print(f"- {container}")
choice = input("Möchten Sie laufende Container stoppen? (j/n): ").strip().lower()
if choice == 'j':
for container in running_containers:
stop_container(container)
print("Alle laufenden Container wurden gestoppt.")
start_new = input("Möchten Sie neue Container starten? (j/n): ").strip().lower()
if start_new != 'j':
print("Keine neuen Container werden gestartet. Programm wird beendet.")
sys.exit(0)
docker_dirs = get_docker_compose_dirs()
print("\nGefundene Docker-Compose-Projekte:")
for i, dir_path in enumerate(docker_dirs, 1):
print(f"{i}. {os.path.basename(dir_path)}")
print("\nWählen Sie die zu startenden Projekte (durch Kommas getrennte Nummern, oder 'alle'):")
choice = input().strip().lower()
if choice == 'alle':
to_start = docker_dirs
else:
try:
indices = [int(x.strip()) - 1 for x in choice.split(',')]
to_start = [docker_dirs[i] for i in indices if 0 <= i < len(docker_dirs)]
except ValueError:
print("Ungültige Eingabe. Beende Programm.")
sys.exit(1)
# Stelle sicher, dass Traefik zuerst gestartet wird
traefik_dir = next((d for d in to_start if os.path.basename(d) == "traefik"), None)
if traefik_dir:
to_start.remove(traefik_dir)
to_start.insert(0, traefik_dir)
for dir_path in to_start:
try:
start_docker_compose(dir_path)
except subprocess.CalledProcessError as e:
print(f"Fehler beim Starten von {os.path.basename(dir_path)}: {e}")
if __name__ == "__main__":
main()