Docker MySQL Clone Script
Dieses kleine Script ermöglicht es eine MySQL oder MariaDB Datenbank von einem zum anderen Container zu übertragen. Man könnte auch beide Container ausschalten und dann mit dem Docker Volume Clone Script die Volumes übertragen, bei dieser Lösung bleiben die Container online. Das Script nutzt mysqldump
bzw. mariadb-dump
im Source (Quellen) Container und gibt den Output direkt an den Destination (Ziel) Container mittels Pipe an den mysql
bzw. mariadb
Client weiter.
Script
/usr/local/sbin/clone-docker-mysql.sh
#!/usr/bin/env bash
#########################################################################
#Name: clone-docker-mysql.sh
#Subscription: This Script copies MySQL DB from Container A to Container B
##by A. Laub
#andreas[-at-]laub-home.de
#
#License:
#This program is free software: you can redistribute it and/or modify it
#under the terms of the GNU General Public License as published by the
#Free Software Foundation, either version 3 of the License, or (at your option)
#any later version.
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
#or FITNESS FOR A PARTICULAR PURPOSE.
#########################################################################
#Set the language
export LANG="en_US.UTF-8"
#Load the Pathes
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# set the variables
### Do the stuff
if [ "$1" = "" -o "$2" = "" ]; then
echo -e "Usage: ${0} { SourceMySQLContainer } { DestinationMySQLContainer }\n"
echo -e ' use: "docker ps"\n for a list of all available docker container\n'
exit
fi
docker container inspect $1 > /dev/null 2>&1
if [ "$?" != "0" ]
then
echo "The source database container \"$1\" does not exist"
exit
fi
docker container inspect $2 > /dev/null 2>&1
if [ "$?" != "0" ]
then
echo "The source database container \"$2\" does not exist"
exit
fi
# copy the database
MYSQL_DATABASE=$(docker exec $1 env | grep MYSQL_DATABASE |cut -d"=" -f2)
SOURCE_MYSQL_PWD=$(docker exec $1 env | grep MYSQL_ROOT_PASSWORD |cut -d"=" -f2)
DEST_MYSQL_PWD=$(docker exec $2 env | grep MYSQL_ROOT_PASSWORD |cut -d"=" -f2)
echo -e " * Copying $MYSQL_DATABASE DB from $1 to $2 ...";
if docker exec -it $1 test -e /usr/bin/mysqldump; then
docker exec -e MYSQL_DATABASE=$MYSQL_DATABASE -e MYSQL_PWD=$SOURCE_MYSQL_PWD \
$1 /usr/bin/mysqldump -u root $MYSQL_DATABASE |\
docker exec -i -e MYSQL_DATABASE=$MYSQL_DATABASE -e MYSQL_PWD=$DEST_MYSQL_PWD \
$2 /usr/bin/mysql -u root $MYSQL_DATABASE
elif docker exec -it $1 test -e /usr/bin/mariadb-dump; then
docker exec -e MYSQL_DATABASE=$MYSQL_DATABASE -e MYSQL_PWD=$SOURCE_MYSQL_PWD \
$1 /usr/bin/mariadb-dump -u root $MYSQL_DATABASE |\
docker exec -i -e MYSQL_DATABASE=$MYSQL_DATABASE -e MYSQL_PWD=$DEST_MYSQL_PWD \
$2 /usr/bin/mariadb -u root $MYSQL_DATABASE
else
echo " ERROR: cannot find dump command for container $1!"
fi
echo "DONE!"
Nun noch das Execute Recht vergeben und es kann losgehen.
chmod +x /usr/local/sbin/clone-docker-mysql.sh
Die Syntax ist einfach
clone-docker-mysql.sh SourceMySQLContainerName DestinationMySQLContainerName
solltet ihr die Namen nicht kennen, der folgende Befehl listet alle Verfügbaren Container auf:
docker ps