无法将python应用程序容器连接到本地Postgres

时间:2019-08-08 01:44:22

标签: python postgresql docker

我正在尝试通过容器中运行的python脚本连接到本地运行的postgres。我之所以这样进行设置,是因为将来部署后,我将使用托管数据库服务,该服务将旋转postgres。

理想情况下,我可以在.env中定义一个postgres url,docker-compose使用env设置环境变量,然后应用程序读取postgres url。

  1. 这是最好的方法,还是我应该有一个postgres容器?

  2. 实现上述流程的最佳方法。

尝试使用本地主机,公共ip,本地ip在.env中传递POSTGRES_URL。例如:postgresql://用户名:密码@localhost:5432 / dbname

version: "3.7"

services:
  app:
    build:
      context: ./
      dockerfile: Dockerfile
    volumes:
      - "./:/usr/src/app"
    environment:
      - ENV=${ENV}
      - LOGS=${LOGS}
      - AWS_REGION=${AWS_REGION}
      - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
      - POSTGRES_URL=${POSTGRES_URL}

预期:成功连接到本地数据库。

实际: 服务器是否在主机<“ ip”>上运行并接受 端口5432上的TCP / IP连接?

3 个答案:

答案 0 :(得分:0)

容器中的

localhost表示容器本身,而不是Docker主机。如果您使用localhost访问postgres,它将尝试在容器中查找服务,但是该容器实际上没有db服务。您应该为本地postgres设置docker host ip。

例如如果您的Docker主机IP为10.192.225.111,则POSTGRES_URL中的.env应该是:

postgresql://username:password@10.192.225.111:5432/dbname

答案 1 :(得分:0)

我会像这样在docker-compose中使用一个postgres容器:

  db:
    image: postgres:11.4
    ports:
      # In order to connect to the database from the host
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=pw
      - POSTGRES_USER=user

在此示例中,您将填写用户名和密码以开始您的容器。

docker-compose.yml文件中添加此文件后,您的应用容器将能够通过服务名称访问数据库容器。在此示例中,它将为db。因此您的连接字符串为postgresql://user:pw@db:5432/dbname

答案 2 :(得分:0)

好吧,所以对于使用Mac作为开发机器的人来说,应该提到这一点,以解决同样的问题。 mac的docker主机IP总是在变化。

将我的.env postgres网址更改为:

postgresql://username:password@docker.for.mac.localhost:5432/dbname

似乎可以解决问题。