【问题标题】:Unable to run Django with PostgreSQL in Docker无法在 Docker 中使用 PostgreSQL 运行 Django
【发布时间】:2021-12-11 15:17:03
【问题描述】:

我想在 docker 容器中设置一个带有 PostgresDb 的 Django 应用程序,这就是为什么我想设置 docker-compose 但是当我执行我的代码 docker 时,django 和 db 都工作正常,我还开发了一些 API,它们是也可以按预期正常工作,但不幸的是,我突然被这些错误阻止:

pgdb_1    | 
pgdb_1    | 2021-12-11 15:05:38.674 UTC [1] LOG:  starting PostgreSQL 14.1 (Debian 14.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
pgdb_1    | 2021-12-11 15:05:38.674 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
pgdb_1    | 2021-12-11 15:05:38.674 UTC [1] LOG:  listening on IPv6 address "::", port 5432
pgdb_1    | 2021-12-11 15:05:38.697 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
pgdb_1    | 2021-12-11 15:05:38.729 UTC [27] LOG:  database system was shut down at 2021-12-11 15:03:09 UTC
pgdb_1    | 2021-12-11 15:05:38.761 UTC [1] LOG:  database system is ready to accept connections
django_1  | Watching for file changes with StatReloader
django_1  | Performing system checks...
django_1  | 
django_1  | System check identified no issues (0 silenced).
pgdb_1    | 2021-12-11 15:05:41.390 UTC [34] FATAL:  password authentication failed for user "postgres"
pgdb_1    | 2021-12-11 15:05:41.390 UTC [34] DETAIL:  Role "postgres" does not exist.
pgdb_1    |     Connection matched pg_hba.conf line 100: "host all all all scram-sha-256"
django_1  | Exception in thread django-main-thread:
django_1  | Traceback (most recent call last):
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
django_1  |     self.connect()
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 33, in inner
django_1  |     return func(*args, **kwargs)
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 200, in connect
django_1  |     self.connection = self.get_new_connection(conn_params)
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 33, in inner
django_1  |     return func(*args, **kwargs)
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
django_1  |     connection = Database.connect(**conn_params)
django_1  |   File "/usr/local/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect
django_1  |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django_1  | psycopg2.OperationalError: FATAL:  password authentication failed for user "postgres"
django_1  | 
django_1  | 
django_1  | The above exception was the direct cause of the following exception:
django_1  | 
django_1  | Traceback (most recent call last):
django_1  |   File "/usr/local/lib/python3.10/threading.py", line 1009, in _bootstrap_inner
django_1  |     self.run()
django_1  |   File "/usr/local/lib/python3.10/threading.py", line 946, in run
django_1  |     self._target(*self._args, **self._kwargs)
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/utils/autoreload.py", line 64, in wrapper
django_1  |     fn(*args, **kwargs)
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/core/management/commands/runserver.py", line 121, in inner_run
django_1  |     self.check_migrations()
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 486, in check_migrations
django_1  |     executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/migrations/executor.py", line 18, in __init__
django_1  |     self.loader = MigrationLoader(self.connection)
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 53, in __init__
django_1  |     self.build_graph()
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 220, in build_graph
django_1  |     self.applied_migrations = recorder.applied_migrations()
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 77, in applied_migrations
django_1  |     if self.has_table():
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 55, in has_table
django_1  |     with self.connection.cursor() as cursor:
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 33, in inner
django_1  |     return func(*args, **kwargs)
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 259, in cursor
django_1  |     return self._cursor()
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 235, in _cursor
django_1  |     self.ensure_connection()
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 33, in inner
django_1  |     return func(*args, **kwargs)
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 218, in ensure_connection
django_1  |     with self.wrap_database_errors:
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/utils.py", line 90, in __exit__
django_1  |     raise dj_exc_value.with_traceback(traceback) from exc_value
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
django_1  |     self.connect()
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 33, in inner
django_1  |     return func(*args, **kwargs)
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 200, in connect
django_1  |     self.connection = self.get_new_connection(conn_params)
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 33, in inner
django_1  |     return func(*args, **kwargs)
django_1  |   File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
django_1  |     connection = Database.connect(**conn_params)
django_1  |   File "/usr/local/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect
django_1  |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django_1  | django.db.utils.OperationalError: FATAL:  password authentication failed for user "postgres"

我的 Dockerfile

FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code

RUN pip install --upgrade pip
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

docker-compose.yml

version: "3.8"
   
services:
  pgdb:
    image: "postgres"
    restart: always
    volumes:
      - ./data/db:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=digipm
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  django:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - pgdb

数据库配置设置.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'digipm',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'pgdb',
        'PORT': 5432,
    }
}

【问题讨论】:

  • 我们可以在 django 设置文件中看到你的DATABASES 定义吗?
  • @jorf.brunning 我已附上数据库配置,请看一下。谢谢
  • 相对于 docker-compose 的设置看起来不错。你的 dockerfile 是完全合理的。您作为卷添加到 postgres 容器的 ./data/db 的内容是什么?当我在容器内运行 postgresql 时,我没有从容器外添加任何卷。
  • inside ./data/db 我有所有与 postgres 相关的文件,例如:pg_hba.conf
  • 您可能通过容器内的 postgres 安装不期望的卷注入 postgres 配置。您是否在 pg_hba 中编辑过任何可能影响您的默认 postgres 用户的内容?您可以尝试通过不带卷的 docker compose 运行 postgres 容器。

标签: python django postgresql docker docker-compose


【解决方案1】:

我在尝试使用 docker 创建新的 django 开发环境时遇到了 django 未连接到数据库的问题。我创建了一个新项目docker-compose run web django-admin startproject django_src . 然后docker-compose up 并没有连接到数据库。

在数据库和 Django 本身的docker-compose 中添加环境配置后,我解决了这个问题(参见下面的代码 sn-ps)。然后我使用 os.environ.get('') 作为主机、名称、用户和密码来明确引用和来回 docker-compose 环境配置。

然后我运行了以下内容:

docker-compose run --rm app python manage.py migrate

docker-compose run --rm app python manage.py createsuperuser

创建 docker-django-postgres_app_run ... 完成 用户名(留空以使用“用户”): 电子邮件地址: 密码: 密码(再次): 这个密码太常见了。 绕过密码验证并创建用户? [是/否]:是 超级用户创建成功。

Dockerfile

FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

docker-composefile

version: "3.9"
   
services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - DB_HOST=db
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    depends_on:
      - db

settings.py

import os

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': os.environ.get('DB_HOST'),
        'NAME': os.environ.get('POSTGRES_NAME'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
        'PORT': 5432,
    }
}

requirements.txt

asgiref==3.4.1
Django==4.0.1
psycopg2==2.9.3
sqlparse==0.4.2

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2018-01-08
    • 2020-12-30
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2018-04-08
    • 2021-11-15
    相关资源
    最近更新 更多