【问题标题】:Docker-compose with django could not translate host name "db" to address: Name or service not known带有 django 的 Docker-compose 无法将主机名“db”转换为地址:名称或服务未知
【发布时间】:2017-05-25 04:58:24
【问题描述】:

我目前有一个使用 docker-compose 构建的系统,它创建了一个 Django 应用程序。

到目前为止,我在测试版本中使用了容器内的数据库 (postgresql)。现在我已将数据库从这个容器更改为 AWS 中的 RDS 实例。

使用 Pg_dump 我在 RDS 中重新创建了数据库并更改了 settings.py,一切正常。我已经从我的 webapp 内的数据库中访问了数据,没有任何问题。

一切都很好,直到我不得不进行迁移。如果没有数据库容器,Django 容器会给我这个消息:

django.db.utils.OperationalError:无法翻译主机名“db” 收件人:姓名或服务未知

更改前我的 Docker-compose.yml 文件:

 version: '2'

    services:
      db:
        image: postgres:9.5
        restart: always
        environment:
          POSTGRES_USER: testing
          POSTGRES_PASSWORD: tests
          POSTGRES_DB: test
        volumes:
          - /dbdata:/var/lib/postgresql/data
      django:
        build: ./django
        command: gunicorn contactto.wsgi:application -b 0.0.0.0:8000
        restart: always
        volumes:
          - ./django:/usr/src/app
          - ./django/static:/usr/src/app/contactto/static
        ports:
          - "8000:8000"
        depends_on:
          - db

更改后的现在:

    version: '2'

    services:
      django:
        build: ./django
        command: gunicorn contactto.wsgi:application -b 0.0.0.0:8000
        restart: always
        volumes:
          - ./django:/usr/src/app
          - ./django/static:/usr/src/app/contactto/static
        ports:
          - "8000:8000"

还有来自 settings.py 的数据库。 之前:

DATABASES = {
        'default': {
            'ENGINE': 'tenant_schemas.postgresql_backend',
            'NAME': 'testing',
            'USER': 'test',
            'PASSWORD': 'test',
            'HOST': 'db',
            'PORT': '5432',
        }
    }

之后:

DATABASES = {
        'default': {
            'ENGINE': 'tenant_schemas.postgresql_backend',
            'NAME': 'testing',
            'USER': 'test',
            'PASSWORD': 'test',
            'HOST': 'xxx.rds.amazonaws.com',
            'PORT': '5432',
        }
    }

奇怪的是,我可以在我的应用程序中使用 aws 数据库...我可以创建用户并在数据库中执行操作,并且更改会出现。现在在 CLI 中,我什至无法在没有消息的情况下使用 manage.py shell。

我完全迷路了。

【问题讨论】:

标签: django postgresql amazon-web-services docker-compose


【解决方案1】:

click on此链接以获得您的答案或添加命令:bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000" in docker-compose.yaml。我希望这对您有用。它对我有用

【讨论】:

    【解决方案2】:

    在docker compose文件中添加network、link和depends_on配置。

    示例:

      services:
          db:
              build: .
              container_name: db
              networks:
                  - djangonetwork
          web:
              build: .
              depends_on:
                 - db
              links:
                 - db:db
              networks:
                 - djangonetwork
    
      networks:
          djangonetwork:
              driver: bridge
    

    【讨论】:

    • 这极大地帮助我通过了无网络的 docs.docker 快速入门。我遇到的两件事是 networksservices 处于同一级别,并将 networks 添加到 web 和 db 配置中。
    【解决方案3】:

    致其他遇到这种情况的人。

    以下命令(删除所有未使用的容器、网络、图像和可选的卷)解决了我的问题:

    docker system prune
    

    更多信息请参见docker document

    【讨论】:

    • 如果这个答案能解释为什么采取这个行动可以解决问题,那就更好了。
    【解决方案4】:

    在“depends_on”部分下的 docker-compose.yml 的“django”部分中,尝试在其后添加 links: - db:db,甚至用它替换depends_on: db。

    我敢打赌,如果您输入 docker logs (container name),您会发现它显然无法确定“db”指向的位置。

    我认为他们希望在新的迭代中终止对 docker-compose 中的链接的支持,至少我在某处读到过。

    【讨论】:

      【解决方案5】:

      回答我的问题,这是一个愚蠢的问题......

      我的 manage.py 只选择了 base.py 设置文件,并没有考虑到 staging.py 设置文件。所以它在 CLI 中中断,而不是在应用程序内部中断。

      【讨论】:

      • 这是否意味着您没有正确配置设置文件?
      • 有人能详细说明他是如何解决这个问题的吗?我也收到了这个错误,已经两天了,我没有找到解决方案:(
      • 我在尝试在 Github Actions 中运行测试时遇到了同样的问题。关键的见解是您的 django 应用程序正在启动并尝试连接到 postgres。在您的设置中的某处,或在运行时继承的设置中,数据库名称/端口配置不正确。如果你认为你知道你在哪里设置它,并且你改变了它,但仍然看到“db”,那么它在某个地方被覆盖了,或者你实际上并没有使用你认为的分支。
      猜你喜欢
      • 2021-10-16
      • 2020-10-03
      • 2021-08-25
      • 2017-12-16
      • 2019-07-31
      • 2023-03-04
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      相关资源
      最近更新 更多