Initial commit

master
May B. 2020-03-14 11:25:27 +01:00
commit f84cfed6d2
4 changed files with 104 additions and 0 deletions

9
DockerFile Normal file
View File

@ -0,0 +1,9 @@
FROM python:3-alpine
ADD dst.py /
RUN pip install docker
VOLUME [ "/data" ]
CMD [ "python", "./dst.py" ]

22
README.md Normal file
View File

@ -0,0 +1,22 @@
# Docker Status
Simple status page using Docker sdk and healthcheck.
## Options
Environment variable | Description | Default
--- | --- | ---
DOCKER_* | Docker client options | [Doc](https://docker-py.readthedocs.io/en/stable/client.html#docker.client.from_env)
DST_PATH | Json file output | `/data/status.json`
DST_INTERVAL | Update interval is seconds | `30`
DST_FILTER_LABEL | Filter visible containers with label | `False`
DST_NAME_LABEL | Override container name with label | `False`
DST_URL_LABEL | Provide url with label | `False`
## TODO
[x] Json periodic static
[ ] Static Front
[ ] Groups
[ ] Events
[ ] Gotify

25
docker-compose.yml Normal file
View File

@ -0,0 +1,25 @@
version: '2'
volumes:
data:
driver: local
services:
dst:
build: .
restart: always
container_name: dst
environment:
- DST_FILTER_LABEL=fr.wadza.dst.visible=true
- DST_NAME_LABEL=fr.wadza.dst.name
- DST_URL_LABEL=fr.wadza.dst.url
labels:
- fr.wadza.dst.visible=true
- fr.wadza.dst.name=Status
- fr.wadza.dst.url=https://status.wadza.fr
volumes:
- data:/data
- /var/run/docker.sock:/var/run/docker.sock
mem_limit: 512m
mem_reservation: 128m
memswap_limit: 0

48
dst.py Normal file
View File

@ -0,0 +1,48 @@
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()