如何从其他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
相关产品推荐
相关产品推荐

