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.') parser.add_argument('--containers', nargs='+', required=True) parser.add_argument('--data', required=False) parser.add_argument('--backup', required=True, help='Backup target directory.') parser.add_argument('--export', required=True, help='Compressed backup file target directory.') parser.add_argument('--upload', action='store_true', required=False) parser.add_argument('--clean', action='store_true', required=False) 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 folder = args.backup export = args.export clean = args.clean def clear_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(folder): os.mkdir(folder) clear_backup() for container in containers: print 'Backing up ' + container + '...' exitCode = runcommand("docker export " + container + " -o " + folder + "/" + 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 " + folder + "/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 > " + folder + "/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") backup_path = export + "/backup_" + backup_name + ".tar.gz" print 'Preparing for backup...' if not os.path.exists(export): os.mkdir(export) exitCode = runcommand("tar -zcf " + backup_path + " " + folder) if exitCode[0] is 0: print 'Preparing successfully.' print 'Uploading...' exitCode = runcommand("mega-put " + backup_path + " /backup/backup_" + backup_name + ".tar.gz") if exitCode[0] is 0: print 'Upload successful.' else: print 'Upload failed.' print exitCode[2] else: print 'Preparing failed.' print exitCode[2] if clean: if os.path.exists(folder): shutil.rmtree(folder) if os.path.exists(export): shutil.rmtree(export)