Last active
March 31, 2020 21:57
-
-
Save pavelsr/699cb1d886f37c8e7a0939b9e9831125 to your computer and use it in GitHub Desktop.
Script for quickly moving docker volume to another server
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Script for quickly moving docker volume to another server | |
echo "List of all running docker containers" | |
docker ps --format "table {{.Names}}" | |
echo " ============================== " | |
docker ps --format='{{.Name }}' | |
# defaults | |
REMOTE_HOST='admin@193.124.205.64' | |
REMOTE_FOLDER='/home/admin/inbox/www' | |
CONTAINER='nginx' | |
read -p "Type the name of container which you want to backup, default is $CONTAINER : " input | |
CONTAINER=${input:-$CONTAINER} | |
read -p "Type the remote host details, default is $REMOTE_HOST: " input | |
REMOTE_HOST=${input:-$REMOTE_HOST} | |
read -p "Specify full path to existing remote folder, default is $REMOTE_FOLDER: " input | |
REMOTE_FOLDER=${input:-$REMOTE_FOLDER} | |
for row in $(docker inspect $CONTAINER | jq -cr '.[].Mounts[].Source'); do | |
echo "Working with volume ${row}" | |
cd ${row} | |
tar -zcvf $CONTAINER.tar.gz * | |
ssh $REMOTE_HOST "mkdir -p $REMOTE_FOLDER" | |
scp $CONTAINER.tar.gz $REMOTE_HOST:$REMOTE_FOLDER/.. | |
ssh $REMOTE_HOST "tar -xvf $REMOTE_FOLDER/../$CONTAINER.tar.gz -C $REMOTE_FOLDER" | |
done |
Author
pavelsr
commented
Jun 2, 2018
Different ways of listing running containers
docker ps --format "{{.Names}}" | sort | column # sorted by name
docker ps --format "{{.Names}}" | column # sorted by creation date
docker ps --format "table {{.Names}}\t{{.RunningFor}} ago" # sorted by creation date with its indicating
docker ps --format "table {{.Names}}\t{{.RunningFor}} ago" | sort # sorted by name
Other "bicycled" options, using tail
, cut
and awk
:
docker ps --format "{{.Names}}" | tail -n +2 | column
docker ps --format "{{.Names}}" | awk '{if(NR>1)print}' | column
docker inspect --format '{{.Name}}' $(docker ps -q) | cut -d/ -f2 | column
Move database
# Backup sql database
REMOTE_HOST='admin@193.124.205.64'
REMOTE_FOLDER='/home/admin/inbox/' # where .sql file will be stored
echo -e "${BLUE}List of all running docker containers{NC}, sorted by creation date (top is last): "
docker ps --format "table {{.Names}}\t{{.RunningFor}} ago" | sort
# docker ps --format "{{.Names}}" | sort | column
# defaults
# to-do:
# auto (filtering to) add default CONTAINER name when grep all running containers by parent image, it must contains mysql, mariadb or so
# autocomplete container names
CONTAINER='mysql'
read -p "Type the name of SQL container which you want to backup, default is $CONTAINER : " input
CONTAINER=${input:-$CONTAINER}
MYSQL_ROOT_PASSWORD=$(docker inspect $CONTAINER | jq -r '.[].Config.Env[]' | grep -P "^MYSQL_ROOT_PASSWORD" | cut -d= -f2)
MYSQL_DATABASE=$(docker inspect $CONTAINER | jq -r '.[].Config.Env[]' | grep -P "^MYSQL_DATABASE" | cut -d= -f2)
MYSQL_USER=$(docker inspect $CONTAINER | jq -r '.[].Config.Env[]' | grep -P "^MYSQL_USER" | cut -d= -f2)
MYSQL_PASSWORD=$(docker inspect $CONTAINER | jq -r '.[].Config.Env[]' | grep -P "^MYSQL_PASSWORD" | cut -d= -f2)
if [ -z "${MYSQL_USER}" ]; then
MYSQL_USER=root
fi
if [ -z "${MYSQL_PASSWORD}" ]; then
MYSQL_PASSWORD=$MYSQL_ROOT_PASSWORD
fi
read -p "Type the remote host details, default is $REMOTE_HOST: " input
REMOTE_HOST=${input:-$REMOTE_HOST}
# TODO: list of dirs after logging ssh
read -p "Specify full path to existing remote folder, default is $REMOTE_FOLDER: " input
REMOTE_FOLDER=${input:-$REMOTE_FOLDER}
docker exec $CONTAINER sh -c "exec /usr/bin/mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE" > backup.sql
ssh $REMOTE_HOST "mkdir -p $REMOTE_FOLDER"
scp backup.sql $REMOTE_HOST:$REMOTE_FOLDER
rm backup.sql
TO-DO: write an installator like for docker:
local example
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
or without inspection:
curl -sSL https://get.docker.io/ubuntu/ | sudo sh
curl -sSL https://get.docker.com/ | sh # if you have admin privileges
Docker-compose for auto-importing backup.sql:
version: '2'
services:
opencart:
restart: always
image: vimagick/opencart
networks:
- proxy-tier
volumes:
- ${PWD}/www:/var/www/html
environment:
VIRTUAL_HOST: fabmarkt.ru
VIRTUAL_PORT: 80
LETSENCRYPT_HOST: fabmarkt.ru
LETSENCRYPT_EMAIL: p@fabmarkt.ru
depends_on:
- "mysql"
mysql:
restart: always
image: mysql
networks:
- proxy-tier
volumes:
- ${PWD}/backup.sql:/docker-entrypoint-initdb.d/backup.sql
- ${PWD}/mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=opencart
networks:
proxy-tier:
external:
name: nginx-proxy
In addition to move-volume
and move-database
also need:
move-file
move-directory # move folder without compression (convenient for small folders)
move-to-user # move folders from home to home inside host
TO-DO:
quick deployment of nginx-proxy
Test database backup import:
docker run -v $(pwd)/backup.sql:/docker-entrypoint-initdb.d/backup.sql -it mysql:5.7 mysql -uroot -proot -Dopencart
error during mysql dump
InnoDB: Table flags are 0 in the data dictionary but the flags in file
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment