add autodiscovery via label "de.wie-ei.autostart=true" in compose files

master
Clemens Klug 2019-04-05 14:35:41 +02:00
parent ed00808e8b
commit d5da00e608
2 changed files with 69 additions and 3 deletions

View File

@ -1,13 +1,28 @@
# Usage # Usage
## json config ## autodiscover
usage: `python3 discover.py [-a <action>] [-l] service_dir [service_dir …]`
add label "de.wie-ei.autostart=true" to any service in a docker-compose-file
Examples:
* start services (up -d) `python3 discover.py /srv/services/ /opt/docker/testing/`
* which services are configured for autostart? `python3 discover.py -l /srv/services/ /opt/docker/testing/`
* check status `python3 discover.py -a ps /opt/docker/testing/`
* stop services `python3 discover.py -a "down -v /srv/testing/`
## manual config
### json config
* create config.json from sample.json * create config.json from sample.json
* add `python3 /opt/docker-autostart/start.py /path/to/your/config.json -t json` to `/etc/rc.local` * add `python3 /opt/docker-autostart/start.py /path/to/your/config.json -t json` to `/etc/rc.local`
## raw config ### raw config
* create config.lst from sample.lst * create config.lst from sample.lst
* add `python3 /opt/docker-autostart/start.py /path/to/your/config.lst` to `/etc/rc.local` * add `python3 /opt/docker-autostart/start.py /path/to/your/config.lst` to `/etc/rc.local`
## other actions ### other actions
* default action: up -d * default action: up -d
* add argument -a "<compose action>" * add argument -a "<compose action>"

51
discover.py Normal file
View File

@ -0,0 +1,51 @@
import argparse
import json
import os
import subprocess
import logging
log = logging.getLogger(__name__)
COMPOSE_FILE = "docker-compose.yml"
CONFIG_CMD = "docker-compose -f {path} config "
AUTOSTART_KEY = 'de.wie-ei.autostart: "true"'
AUTOSTART_KEY = 'de.wie-ei.autostart=true'
def complete_compose(entry):
path = entry.path
if not path.endswith(COMPOSE_FILE):
return os.path.join(path, COMPOSE_FILE)
return path
def has_compose(path):
return os.path.exists(path)
def find_services(dirs):
entries = [entry for base in dirs for entry in os.scandir(base) if entry.is_dir()]
return filter(has_compose, map(complete_compose, entries))
def should_autostart(service):
#r = subprocess.run(CONFIG_CMD.format(path=service).split(), capture_output=True, encoding="utf8")
#return AUTOSTART_KEY in r.stdout
with open(service) as src:
return AUTOSTART_KEY in src.read()
def find_autostart_services(services):
return list(filter(should_autostart, services))
if __name__ == "__main__":
logging.basicConfig(format="%(message)s (status %(returncode)s)", level=logging.INFO)
parser = argparse.ArgumentParser(description="Docker-compose Autostart discovery")
parser.add_argument("service_dir", nargs="+")
parser.add_argument("--action", "-a", default="up -d")
parser.add_argument("--list", "-l", action="store_true", help="list autostart services only, no action")
args = parser.parse_args()
services = find_services(args.service_dir)
autostarts = find_autostart_services(services)
if args.list:
print("\n".join(autostarts))
else:
import start
for service in autostarts:
start.change_service(service, args.action)