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

如何从其他Docker容器运行psql?含容器配置与脚本报错问题

解决方案:通过Docker容器执行psql命令

当然可以!既然你的PostgreSQL已经运行在Docker容器里,直接用容器自带的psql工具是最省心的方案——完全不用在本地安装PostgreSQL客户端。我帮你修改一下脚本,把所有本地psql命令替换成通过docker exec调用容器内工具的方式:

修改后的完整脚本

#!/bin/bash
# 从生产环境拉取备份到本地临时文件
ssh -p 22000 -C -l user host 'sh /project/copy_prod.sh' > /tmp/backup.sql

# 通过Docker容器执行数据库删除与创建操作
docker exec -i k4fntr_database psql -U ${DB_USERNAME} -d postgres << EOF
DROP DATABASE IF EXISTS prod_copy;
CREATE DATABASE prod_copy OWNER k4fntr;
EOF

# 将本地备份文件导入到容器内的目标数据库
cat /tmp/backup.sql | docker exec -e PGPASSWORD=${DB_PASSWORD} -i k4fntr_database psql -U ${DB_USERNAME} -d prod_copy

# 可选:清理临时备份文件
rm /tmp/backup.sql

关键修改点说明

  • docker exec -i:用-i参数保持标准输入打开,这样可以通过管道或here-doc向容器内的psql传递命令/数据,适合脚本的非交互式执行
  • 环境变量传递:通过-e PGPASSWORD=${DB_PASSWORD}把你docker-compose里配置的数据库密码传递给容器,避免psql弹出交互密码提示
  • Here-doc语法:用<< EOF包裹多条SQL命令,比echo管道更清晰易读,也能避免命令转义的问题
  • 本地文件导入:用cat /tmp/backup.sql | ...把本地备份文件的内容直接传递到容器内的psql,不用把文件复制到容器里

额外小技巧

  • 如果你想验证导入是否成功,可以在脚本末尾加一行命令检查:
    docker exec k4fntr_database psql -U ${DB_USERNAME} -d prod_copy -c "SELECT version();"
    
  • 确保当前用户有权限执行docker命令,如果遇到权限问题,可以在docker exec前加sudo,或者把当前用户加入docker组(需要重启终端生效)

内容的提问来源于stack exchange,提问作者Viktor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:09:06