import argparse import os import shutil import subprocess from datetime import datetime parser = argparse.ArgumentParser(description='Backup manager for backing up Docker Containers to Google Drive.') #group = parser.add_mutually_exclusive_group(required=True) # parser.add_argument('--export', action='store_true', help="Back up the Docker Container with the load method.") # parser.add_argument('--containers', action='store_true', type=list, help="Back up the Docker Container with the # load method.", required=True) parser.add_argument('--containers', nargs='+', required=True) parser.add_argument('--data', required=False) parser.add_argument('--upload', action='store_true', required=False) #sub = parser.add_subparsers(help='Backup mysql databases.') #mysql_parser = sub.add_parser mysql_parser = parser.add_argument_group('mysql') mysql_parser.add_argument('--mysql', required=False, help='MySql container name or id') mysql_parser.add_argument('--user', required=False, help='MySql username') mysql_parser.add_argument('--password', required=False, help='MySql password') args = parser.parse_args() containers = args.containers data = args.data mysql = args.mysql user = args.user password = args.password upload = args.upload def clear_backup(): folder = 'backup' for filename in os.listdir(folder): file_path = os.path.join(folder, filename) try: if os.path.isfile(file_path) or os.path.islink(file_path): os.unlink(file_path) elif os.path.isdir(file_path): shutil.rmtree(file_path) except Exception as e: print('Failed to delete %s. Reason: %s' % (file_path, e)) def runcommand(cmd): proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, universal_newlines=True) std_out, std_err = proc.communicate() return proc.returncode, std_out, std_err if containers: if not os.path.exists('backup'): os.mkdir('backup') clear_backup() for container in containers: print 'Backing up ' + container + '...' exitCode = runcommand("docker export " + container + " -o backup/" + container + ".tar.gz") if exitCode[0] is 0: print container + ' successfully backed up.' else: print container + ' could not be backed up.' print exitCode[2] if data: if not os.path.exists(data): print 'Data folder is not exist.' print 'Backing up data folder...' exitCode = runcommand("tar -zcf backup/data.tar.gz " + data) if exitCode[0] is 0: print 'Data folder successfully backed up.' else: print 'Data folder could not be backed up.' print exitCode[2] if mysql: if not user: print 'WARNING: MySql username is null.' if not password: print 'WARNING: MySql password is null.' print 'Backing up MySql databases...' exitCode = runcommand("docker exec " + mysql + " /usr/bin/mysqldump -u " + user + " --password=" + password + " --all-databases > backup/backup.sql") if exitCode[0] is 0: print 'MySql databases successfully backed up.' else: print 'MySql databases could not be backed up.' print exitCode[2] if upload: backup_name = datetime.now().strftime("%d-%m-%Y_%H-%M-%S") print 'Preparing for backup...' exitCode = runcommand("tar -zcf backup_" + backup_name + ".tar.gz backup") if exitCode[0] is 0: print 'Preparing successfully.' print 'Uploading...' exitCode = runcommand("mega-put backup_" + backup_name + ".tar.gz /backup/backup_" + backup_name + ".tar.gz") if exitCode[0] is 0: print 'Upload successful.' else: print 'Upload failed.' print exitCode[2] if os.path.exists("backup_" + backup_name + ".tar.gz"): os.remove("backup_" + backup_name + ".tar.gz") else: print 'Preparing failed.' print exitCode[2]