48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
import docker
|
|
import json
|
|
import time
|
|
import os
|
|
|
|
path = os.environ.get("DST_PATH", "/data/status.json")
|
|
interval = int(os.environ.get("DST_INTERVAL", "30"))
|
|
filter_label = os.environ.get("DST_FILTER_LABEL", False)
|
|
filters = {}
|
|
if filter_label:
|
|
filters["label"] = filter_label
|
|
name_label = os.environ.get("DST_NAME_LABEL", False)
|
|
url_label = os.environ.get("DST_URL_LABEL", False)
|
|
|
|
client = docker.from_env()
|
|
|
|
def formatContainer(container):
|
|
state = container.attrs.get("State", {})
|
|
health = state.get("Health", {})
|
|
return {
|
|
"name": container.labels.get(name_label, container.name),
|
|
"url": container.labels.get(url_label),
|
|
"status": container.status,
|
|
"start": state.get("StartedAt"),
|
|
"stop": state.get("FinishedAt"),
|
|
"health": {
|
|
"status": health.get("Status", "none"),
|
|
"fails": health.get("FailingStreak", 0)
|
|
}
|
|
}
|
|
|
|
def loop():
|
|
while True:
|
|
try:
|
|
report = list(
|
|
map(formatContainer,
|
|
client.containers.list(all=True, filters=filters)))
|
|
with open(path, 'w') as outfile:
|
|
json.dump(report, outfile)
|
|
except docker.errors.NotFound:
|
|
print('Container bad move. Restarting.')
|
|
time.sleep(interval)
|
|
|
|
try:
|
|
loop()
|
|
except KeyboardInterrupt:
|
|
print('\n\nKeyboard exception received. Exiting.')
|
|
exit() |