在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
关键修改点
- 替换单引号为双引号:让主机Bash先解析
$table_name和$output_path,将实际值传入容器的sh命令中。 - 转义容器内环境变量:用
\$PG_USER代替$PG_USER,避免主机Bash误解析这个容器内部的环境变量,确保它在容器内被正确读取。 - 移除
-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
相关产品推荐
相关产品推荐

