【问题标题】:Django docker - could not translate host name "db" to address: nodename nor servname provided, or not knownDjango docker - 无法将主机名“db”转换为地址:提供节点名或服务名,或未知
【发布时间】:2019-07-31 13:49:10
【问题描述】:

我对 Django 和 Docker 比较陌生,我正在按照教程构建一个迷你应用程序。但是,我遇到了以下错误:

django.db.utils.OperationalError: could not translate host name "db" to address: nodename nor servname provided, or not known

我的 docker-compose 文件如下所示:

 version: '3'
 services:
  db:
     image: 'postgres'
     ports:
       - '5432'
  core:
    build:
      context: .
      dockerfile: Dockerfile
    command: python3 manage.py runserver 0.0.0.0:8000
    ports:
      - '8000:8000'
    volumes:
      - .:/code
    depends_on:
      - db
    links:
      - db:db

我的 settings.py 文件包含数据库:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': 'postgres',
    'USER': 'postgres',
    'HOST': 'db',
    'PORT': 5432,
}
}

我看过herehere 的帖子,但都没有解决问题。

希望得到一些指导。谢谢。

【问题讨论】:

  • 你能保持 postgres 容器运行并只重启 django 容器并告诉我你是否仍然遇到同样的错误吗?
  • 感谢您的评论穆斯塔法。抱歉,我对 Docker 还是很陌生,所以可能需要帮助。我已经停止了码头工人。我怎样才能让 Postgres 容器运行?谢谢。
  • docker-compose restart core 这将在没有数据库的情况下重新启动应用程序,因此请确保首先运行数据库然后执行命令
  • 谢谢。不幸的是,问题仍然存在。

标签: django docker


【解决方案1】:
docker exec -it "container_name" python3 manage.py migrate

这对我有用。确保 manage.py 文件的路径正确。

【讨论】:

    【解决方案2】:

    以下配置适用于官方documentation

    version: "3.8"
    
    services:
      db:
        image: postgres
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
    
      web:
        build: .
        command: python /code/manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db
    

    然后运行这些命令:

    docker-compose up -d --build   
    
    docker-compose logs    
    

    【讨论】:

      【解决方案3】:

      我已经寻找了几天来解决这个问题。这是我所做的:

      1 - 我将 postgresql.conf.sample 文件从我的 postgres 容器复制到我的项目文件夹 你必须进入cd usr/share/postgresql docker exec -it yourcontainerbash

      2 - 我把它的名字改成了postgresql.conf

      3 - 我在postgresql.conf中修改了这些变量

          listen_addresses = '*'
          port = 5432             
          max_connections = 100           
          superuser_reserved_connections = 3
          unix_socket_directories = '/tmp'
      

      4 - 我将它添加到我的 Dockerfile 中

      COPY postgresql.conf      /tmp/postgresql.conf
      

      5 - 设置.py

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.postgresql',
              'NAME': 'test',
              'USER': 'testing',
              'PASSWORD': 'tests',
              'HOST': 'localhost',
              'PORT': 5432,
          }
      }
      

      6 - 我又做了一次docker-compose up -build

      【讨论】:

        【解决方案4】:

        不要重新定义网络,而是使用

        docker-compose down -v
        

        停止所有容器并删除所有缓存数据。

        然后

        docker-compose up
        

        从头开始

        【讨论】:

          【解决方案5】:

          在我的具体情况下,我的 postgres 没有任何版本,因此 postgres 映像会更新,而 db (postgres) 容器将无法启动

          【讨论】:

            【解决方案6】:

            我最近遇到了这个问题,我通过将 postgres 环境变量添加到我的 docker-compose.yml 文件中的 db 来解决它

            version: '3'
             services:
              db:
                 image: 'postgres'
                 ports:
                   - '5432'
                 environment:
                        - POSTGRES_DB=booksdb
                        - POSTGRES_USER=postgres
                        - POSTGRES_PASSWORD=postgres
              core:
                build:
                  context: .
                  dockerfile: Dockerfile
                command: python3 manage.py runserver 0.0.0.0:8000
                ports:
                  - '8000:8000'
                volumes:
                  - .:/code
                depends_on:
                  - db
                links:
                  - db:db
            

            【讨论】:

              【解决方案7】:

              我必须使用docker-compose up 来确保我的db 容器正在运行。

              【讨论】:

                【解决方案8】:

                所以您正试图从另一个容器访问在一个容器中运行的数据库?如果是,以下内容可能会有所帮助,至少在我遇到类似问题时它对我有所帮助。

                除了 links 之外,尝试在您的 compose 文件中定义 networks 配置,使用某个名称创建一个网络并在两个服务中定义它。正如here 所述,links 配置上的码头建议这样做。

                你的情况是这样的:

                version: '3'
                 services:
                  db:
                     image: 'postgres'
                     ports:
                       - '5432'
                     networks:
                      some_network:
                  core:
                    build:
                      context: .
                      dockerfile: Dockerfile
                    command: python3 manage.py runserver 0.0.0.0:8000
                    ports:
                      - '8000:8000'
                    volumes:
                      - .:/code
                    depends_on:
                      - db
                    links:
                      - db:db
                    networks:
                      some_network:
                  networks:
                   some_network:
                

                它帮助我解析主机名以连接到数据库。

                【讨论】:

                  猜你喜欢
                  • 2021-10-16
                  • 2020-10-03
                  • 2017-05-25
                  • 2014-01-05
                  • 2021-08-25
                  • 2023-03-04
                  • 1970-01-01
                  • 2013-12-13
                  • 2017-12-16
                  相关资源
                  最近更新 更多