【问题标题】:Docker Compose Django + PostgreSQL access postgres host without using service nameDocker Compose Django + PostgreSQL 访问 postgres 主机而不使用服务名
【发布时间】:2020-09-20 16:34:37
【问题描述】:

所以,基本上我有这个docker-compose.yml 配置:

services:
  postgres:
    container_name: youtube_manager_postgres
    restart: always
    image: postgres:alpine
    environment:
      - POSTGRES_HOST_AUTH_METHOD=trust
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=qwerty123
      - POSTGRES_DB=ytmanager
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    ports:
      - "5432:5432"

  django:
    container_name: youtube_manager_django
    restart: always
    build:
      context: ../
      dockerfile: deploy/django/Dockerfile
    command: sh -c "poetry run python3 manage.py migrate &&
                    poetry run python3 manage.py collectstatic --no-input --clear &&
                    poetry run uwsgi --ini /etc/uwsgi.ini"
    ports:
      - "8000:8000"
    volumes:
      - staticfiles:/code/static
      - mediafiles:/code/media
    depends_on:
      - postgres

我的 Django 的数据库首选项是:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'ytmanager',
        'USER': 'admin',
        'HOST': '0.0.0.0',
        'PASSWORD': 'qwerty123',
        'PORT': '5432',
    }
}

我不想以两种方式使用它: 1. 在开发过程中运行docker-compose up -d postgres,然后运行python3 manage.py runserver(实际上是poetry run python3 manage.py runserver,但现在没关系)。 2. 部署期间运行docker-compose up

目前,它适用于 1 选项,但是当我执行 docker-compose up 时出现错误:

youtube_manager_django | django.db.utils.OperationalError: could not connect to server: Connection refused
youtube_manager_django |        Is the server running on host "0.0.0.0" and accepting
youtube_manager_django |        TCP/IP connections on port 5432?

如果我以这种方式更改 Django 数据库设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'ytmanager',
        'USER': 'admin',
        'HOST': '0.0.0.0',
        'PASSWORD': 'qwerty123',
        'PORT': '5432',
    }
}

执行docker-compose up -d postgres 然后python manage.py runserver 会导致错误:

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

如何正确配置 docker-compose.yml 以在 Django 设置中使用相同的 HOST? (例如,'HOST': '0.0.0.0''HOST': 'postgres' 对于这两个选项)。

我尝试在我的 django 和 postgres 服务上使用 network_mode: host。它工作正常,但有没有其他方法可以解决问题(例如,使用网络设置?我在他们的网站上阅读了 docker-compose 文档,但无法了解那里发生了什么)。

【问题讨论】:

  • 0.0.0.0 是一个特殊的 IPv4 地址,意思是“无处不在”;您通常不会将其用作您显示的HOST 设置。 Docker 和非 Docker 环境不同,您需要不同的HOST 设置;环境变量是一种典型的方法(对于非 Docker,默认为 localhost,但在 docker-compose.yml 文件中提供替代值)。
  • 我可以在 django 和 postgres 服务中使用0.0.0.0 地址吗?

标签: django postgresql docker docker-compose


【解决方案1】:

我认为您正在混合开发生产环境(顺便说一句,您第二次粘贴 Django 数据库设置时可能是指'HOST': 'postgres'

所以,如果我没记错的话:

  1. 在开发时你想要在你的 Django 设置 .py 文件中:'HOST': '0.0.0.0',因为我认为你是 在 docker 外执行python manage.py runserver, 将 postgres 保存在 docker 中。

  2. 1234563 docker(按原样执行整个撰写文件:docker-compose up)。在这种情况下,Django 无法访问'0.0.0.0' 数据库主机,因为它正在运行“容器化”并且该 ip 没有绑定到任何服务,因此它需要服务的 ip 或名称'postgres'

可能的解决方案:

在我看来,解决方案是让 Docker 调用两个 yml 文件(例如 docker-compose -f docker-compose-development.yml up):

  • docker-compose-development.yml
  • docker-compose-production.yml

在每个 .yml 文件中,您可以使用不同的环境变量或设置以干净的方式覆盖开发和生产之间的差异。

你可以看看: https://github.com/pydanny/cookiecutter-django。它是一个使用 Docker 的模板 Django 项目。

它遵循“十二个因素”应用方法: https://12factor.net/

简而言之:

  1. 环境变量在 .envs 文件夹下的文件中设置。
  2. 在 compose .yml 文件中指向它们以加载环境变量:
env_file:
     ./.envs/.production/.postgres
  1. Django 设置 .py 文件可以使用 django-environ 包访问环境变量。

【讨论】:

    【解决方案2】:

    在编辑 Django DB 配置之前,请确保以下几点:

    • 两个容器都在同一个网络中运行。

    • Postgres 服务已在容器中启动并运行。

    • 可以从 webapp 容器访问服务“postgres”。为此,您可以登录到容器并执行 ping 测试。 docker exec -it containerID /bin/bash (in some cases /bin/sh) # to login to container

    解决方案:

    1. 类似: Django connection to postgres by docker-compose
    2. 为了让您在 Django 中使用服务名称连接到 DB,根据文档 如果 HOST 和 PORT 键未在字典中,那么 Django 将尝试使用完整的“NAME”作为 SID 进行连接强>。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 2019-11-22
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2021-09-10
      • 1970-01-01
      相关资源
      最近更新 更多