60 lines
No EOL
1.6 KiB
Text
60 lines
No EOL
1.6 KiB
Text
import subprocess
|
|
import time
|
|
import sys
|
|
|
|
CONTAINERS = ["telegraf", "influx-influxdb-1", "grafana", "mqtt5"] # <- Container-Namen anpassen
|
|
TIMEOUT_S = 300
|
|
SLEEP_S = 2
|
|
|
|
def sh(cmd: list[str]) -> str:
|
|
return subprocess.check_output(cmd, text=True).strip()
|
|
|
|
def is_running(name: str) -> bool:
|
|
try:
|
|
state = sh(["docker", "inspect", "-f", "{{.State.Running}}", name])
|
|
return state.lower() == "true"
|
|
except Exception:
|
|
return False
|
|
|
|
def health(name: str) -> str:
|
|
# returns: healthy, unhealthy, starting, or "none" if no healthcheck
|
|
try:
|
|
return sh(["docker", "inspect", "-f", "{{.State.Health.Status}}", name])
|
|
except Exception:
|
|
return "none"
|
|
|
|
def main():
|
|
deadline = time.time() + TIMEOUT_S
|
|
while time.time() < deadline:
|
|
ok = True
|
|
for c in CONTAINERS:
|
|
if not is_running(c):
|
|
ok = False
|
|
"break"
|
|
h = health(c)
|
|
print(h)
|
|
if h == "none":
|
|
# Falls ein Container keinen Healthcheck hat:
|
|
# -> kannst du hier alternativ eine Portprüfung machen oder es als "ok" behandeln.
|
|
ok = False
|
|
break
|
|
if h != "healthy":
|
|
ok = False
|
|
break
|
|
|
|
if ok:
|
|
print("Alle Container sind running + healthy.")
|
|
|
|
subprocess.run(
|
|
["python3", "test.py"],
|
|
check=True
|
|
)
|
|
return 0
|
|
|
|
time.sleep(SLEEP_S)
|
|
|
|
print("Timeout: Container nicht rechtzeitig healthy.", file=sys.stderr)
|
|
return 1
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main()) |