首页 > 解决方案 > 无法在不同 yaml 文件中使用相同网络翻译 Docker Compose 中的主机名

问题描述

首先我创建后端网络:

docker network create backend

使用 db 创建第一个 docker-compose.yaml 文件:

version: '3.8'

services:
  db:
    image: postgres
    restart: always
    environment:
      POSTGRES_PASSWORD: postgres
    ports:
      - "5432:5432"      
    networks: 
      - backend
      
networks:
  backend:
    external: true

使用 Django 创建第二个 docker-compose.yaml 文件:

version: '3.8'

services:
  django:
    build:
      context: ./
      dockerfile: ./dockerfiles/django
    restart: always
    command: python3 manage.py runserver 0.0.0.0:8000
    ports:
      - "80:8000"
    networks:
      - backend
    volumes:
      - .:/code

networks:
  backend:
    external: true

Django 中的数据库设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'db_name',
        'USER': 'user_name',
        'PASSWORD': 'user_pass',
        'HOST': 'backend',
        'PORT': '5432',
    }
}

Docker 在 Django yaml 上编写:

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

我阅读了文档和其他问题......我肯定做的一切都是正确的,但为什么 django 无法解析主机名?我尝试 d ocker-compose run和docker- compose up但没有任何帮助。

我也尝试在两个容器(django 和 db)中使用getent,但输出为空:

getent hosts backend

我查看了 /etc/hosts 但它没有后端

但是docker inspect backend在“容器”中向我显示这两个服务都连接到网络

"Containers": {
    "25c5cc71f1c66dd3c8540783c08532f32073859b6a1afdc4fe4efd1236963080": {
        "Name": "worker_django_1",
        "EndpointID": "e982e75232e5d920bf3b053fce36b85589d4d7d9d8c5a8fbaea4a76dba519aa0",
        "MacAddress": "02:42:ac:13:00:03",
        "IPv4Address": "172.19.0.3/16",
        "IPv6Address": ""
    },
    "6a7447068f0d5c9ba725b02e46f243aaac1ebca2068c978c7a183f965a3460fe": {
        "Name": "postgres_db_1",
        "EndpointID": "e3977c3f26a583a9117f7504f4a6ed0f192cdc88e872e129108a90f419b755b0",
        "MacAddress": "02:42:ac:13:00:02",
        "IPv4Address": "172.19.0.2/16",
        "IPv6Address": ""
    }
},

标签: pythondockernetworkingdocker-composecontainers

解决方案


尝试服务名称而不是网络名称。在这种情况下,它将是 db。


推荐阅读