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

在Bash函数中执行Docker容器内pg_dump报错:目录不存在

问题解决:Docker容器内pg_dump备份函数报错“can't create : nonexistent directory”

核心原因

你遇到的问题根源在于单引号的变量解析规则:

  • 用单引号包裹sh -c的命令内容时,主机Bash不会解析其中的$table_name和$output_path变量,容器内的sh收到的是字面量的变量名,而非函数传入的实际值。
  • 这直接导致pg_dump的输出重定向变成空路径,触发“无法创建文件:不存在的目录”错误。
    另外,脚本/函数中使用docker exec -it的交互模式可能引发不必要的问题,建议移除-t参数。

修复后的函数

# @param $1 -- 要导出的表名
# @param $2 -- 导出表的文件名
function backup_table() {
  local table_name="$1"
  local output_path="/var/lib/postgresql/backups/$2"
  # 用双引号让主机先替换变量,转义容器内的$PG_USER避免被主机解析
  docker exec -i psql sh -c "pg_dump -U \$PG_USER $table_name > $output_path"
}
backup_table MY_TABLE my_table.sql

关键修改点

  1. 替换单引号为双引号:让主机Bash先解析$table_name和$output_path,将实际值传入容器的sh命令中。
  2. 转义容器内环境变量:用\$PG_USER代替$PG_USER,避免主机Bash误解析这个容器内部的环境变量,确保它在容器内被正确读取。
  3. 移除-t参数:-t用于分配伪终端,非交互式的函数/脚本中不需要这个参数,保留-i即可保证标准输入正常。

验证逻辑

修复后,主机Bash会先把命令替换成如下内容传给容器:

sh -c "pg_dump -U $PG_USER MY_TABLE > /var/lib/postgresql/backups/my_table.sql"

容器内的sh收到命令后,会正确解析$PG_USER(容器内的环境变量),并将pg_dump的输出写入容器内的指定路径(该路径已映射到主机目录,最终备份文件会出现在主机的/usr/share/postgresql/backups/下)。

内容的提问来源于stack exchange,提问作者J'e

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:12:43