为什么mysql备份没有恢复到我的docker容器?

我想dockerize mysql数据库。 我有.sh脚本准备环境,创build数据库,用户和其他东西。 Mysql dump restore命令不能在我的.sh脚本中工作,但是如果我打开容器shell和exec命令,它工作得很好。 我想在我的.sh脚本中使用命令。

我的脚本有什么问题?

Dockerfile:

FROM alpine:latest WORKDIR /app COPY startup.sh /startup.sh COPY backup.sql /app/ RUN apk add --update mysql mysql-client && rm -f /var/cache/apk/* COPY my.cnf /etc/mysql/my.cnf EXPOSE 3306 

startup.sh:

 #!/bin/sh if [ -d /app/mysql ]; then echo "[i] MySQL directory already present, skipping creation" else echo "[i] MySQL data directory not found, creating initial DBs" mysql_install_db --user=root > /dev/null if [ "$MYSQL_ROOT_PASSWORD" = "" ]; then MYSQL_ROOT_PASSWORD=111111 echo "[i] MySQL root Password: $MYSQL_ROOT_PASSWORD" fi MYSQL_DATABASE=myDb if [ ! -d "/run/mysqld" ]; then mkdir -p /run/mysqld fi tfile=`mktemp` if [ ! -f "$tfile" ]; then return 1 fi cat << EOF > $tfile EOF if [ "$MYSQL_DATABASE" != "" ]; then echo "[i] Creating database: $MYSQL_DATABASE" echo "FLUSH PRIVILEGES;" >> $tfile echo "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;" >> $tfile echo "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;" echo "CREATE USER 'myuser'@'localhost' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" >> $tfile echo "CREATE USER 'myuser'@'localhost' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" echo "CREATE USER 'myuser'@'%' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" >> $tfile echo "CREATE USER 'myuser'@'%' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'localhost' WITH GRANT OPTION;" >> $tfile echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'localhost' WITH GRANT OPTION;" echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'%' WITH GRANT OPTION;" >> $tfile echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'%' WITH GRANT OPTION;" echo "FLUSH PRIVILEGES;" >> $tfile fi /usr/bin/mysqld --user=root --bootstrap --verbose=0 < $tfile rm -f $tfile fi exec /usr/bin/mysqld --user=root --console mysql -u root myDb < backup.sql # THIS LINE NOT WORKING! WHY ? 

当容器启动时,你实际上并没有执行你的脚本。 我不确定你想用这个做什么,我不应该要求澄清,所以我会尽我所能回答,并希望这有助于。

尝试像这样:

Dockerfile

 FROM alpine:latest WORKDIR /app COPY startup.sh /startup.sh COPY backup.sql /app/ RUN apk add --update mysql mysql-client && rm -f /var/cache/apk/* COPY my.cnf /etc/mysql/my.cnf EXPOSE 3306 ENTRYPOINT ["/startup.sh"] CMD /bin/bash -c "/usr/bin/mysqld --user=root --console && mysql -u root myDb < backup.sql" 

然后,你可以像这样修改你的启动脚本:

startup.sh

 #!/bin/sh if [ -d /app/mysql ]; then echo "[i] MySQL directory already present, skipping creation" else echo "[i] MySQL data directory not found, creating initial DBs" mysql_install_db --user=root > /dev/null if [ "$MYSQL_ROOT_PASSWORD" = "" ]; then MYSQL_ROOT_PASSWORD=111111 echo "[i] MySQL root Password: $MYSQL_ROOT_PASSWORD" fi MYSQL_DATABASE=myDb if [ ! -d "/run/mysqld" ]; then mkdir -p /run/mysqld fi tfile=`mktemp` if [ ! -f "$tfile" ]; then return 1 fi cat << EOF > $tfile EOF if [ "$MYSQL_DATABASE" != "" ]; then echo "[i] Creating database: $MYSQL_DATABASE" echo "FLUSH PRIVILEGES;" >> $tfile echo "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;" >> $tfile echo "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;" echo "CREATE USER 'myuser'@'localhost' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" >> $tfile echo "CREATE USER 'myuser'@'localhost' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" echo "CREATE USER 'myuser'@'%' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" >> $tfile echo "CREATE USER 'myuser'@'%' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'localhost' WITH GRANT OPTION;" >> $tfile echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'localhost' WITH GRANT OPTION;" echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'%' WITH GRANT OPTION;" >> $tfile echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'%' WITH GRANT OPTION;" echo "FLUSH PRIVILEGES;" >> $tfile fi /usr/bin/mysqld --user=root --bootstrap --verbose=0 < $tfile rm -f $tfile fi exec "$@" 

看看Dockerfiledocker-entrypoint.sh在官方的mysql Docker镜像 docker-entrypoint.sh中的设置方式。

尝试用于Docker Container的备份和还原的直升机。

https://github.com/frekele/helicopterizer