【问题标题】:Django Docker: django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not knownDjango Docker:django.db.utils.OperationalError:无法将主机名“db”转换为地址:名称或服务未知
【发布时间】:2020-10-03 07:19:38
【问题描述】:

我是 Docker 和 Postgres 的新手,我正在关注 William S. Vincent 的“专业 Django”一书来学习这一点。我正在尝试使用 Docker 容器连接到 PostgreSQL。

我做了什么:

1> 编写的 Docker 文件:

# Pull base image
FROM python:3.7
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Set work directory
WORKDIR /code
# Install dependencies
COPY Pipfile Pipfile.lock /code/
RUN pip install pipenv && pipenv install --system
# Copy project
COPY . /code/

2> 编写 docker-compose.yml 文件:

version: "3.7"

services:
  web:
    build: .
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - 8000:8000
    depends_on:
      - db
  db:
    image: postgres:11

3> 更改设置.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',docker-compose up -d --build
        'PORT': 5432
    }
}

4> 安装 psycopg2

docker-compose exec web pipenv install psycopg2-binary==2.8.3

5> 运行 docker-compose 重建镜像:

docker-compose up -d --build

当我检查 docker-compose 日志时会引发错误:

Attaching to postgresql_web_1, postgresql_db_1
web_1  | Watching for file changes with StatReloader
web_1  | Performing system checks...
web_1  |
web_1  | System check identified no issues (0 silenced).
web_1  | Exception in thread django-main-thread:
web_1  | Traceback (most recent call last):
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 217, in ensure_connection
web_1  |     self.connect()
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 195, in connect
web_1  |     self.connection = self.get_new_connection(conn_params)
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/backends/postgresql/base.py", line 178, in get_new_connection
web_1  |     connection = Database.connect(**conn_params)
web_1  |   File "/usr/local/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
web_1  |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
web_1  | psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known
web_1  |
web_1  |
web_1  | The above exception was the direct cause of the following exception:
web_1  | 
web_1  | Traceback (most recent call last):
web_1  |   File "/usr/local/lib/python3.7/threading.py", line 926, in _bootstrap_inner
web_1  |     self.run()
web_1  |   File "/usr/local/lib/python3.7/threading.py", line 870, in run
web_1  |     self._target(*self._args, **self._kwargs)
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/utils/autoreload.py", line 54, in wrapper
web_1  |     fn(*args, **kwargs)
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 120, in inner_run
web_1  |     self.check_migrations()
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 453, in check_migrations
web_1  |     executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/migrations/executor.py", line 18, in __init__
web_1  |     self.loader = MigrationLoader(self.connection)
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/migrations/loader.py", line 49, in __init__
web_1  |     self.build_graph()
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/migrations/loader.py", line 212, in build_graph
web_1  |     self.applied_migrations = recorder.applied_migrations()
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/migrations/recorder.py", line 73, in applied_migrations
web_1  |     if self.has_table():
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/migrations/recorder.py", line 56, in has_table
web_1  |     return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 256, in cursor
web_1  |     return self._cursor()
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 233, in _cursor
web_1  |     self.ensure_connection()
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 217, in ensure_connection
web_1  |     self.connect()
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/utils.py", line 89, in __exit__
web_1  |     raise dj_exc_value.with_traceback(traceback) from exc_value
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 217, in ensure_connection
web_1  |     self.connect()
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 195, in connect
web_1  |     self.connection = self.get_new_connection(conn_params)
web_1  |   File "/usr/local/lib/python3.7/site-packages/django/db/backends/postgresql/base.py", line 178, in get_new_connection
web_1  |     connection = Database.connect(**conn_params)
web_1  |   File "/usr/local/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
web_1  |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
web_1  | django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known
db_1   | Error: Database is uninitialized and superuser password is not specified.
db_1   |        You must specify POSTGRES_PASSWORD to a non-empty value for the
db_1   |        superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
db_1   |
db_1   |        You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
db_1   |        connections without a password. This is *not* recommended.
db_1   |
db_1   |        See PostgreSQL documentation about "trust":
db_1   |        https://www.postgresql.org/docs/current/auth-trust.html
web_1  |
web_1  |

我在 Stack Overflow 上尝试过各种类似问题的答案,但似乎对我没有任何作用。我已经尝试添加:

environment:
    - "POSTGRES_HOST_AUTH_METHOD=trust"

this中的数据库

还有其他各种答案。

【问题讨论】:

标签: python django postgresql docker docker-compose


【解决方案1】:

我的教程和你一样,当你添加时我遇到了同样的问题:

environment:
  POSTGRES_USER: postgres
  POSTGRES_PASSWORD: postgres

到数据库服务结束

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 2017-05-25
    • 1970-01-01
    • 2017-12-16
    • 2019-07-31
    • 2016-03-07
    • 2023-03-04
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多