如何通过名称访问 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,它起作用了。
我有一个 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,它起作用了。