在Docker容器内的Django和Postgres之间的连接方面苦苦挣扎

时间:2019-10-02 19:42:16

标签: django postgresql docker docker-compose

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

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?

多种资源表明,这完全是由于我的HOST中的DATABASES设置造成的,但是以下是我正在使用的内容,但仍然无法使它起作用:

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数据库的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

我很好奇,是否有人可以阐明我在做错什么。

谢谢。

1 个答案:

答案 0 :(得分:2)

您的容器名称为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。