postgresql dock-compose中的Django看不到数据库:无法将主机名“db”转换为地址:名称或服务未知

zfciruhq  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(2)|浏览(122)

我目前正在做一个项目,前端是react,后端是django,数据库是postgresql,反向代理是nginx。所有内容都通过Docker-compose文件连接起来。
现在,我尝试将我的postgresql数据库链接到django。
然而,每次我尝试使用docker-compose CLI启动我的网络时,它都会失败,并在django后端容器中迁移数据,并出现以下错误:

#0 0.697 django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known

我不明白为什么我有这个错误。当我尝试检查数据库是否已启动时,它可以正常工作:

docker-compose up -d db     
Creating network "docker_nginx_django_react_template_appNetwork" with driver "bridge"
Creating db ... done
docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                                       NAMES
_   postgres:latest   "docker-entrypoint.s…"   5 seconds ago   Up 4 seconds   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp   db

下面是我的docker-compose文件:

version: '3.8'

services:
  nginx:
    container_name: app_server_conf
    build:
      context: ./
      dockerfile: ./Dockerfile
    ports:
      - "80:80"
    environment:
      - PUBLIC_URL=127.0.0.1
    volumes:
      - staticfiles:/staticfiles
    networks:
      - appNetwork
    depends_on:
      - backend    
  db:
    image: postgres:latest
    container_name: db
    restart: always
    ports:
      - "5432:5432"
    networks:
      - appNetwork
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust
      POSTGRES_USER: test
      POSTGRES_PASSWORD: test
    volumes:
      - postgresql:/var/lib/postgresql/data
    healthcheck:
      test: pg_isready -U postgres

  backend:
    container_name: backend
    ports:
      - "8000:8000"
    build:
      context: backend
      dockerfile: ./Dockerfile
    command: "make run"
    networks:
      - appNetwork
    volumes:
      - staticfiles:/app/static/
    depends_on:
      db:
        condition: service_healthy
    links:
      - db:db

volumes:
  postgresql:
  staticfiles:

networks:
  appNetwork:
    driver: bridge

以下是我的settings.py部分:

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

不幸的是,在网上做了很多研究后,我完全迷路了。对我来说奇怪的是,我可以看到网络中的数据库,如下面的结果。但即使用docker system prune --force进行了硬清洁,它也没有任何作用。

docker network inspect docker_nginx_django_react_template_appNetwork
[
    {
        "Name": "docker_nginx_django_react_template_appNetwork",
        ...,
        "Containers": {
            "cb7fdbfc4efe91254e95c02ca680315d488b0c6426ea90b2f682b74bf18eef62": {
                "Name": "db",
                "EndpointID": "endpointid",
                "MacAddress": "mac_address",
                "IPv4Address": "ip_address/20",
                "IPv6Address": ""
            }
        },
        ...
    }
]
jei2mxaa

jei2mxaa1#

另一个尝试帮助:

db:
    image: postgres:latest
    container_name: db
    restart: always
    ports:
      - "5432:5432"
    networks:
      - appNetwork
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust
      POSTGRES_USER: test
      POSTGRES_PASSWORD: test
      POSTGRES_DB: backend_db     <--- put NAME of settings.py
    volumes:
      - postgresql:/var/lib/postgresql/data
    healthcheck:
      test: pg_isready -U postgres

另一个我会尝试的选项是将container_name设置为backend_db。我不知道container_name如何干扰环境变量POSTGRES_DB

8ehkhllq

8ehkhllq2#

在你的settings.py的django代码中,你必须细化HOSTNAME
我不是这方面的Maven,但我也有过类似的经历。也许这个能帮到你阅读HOSTNAME
抱歉的模糊答案,但我不能提供即插即用的答案。希望资源和问题最可能存在的地方的提示无论如何都有帮助。

相关问题