如何在Docker容器中无需终端输入密码恢复MySQL备份文件
解决Docker中MySQL 8.0恢复备份的警告与语法错误问题
方案一:屏蔽警告避免干扰SQL输入
原命令的密码警告会被当作SQL内容传入导致语法错误,只需将错误输出重定向到/dev/null即可:
docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" 2>/dev/null' < all-databases.sql
2>/dev/null会丢弃命令行密码的警告信息(stderr),使其不会进入mysql的输入流,从而避免触发SQL语法错误。
方案二:正确配置客户端my.cnf文件
你之前的my.cnf配置段错误,mysql客户端默认读取[client]段而非[user]段,修正后步骤如下:
- 本地创建正确的my.cnf文件:
# /path/to/local/my.cnf [client] user=root password=root host=localhost
- 将文件复制到容器内:
docker cp /path/to/local/my.cnf some-mysql:/etc/mysql/my.cnf
- 重启容器使配置生效:
docker restart some-mysql
- 执行备份恢复(无需命令行输入密码):
docker exec -i some-mysql mysql < all-databases.sql
方案三:利用宿主机mysql_config_editor生成登录凭据
若容器内缺少mysql_config_editor工具,可借助宿主机的工具生成登录配置文件,再复制到容器:
- 宿主机安装与容器MySQL 8.0匹配的mysql-client,执行:
mysql_config_editor set --login-path=client --user=root --password --host=localhost
执行后按提示输入root密码,工具会在~/.mylogin.cnf生成加密的凭据文件。
2. 将该文件复制到容器的root用户目录:
docker cp ~/.mylogin.cnf some-mysql:/root/.mylogin.cnf
- 执行备份恢复:
docker exec -i some-mysql mysql --login-path=client < all-databases.sql
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

