You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:10:26