Docker容器中Postgres数据库pg_dump外部执行失败求助
解决Docker容器内Postgres备份命令失败的问题
你的问题核心是重定向符号>是由宿主机的shell处理的,而非容器内部的shell。你指定的/pg-snaps目录只存在于容器内,宿主机找不到这个路径,所以才会报"no such file or directory"错误。
下面给两种可行的解决方案:
方案一:让容器内部处理重定向
把整个备份命令交给容器内的shell执行,让容器自己完成文件写入操作。用sh -c包裹完整命令,注意使用单引号,防止宿主机提前解析变量:
docker exec <container> sh -c 'pg_dump -U postgres <mydb> > /pg-snaps/<mydb>_$(date +%Y%m%d_%H%M%S).sql'
这里给date指定了明确的格式,避免文件名出现空格或特殊字符,后续写定时脚本时也更规范。
方案二:将备份文件直接存到宿主机(推荐用于定时备份)
如果希望备份文件直接保存在宿主机方便管理,先确保容器启动时已经把宿主机的某个目录挂载到容器内的/pg-snaps:
# 若容器未挂载目录,重启时添加挂载参数 docker run -d -v /宿主机本地/备份目录:/pg-snaps ... <postgres-image>
之后执行备份命令时,让宿主机处理重定向,直接写到宿主机的挂载目录:
docker exec <container> pg_dump -U postgres <mydb> > /宿主机本地/备份目录/<mydb>_$(date +%Y%m%d_%H%M%S).sql
额外注意事项
- 用crontab写定时脚本时,
date最好写全路径(比如/bin/date),避免crontab的极简环境找不到命令; - 确保容器内的
postgres用户对/pg-snaps目录有写权限; - 若备份文件体积较大,可配合
gzip压缩:# 方案一压缩版 docker exec <container> sh -c 'pg_dump -U postgres <mydb> | gzip > /pg-snaps/<mydb>_$(date +%Y%m%d_%H%M%S).sql.gz'
内容的提问来源于stack exchange,提问作者PandaPhi
相关产品推荐
相关产品推荐

