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

时间:2017-01-10 16:13:09

标签: 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

现在改变之后:

    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。 之前:

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。

我完全迷失了。

5 个答案:

答案 0 :(得分:2)

在docker compose文件中添加网络,链接和Depends_on 配置。

示例:

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

  networks:
      djangonetwork:
          driver: bridge

答案 1 :(得分:1)

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

我的manage.py只选择了base.py设置文件,并没有考虑staging.py设置文件。所以它在CLI中破解并且没有破坏应用程序内部。

答案 2 :(得分:1)

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

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

我认为他们至少在新的版本中希望终止对docker-compose中的链接的支持。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

其他经历过的人。

以下命令(该命令将删除所有未使用的容器,网络,映像以及可选的卷)解决了我的问题:

docker system prune

有关更多信息,请参见docker document