使用django的Docker-compose无法将主机名"db"转换为地址:名称或服务未知

Mat*_*llo 12 django postgresql amazon-web-services docker-compose

我目前使用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
Run Code Online (Sandbox Code Playgroud)

现在改变之后:

    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"
Run Code Online (Sandbox Code Playgroud)

来自settings.py的DATABASES.之前:

DATABASES = {
        'default': {
            'ENGINE': 'tenant_schemas.postgresql_backend',
            'NAME': 'testing',
            'USER': 'test',
            'PASSWORD': 'test',
            'HOST': 'db',
            'PORT': '5432',
        }
    }
Run Code Online (Sandbox Code Playgroud)

后:

DATABASES = {
        'default': {
            'ENGINE': 'tenant_schemas.postgresql_backend',
            'NAME': 'testing',
            'USER': 'test',
            'PASSWORD': 'test',
            'HOST': 'xxx.rds.amazonaws.com',
            'PORT': '5432',
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

我完全迷失了.

小智 12

对于其他经历过这种情况的人。

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

docker system prune
Run Code Online (Sandbox Code Playgroud)

请参阅docker 文档以获取更多信息

  • 如果这个答案能够解释_为什么_采取此操作可以解决问题,那就更好了。 (19认同)
  • 为什么这有效?这是一个魔法咒语吗? (3认同)

小智 7

添加网络、链接和depends_on在 compose 文件中配置。

例子:

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

  networks:
      djangonetwork:
          driver: bridge
Run Code Online (Sandbox Code Playgroud)


Mat*_*llo 4

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

我的manage.py 仅选择base.py 设置文件,并且没有考虑staging.py 设置文件。所以它是在 CLI 中进行破坏,而不是在应用程序内部进行破坏。

  • 有人可以详细说明他是如何解决这个问题的吗?我也遇到这个错误,已经两天了,我没有找到解决方案:( (3认同)
  • 这是否意味着您没有正确配置设置文件? (2认同)