Docker合成Django + PostgreSQL访问postgres主机而不使用服务名。

问题描述 投票:0回答:1

所以,基本上我有这个 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 同用 HOST 在Django设置中?(例如。'HOST': '0.0.0.0''HOST': 'postgres' 两个选项)。)

我曾试着用 network_mode: host 在我的django和postgres服务上。它工作得很好,但是有没有其他的方法来解决这个问题(例如,使用网络设置?我读了docker-compose网站上的文档,但不明白是怎么回事)。)

django postgresql docker docker-compose
1个回答
0
投票

我觉得你把开发环境和生产环境混在一起了(顺便说一下,你第二次粘贴Django数据库设置时,可能是指的是 'HOST': 'postgres')

所以,如果我没说错的话。

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

  2. 在生产过程中,你希望在你的Django设置.py文件中也有同样的设置。'HOST': '0.0.0.0'但为了让它工作,你需要 'HOST': 'postgres' (匹配编译文件中的服务名称),然后在docker上运行一切(按原样执行整个编译文件)。docker-compose up). 在这种情况下,Django无法访问 '0.0.0.0' 数据库主机,因为它运行的是 "容器化",而且该IP不绑定到任何服务,所以它需要服务的IP或名称。'postgres'.

可能的解决方案。

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

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

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

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

它遵循 "十二因子 "应用方法论。https:/12factor.net。

简而言之。

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

0
投票

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

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

  • Postgres服务在容器中运行。

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

解决办法。

  1. 类似的。通过docker-compose连接到postgres的Django服务
  2. 为了让你在Django中使用服务名连接到DB,按照文档中的规定。如果HOST和PORT键没有在字典中出现,那么Django将尝试用完整的 "NAME "作为SID进行连接。.

希望能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.