我正在尝试通过容器中运行的python脚本连接到本地运行的postgres。我之所以这样进行设置,是因为将来部署后,我将使用托管数据库服务,该服务将旋转postgres。
理想情况下,我可以在.env
中定义一个postgres url,docker-compose使用env设置环境变量,然后应用程序读取postgres url。
这是最好的方法,还是我应该有一个postgres容器?
实现上述流程的最佳方法。
尝试使用本地主机,公共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连接?
答案 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
似乎可以解决问题。