带有 django 的 Docker-compose 无法将主机名“db”转换为地址:名称或服务未知

Posted

技术标签:

【中文标题】带有 django 的 Docker-compose 无法将主机名“db”转换为地址:名称或服务未知【英文标题】:Docker-compose with django could not translate host name "db" to address: Name or service not known 【发布时间】: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。

我完全迷路了。

【问题讨论】:

答案可以在这个***.com/a/61393097/10526787找到 【参考方案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”,那么它在某个地方被覆盖了,或者你实际上并没有使用你认为的分支。

以上是关于带有 django 的 Docker-compose 无法将主机名“db”转换为地址:名称或服务未知的主要内容,如果未能解决你的问题,请参考以下文章

MongooseModule:无法连接到数据库。在带有 Mongo 的 dockerized Nestjs 应用程序上

带有“带有模板标签”方法的 django 静态文件

带有 websocket 的 Django 框架

带有普通 Django 表单和引导程序的 Django-CKEditor

node-sass 和 Docker 的问题

带有 ReactJS 的 Django 表单