docker exec直接执行mysqldump未生成备份文件问题咨询
问题根因
你遇到的现象本质是Shell重定向符的解析位置差异:
当你直接在宿主机执行docker exec -i db_mysql mysqldump -u root -p wp_almond > wp_almond.sql时,命令中的>重定向操作是由宿主机当前的Shell解析执行,不会传入容器内部。这条命令的实际逻辑是:在容器内运行mysqldump -u root -p wp_almond,将命令的标准输出重定向写入宿主机当前目录的wp_almond.sql文件,容器内部自然不会生成这个文件,所以你在容器内执行ls找不到对应文件。
而你先通过docker exec -it db_mysql sh进入容器交互终端后,后续输入的所有命令都由容器内的Shell解析,这时候> wp_almond.sql的重定向操作在容器内生效,文件就会生成在容器的工作目录下。
自动化备份实现方案
根据你需要的备份文件存储位置,二选一即可,都不需要手动进入容器交互终端,适合写在自动化脚本里:
- 方案1:备份文件直接存储在宿主机(生产环境推荐)
你最开始写的命令本身逻辑就成立,只是文件保存在宿主机而非容器内,优化成非交互形式就可以直接用在脚本里:
注意:备份文件存在容器内部非挂载路径时,容器删除后备份会一并丢失,生产环境优先选这个方案,备份文件直接落在宿主机,方便后续归档、异地备份。# 备份文件直接生成在宿主机执行命令的当前目录,自动加时间戳区分版本 docker exec -i db_mysql mysqldump -u root -p"你的MySQL root密码" wp_almond > ./wp_almond_$(date +%Y%m%d_%H%M%S).sql - 方案2:备份文件需要生成在容器内部
这种场景需要显式调用容器内的Shell,把包含重定向的完整命令交给容器内的Shell解析执行:
执行完成后,就可以在容器内的# 用sh -c包裹完整备份命令,让重定向在容器内生效 docker exec -i db_mysql sh -c 'mysqldump -u root -p"你的MySQL root密码" wp_almond > /tmp/wp_almond.sql'/tmp目录下找到生成的备份文件。
脚本优化建议
- 不要在命令里明文硬编码数据库密码,可以直接读取容器内已经配置的
MYSQL_ROOT_PASSWORD环境变量,避免密码泄露在命令历史中:docker exec -i db_mysql sh -c 'mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" wp_almond' > ./wp_almond_backup.sql - 自动化脚本建议增加备份有效性校验,比如备份完成后检查文件大小、确认文件末尾存在
-- Dump completed on标识,避免生成空备份或损坏的备份文件。
内容的提问来源于stack exchange,提问作者LuisEnMarroquin
相关产品推荐
相关产品推荐

