Docker容器中MySQL执行mysqldump无法创建备份文件的问题求助
解决Docker容器内MySQL数据导出问题
问题根源
你执行的docker exec命令中,>重定向是宿主机Shell的操作,而非容器内部的命令行为:
- 当你写
> /opt/backup/my_db.sql时,宿主机尝试在自身的/opt/backup目录创建文件,若该目录不存在就会报错; - 若导出到当前目录或
/tmp,文件实际生成在宿主机的对应路径,而非容器内,所以你在容器里找不到。
可行解决方案
方案1:让重定向在容器内部执行
用sh -c将mysqldump命令和重定向逻辑整体封装,交给容器内的Shell执行,这样文件会写入容器内的/opt/backup(对应宿主机的./backup):
sudo docker exec mysql sh -c 'mysqldump -u root -p123456 --no-tablespaces --databases my_db > /opt/backup/my_db.sql'
方案2:直接重定向到宿主机的挂载目录
利用Docker卷挂载的同步关系,直接将输出写入宿主机的./backup目录(与容器内/opt/backup绑定):
sudo docker exec mysql mysqldump -u root -p123456 --no-tablespaces --databases my_db > ./backup/my_db.sql
执行后直接去宿主机当前目录的backup文件夹找导出文件即可。
方案3:先导出到容器临时目录,再复制到宿主机
如果前两种方案有权限问题,可先将文件导出到容器的/tmp(默认有写入权限),再用docker cp复制到宿主机:
# 容器内导出到临时目录 sudo docker exec mysql mysqldump -u root -p123456 --no-tablespaces --databases my_db > /tmp/my_db.sql # 复制到宿主机指定目录 sudo docker cp mysql:/tmp/my_db.sql ./backup/
额外注意事项
确保宿主机的./backup目录权限与容器用户匹配,避免写入失败:
sudo chown 115:115 ./backup
内容的提问来源于stack exchange,提问作者eastwater
相关产品推荐
相关产品推荐

