在Docker容器中努力解决Django和Postgres之间的连接问题



我已经遇到以下错误一段时间了,似乎无法修复它......

django.db.utils.OperationalError: could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 5432?

多个资源表示这只是由于我DATABASES中的HOST设置,但以下是我正在使用的内容,但仍然无法使其正常工作:

DATABASES = {
'default': {
'HOST': 'db',
'ENGINE': 'django_postgrespool2',
'NAME': os.environ.get('PROJECT_HEARSAY_DB_NAME'),
'USER': os.environ.get('PROJECT_HEARSAY_DB_USER'),
'PASSWORD': os.environ.get('PROJECT_HEARSAY_DB_PASSWORD'),
'PORT': os.environ.get('PROJECT_HEARSAY_DB_PORT'),
}
}

这是我的 Django 应用程序的Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
COPY . /app
WORKDIR /app
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

这是我的Postgresql DB的Dockerfile

FROM postgres

这是我正在使用的docker-compose.yml

version: "3"
services:
postgresql:
build:
context: ./db
container_name: db.postgresql
ports:
- 5432:5432
environment:
POSTGRES_DB: "db_name"
POSTGRES_USER: "username"
POSTGRES_PASSWORD: "password"
django:
restart: always
build:
context: ./api
command:  bash -c "./manage.py migrate && ./manage.py runserver 0.0.0.0:8000"
container_name: api.django
ports:
- 8000:8000
depends_on:
- postgresql

我很好奇这里是否有人能阐明我做错了什么。

谢谢。

容器名称为db.postgresql,因此连接字符串应在主机名中db.postgresqlpostgresql

DATABASES = {
'default': {
'HOST': 'db.postgresql',
'ENGINE': 'django_postgrespool2',
'NAME': os.environ.get('PROJECT_HEARSAY_DB_NAME'),
'USER': os.environ.get('PROJECT_HEARSAY_DB_USER'),
'PASSWORD': os.environ.get('PROJECT_HEARSAY_DB_PASSWORD'),
'PORT': os.environ.get('PROJECT_HEARSAY_DB_PORT'),
}
}

您可以验证连接

docker exec api.django bash -c "nslookup db.postgresql"

你将在 Django 容器内获得 Postgres 容器 IP。

最新更新