Bash 将数据库恢复到 Wordpress + Piwik 解决方案的 docker 容器

Bash restore database to a docker container for a Wordpress + Piwik Solution

对于 https://github.com/ellakcy/piwik-with-wordpress I am making a restore bash script in order to restore the backup generated from the https://github.com/ellakcy/piwik-with-wordpress/blob/master/scripts/pre-backup 脚本

主要想法是设置一个包含备份的 tarball 的路径,并重新创建安装卷的文件夹。

脚本如下:

#!/bin/bash

# Printing functions
black='\E[30;40m'
red='\E[31;40m'
green='\E[32;40m'
yellow='\E[33;40m'
blue='\E[34;40m'
magenta='\E[35;40m'
cyan='\E[36;40m'
white='\E[37;40m'

#Echo a string with color
cecho ()                     # Color-echo.
                             # Argument  = message
                             # Argument  = color
{
local default_msg="No message passed."
                             # Doesn't really need to be a local variable.

message=${1:-$default_msg}   # Defaults to default message.
color=${2:-$black}           # Defaults to black, if not specified.

  echo -e "$color"
  echo "$message"
  tput sgr0                      # Reset to normal.

  return
}

#Echo a string as error with color
cecho_err ()                     # Color-echo.
                             # Argument  = message
                             # Argument  = color
{
local default_msg="No message passed."
                             # Doesn't really need to be a local variable.

message=${1:-$default_msg}   # Defaults to default message.
color=${2:-$red}           # Defaults to black, if not specified.

  echo >&2 -e "$color"
  echo >&2 "$message"
  tput sgr0                      # Reset to normal.

  return
}

backup_file=


cecho "Creating the correct folders" $cyan

cecho "Deleting data folder in order to recreate it" $red
sudo rm -rf ./data

mkdir ./data/
sudo chown root:root ./data/
sudo chmod 755 ./data/


if [ ! -f restore ]; then
  mkdir ./restore/
fi


tar -xf ${backup_file} -C ./restore/

cecho "Restoring backup data for wordpress" $cyan

sudo mkdir ./data/wordpress
sudo chown root:root ./data/wordpress
sudo chmod 755 ./data/wordpress

sudo mv ./restore/wordpress/data/www ./data/wordpress/
sudo chown www-data:www-data ./data/wordpress/www

cecho "Restoring environment" $cyan
wordpress_env=$(tr '\n' ' ' <./restore/wordpress/env.txt)
echo ${wordpress_env}
cecho "Restoring database" $cyan
sudo mkdir ./data/wordpress/db
echo "sudo env ${wordpress_env} docker run --volume \"./data/wordpress/db\":/var/lib/mysql --volume ./restore/wordpress/db:/docker-entrypoint-initdb.d  -e MYSQL_ROOT_PASSWORD=$WORDPRESS_MYSQL_ROOT_PASSWORD -e MYSQL_DATABASE=\"wordpress\" -e MYSQL_USER=$WORDPRESS_MYSQL_USER -e MYSQL_PASSWORD=$WORDPRESS_MYSQL_PASSWORD mariadb" > ./restore_db.sh
chmod +x ./restore_db.sh
./restore_db.sh
# rm -rf ./restore_db.sh

rm -rf ./restore

当我尝试还原数据库时出现此错误:

docker: Error response from daemon: create ./data/wordpress/db: "./data/wordpress/db" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. See 'docker run --help'.

如您所见,它会生成一个临时脚本(稍后将被删除)生成脚本的一个示例是:

sudo env  WORDPRESS_MYSQL_ROOT_PASSWORD=passwd WORDPRESS_MYSQL_USER=wordpress WORDPRESS_MYSQL_PASSWORD=wordpress WORDPRESS_ADMIN_USER=admin WORDPRESS_ADMIN_PASSWORD=admin WORDPRESS_URL=http://0.0.0.0:8080  docker run --volume "./data/wordpress/db":/var/lib/mysql --volume ./restore/wordpress/db:/docker-entrypoint-initdb.d  -e MYSQL_ROOT_PASSWORD=$WORDPRESS_MYSQL_ROOT_PASSWORD -e MYSQL_DATABASE="wordpress" -e MYSQL_USER=$WORDPRESS_MYSQL_USER -e MYSQL_PASSWORD=$WORDPRESS_MYSQL_PASSWORD mariadb

为了在装载在容器 /var/lib/mysql 上的 ./data/wordpress/db 中生成正确的卷数据,最佳选择是什么? ?

当我们指定--volume <host_dir>:<container_dir>时,host_dir必须是绝对路径。如果它不是绝对路径,则它被认为是卷的名称。因此消息 invalid characters for a local volume name。尝试提供主机目录的绝对路径。