Docker下Python连接Postgres容器无法查询验证数据问题
问题根因
- 你在database目录的Dockerfile中显式配置了
POSTGRES_USER=apps7_user,官方Postgres镜像一旦设置该环境变量,就不会创建默认的postgres超级用户,因此你用postgres用户登录肯定会报「角色不存在」错误。 - 你之前尝试的
psql -d apps7_user -U apps7命令参数完全写反:-U后面要跟用户名,-d后面要跟数据库名,参数值错了自然无法登录。 - 你在单独的
postgre-container容器中找不到项目数据是正常现象:两个容器是完全隔离的运行环境,数据不互通,Python脚本写入的是compose启动的apps7_ad_network-db-1容器内的数据库,和你之前自建的postgres容器没有任何关联。
现有环境下查询numbers表的正确操作
直接在宿主机执行以下命令,无需进入容器bash就能直接连入db容器的psql交互行:
docker exec -it apps7_ad_network-db-1 psql -U apps7_user -d apps7_db
连接成功后:
- 执行
\dt即可查看当前库下的所有表,确认numbers表是否存在 - 执行
SELECT * FROM numbers;即可查询表内插入的所有数据
该连接方式不需要输入密码:你在镜像构建时设置的
POSTGRES_USER和POSTGRES_DB和命令参数完全匹配,本地套接字连接默认走信任认证。
可选配置调整方案
方案1:给当前项目的数据库新增postgres用户
先通过上面的正确命令登录psql,执行以下SQL即可创建postgres超级用户:
CREATE USER postgres WITH SUPERUSER PASSWORD '自定义你的postgres用户密码';
执行完成后就可以用postgres用户正常登录该数据库实例。
方案2:将项目对接你已有的postgre-container容器
操作步骤如下:
- 修改根目录的
docker-compose.yml,删除整个db服务配置块,同时给app服务添加外部网络配置,保证app容器能和你已有的postgres容器通信:
version: "3.8" services: app : build: ./app/ networks: - existing_pg_net networks: existing_pg_net: external: name: 你的postgre-container所在的docker网络名称
如果你不知道已有postgres容器的网络名,可以执行
docker inspect postgre-container | grep NetworkMode查看对应网络。
- 修改
app/app.py中的数据库连接参数,和你已有postgre-container的配置对齐:
db_name = 'postgres' # 或者你提前在已有容器中创建的业务库名 db_user = 'postgres' db_pass = '你的postgre-container配置的postgres用户密码' db_host = 'postgre-container' # 填写你已有postgres容器的名称 db_port = '5432'
- 重新执行
docker-compose up --build启动服务即可,脚本写入的数据会直接落到你平时用postgres用户可正常访问的postgre-container中。
内容的提问来源于stack exchange,提问作者punky
相关产品推荐
相关产品推荐

