Skip to content

Instantly share code, notes, and snippets.

@pavelsr
Last active March 31, 2020 21:57
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pavelsr/699cb1d886f37c8e7a0939b9e9831125 to your computer and use it in GitHub Desktop.
Save pavelsr/699cb1d886f37c8e7a0939b9e9831125 to your computer and use it in GitHub Desktop.
Script for quickly moving docker volume to another server
# 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
@pavelsr
Copy link
Author

pavelsr commented Jun 2, 2018

CONTAINER='nginx'
MYSQL_USER='root'
MYSQL_ROOT_PASSWORD=$(docker inspect $CONTAINER | jq -r '.[].Config.Env[]' | grep -Eo "^MYSQL_ROOT_PASSWORD=(\S+)" | cut -f)
# MYSQL_ROOT_PASSWORD
# MYSQL_DATABASE
# MYSQL_USER, MYSQL_PASSWORD

REMOTE_HOST='admin@193.124.205.64'
REMOTE_FOLDER='/home/admin/inbox/www'

read -p "Type the name of SQL container which you want to backup, default is $CONTAINER : " input
CONTAINER=${input:-$CONTAINER}

docker exec $CONTAINER sh -c "exec /usr/bin/mysqldump -uroot -pfab14france wordpress" > backup.sql

@pavelsr
Copy link
Author

pavelsr commented Jun 3, 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

@pavelsr
Copy link
Author

pavelsr commented Jun 3, 2018

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

@pavelsr
Copy link
Author

pavelsr commented Jun 3, 2018

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

@pavelsr
Copy link
Author

pavelsr commented Jun 3, 2018

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

@pavelsr
Copy link
Author

pavelsr commented Jun 3, 2018

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

https://bitbucket.org/serikov/nginx-proxy/src/master/

@pavelsr
Copy link
Author

pavelsr commented Jun 3, 2018

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