71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
import argparse
|
|
import subprocess
|
|
import time
|
|
from datetime import datetime
|
|
|
|
from apscheduler.schedulers.background import BackgroundScheduler
|
|
from docker import Client
|
|
|
|
|
|
scheduler = BackgroundScheduler()
|
|
|
|
|
|
def backup(socket, outdir, stack, services):
|
|
api = Client(base_url=args.socket)
|
|
for service in services:
|
|
containers = api.containers(
|
|
filters={
|
|
'label': "io.rancher.project_service.name={}/{}".format(
|
|
stack,
|
|
service,
|
|
)
|
|
}
|
|
)
|
|
|
|
for container in containers:
|
|
|
|
for mount in container.get('Mounts'):
|
|
name = mount.get('Name')
|
|
source = mount.get('Source')
|
|
|
|
outfile="{outdir}/{stack}-{service}-{name}-{date}-{container}.tgz".format(
|
|
outdir=outdir,
|
|
stack=stack,
|
|
service=service,
|
|
name=name,
|
|
date=datetime.now().strftime('%Y%m%d-%H%M%S'),
|
|
container=container.get('Id')[:8],
|
|
)
|
|
subprocess.call([
|
|
"tar",
|
|
"-cpzf",
|
|
outfile,
|
|
source,
|
|
])
|
|
|
|
parser = argparse.ArgumentParser(description="backup a rancher services docker volumes")
|
|
parser.add_argument('--loop', action='store_true',
|
|
help="loop forever, run backup daily")
|
|
parser.add_argument('socket', default='unix://var/run/docker.sock',
|
|
help="docker socket")
|
|
parser.add_argument('outdir')
|
|
parser.add_argument('stack', help="rancher stack name")
|
|
parser.add_argument('services', metavar='service', nargs='+',
|
|
help="rancher service names")
|
|
args = parser.parse_args()
|
|
backup(args.socket, args.outdir, args.stack, args.services)
|
|
|
|
scheduler.start()
|
|
scheduler.add_job(
|
|
func=backup,
|
|
trigger='interval',
|
|
days=1,
|
|
args=(args.socket, args.outdir, args.stack, args.services),
|
|
)
|
|
if 'loop' in args and args.loop:
|
|
try:
|
|
while True:
|
|
time.sleep(20)
|
|
except (KeyboardInterrupt, SystemExit):
|
|
scheduler.shutdown()
|