如何通过名称访问 postgres 容器?无法翻译主机名错误

How to access a postgres container through its name? Could not translate host name error

我有一个 django 和 postgres 容器。当 django 应用迁移时,它没有看到我命名为 pgdb 的 postgres 容器,我得到这个错误:

django.db.utils.OperationalError: could not translate host name "pgdb" to address: Temporary failure in name resolution

似乎没有 docker 名为“pgdb”的容器。如果我 运行 "docker-compose 运行 pgdb" 它会在 "app" 组下创建一个名为 "app_pgdb_run_23423423" 的 postgres 容器。有趣的是,我之前使用 settings.py 设置和“pgdb”postgres 容器名称让它工作。潜在的问题是什么?

您可以从 https://github.com/UberStreuner/mailing-service

克隆完整代码

我的 settings.py 设置,环境变量绝对没有问题。

DATABASES = {
    'default': {
        'ENGINE': os.environ.get('DB_ENGINE', 'django.db.backends.postgresql_psycopg2'),
        'NAME': os.environ.get('POSTGRES_DB'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
        'HOST': os.environ.get('POSTGRES_HOST', 'pgdb'),
        'PORT': os.environ.get('POSTGRES_PORT', '5432')
    }
}

docker-compose.yml

version: "3.8"

services:
  django:
    build: .
    container_name: django
    command: ./docker-entrypoint.sh
    volumes:
      - .:/usr/src/app/
    ports:
      - "8000:8000"
    env_file:
      - ./.dev.env
    depends_on:
      - pgdb
      - redis

  celery:
    build: .
    command: celery -A mailing worker -l INFO
    volumes:
      - .:/usr/src/app/
    env_file:
      - ./.dev.env
    depends_on:
      - django
      - redis
      - pgdb

  celery-beat:
    build: .
    command: celery -A mailing beat -l INFO
    volumes:
      - .:/usr/src/app/
    env_file:
      - ./.dev.env
    depends_on:
      - django
      - redis
      - pgdb

  pgdb:
    image: postgres
    container_name: pgdb
    env_file:
      - ./.dev.env
    volumes:
      - pgdata:/var/lib/postgresql/data
    expose:
      - "5432"
    ports:
      - "5432:5432"

  redis:
    image: "redis:alpine"

volumes:
  pgdata:

.dev.env

SECRET_KEY=django-insecure-kh8ot+ag-^osyhg5itzj!iw_g#dklw3f75c0)^-7)*@^)#tc#x
DEBUG=1

DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1
CELERY_BROKER=redis://redis:6379/0
CELERY_BACKEND=redis://redis:6379/0

POSTGRES_DB=django_postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password

docker-entrypoint.sh

#!/bin/bash
python manage.py migrate
python manage.py runserver 0.0.0.0:8000

我解决了这个问题。 这可能是因为我从 python-dotenv 到 .dev.env 文件以及从 docker-compose 导入 Django 的环境变量,其中它作为 env_file 传递。所以我注释掉了从 settings.py 加载的 dotenv,它起作用了。