我尝试将我的django应用程序进行docker化, 这是我的docker-compose.yml:
version: '3'
networks:
mynetwork:
driver: bridge
services:
postgres:
restart: always
image: postgres:11
ports:
- "5432:5432"
volumes:
- ./data:/var/lib/postgresql/data
web:
build: .
command: python /Code/core/manage.py runserver 0.0.0.0:8000
networks:
- mynetwork
ports:
- "8000:8000"
depends_on:
- postgres
在我的django应用程序中的,在我的settings.py中,我具有用于数据库连接的以下参数: settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydbname',
'USER': 'mydbuser',
'PASSWORD': 'mydbpassword',
'HOST': '127.0.0.1',
'PORT': '5432',
'OPTIONS': {
'client_encoding': 'UTF8',
},
}
}
这是我跑步的时候
docker-compose build
al已经完成,但是当我这样做时:
docker-compose up
我收到此错误:
conn = _connect(dsn,connection_factory = connection_factory,** kwasync) web_1 | psycopg2.OperationalError:无法连接到服务器:连接被拒绝 web_1 |服务器是否在主机“ 127.0.0.1”上运行并接受 web_1 |端口5432上的TCP / IP连接?
如何使用docker postgres映像管理django数据库连接参数?
非常感谢
答案 0 :(得分:0)
在docker-compose中,您可以利用docker-compose网络。您可以根据容器名称进行服务之间的通信。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydbname',
'USER': 'mydbuser',
'PASSWORD': 'mydbpassword',
'HOST': 'postgres',
'PORT': '5432',
'OPTIONS': {
'client_encoding': 'UTF8',
},
}
}
在连接中,当您使用127.0.0.1
时,它引用的是Web-app的本地主机,而不是@Michalk在评论中提及的postgress。
答案 1 :(得分:0)
您应该将数据库设置的host
更改为postgres
,因为这是docker-compose
中的服务名称。在内部docker-compose将创建一个网络并将容器连接到该网络。在docker-compose中定义的服务名称将是映射到容器IP的DNS名称:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydbname',
'USER': 'mydbuser',
'PASSWORD': 'mydbpassword',
'HOST': 'postgres',
'PORT': '5432',
'OPTIONS': {
'client_encoding': 'UTF8',
},
}
}
还请记住,depends_on
不会确保在应用程序容器尝试访问数据库之前完全初始化数据库。我共享的链接中也有记录:
depends_on
在启动Web之前不会等待db和redis处于“就绪”状态-仅在它们启动之前。如果您需要等待服务准备就绪,请参阅Controlling startup order,以获取有关此问题的更多信息以及解决方案。