You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django多容器部署报错:无法解析主机名'db'的地址

问题描述

单独进入后端目录执行docker compose up时,后端容器运行正常;但从主目录执行docker compose up启动后端容器(后续将添加前端容器)时,出现错误:could not translate host name "db" to address: Temporary failure in name resolution。


相关配置

后端目录docker-compose.yml

services:
  db:
    image: postgres
    volumes:
      # - ./docker/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
      - ./data:/var/lib/postgresql/data/
    environment:
      POSTGRES_DB=postgres
      POSTGRES_USER=postgres
      POSTGRES_PASSWORD=postgres

  backend:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app/backend
    env_file:
      - docker/environment/db.env
    ports:
      - "8000:8000"
    restart: on-failure
    depends_on:
      - db
    links:
      - db:db

后端Dockerfile

FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app/backend/
COPY requirements.txt /app/backend/
RUN pip install -r requirements.txt
COPY . /app/backend/
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Django settings.py数据库配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('POSTGRES_NAME'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
        'HOST': 'db',
        'PORT': 5432,
    }
}

主目录docker-compose.yml

services:
  backend:
    build: ./backend 
    ports:
      - "8000:8000" 
    networks:
      default:
        ipv4_address: <ip address>

networks:
  default:
    driver: bridge
    ipam:
      config:
        - subnet: <ip address>/16

解决方案

问题核心是主目录的docker-compose.yml仅定义了backend服务,完全没有包含db服务。从主目录启动时,Docker Compose只会启动你配置的backend容器,没有对应的db容器运行,自然无法解析db主机名。

修改主目录的docker-compose.yml,将db服务纳入配置,并补充backend服务的完整依赖项:

services:
  db:
    image: postgres
    volumes:
      # 注意路径调整为主目录相对路径,对应后端目录下的data文件夹
      - ./backend/data:/var/lib/postgresql/data/
    environment:
      # 修正Docker Compose环境变量语法,用冒号替代等号
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    networks:
      - default

  backend:
    build: ./backend 
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./backend:/app/backend
    env_file:
      # 调整env文件的主目录相对路径
      - ./backend/docker/environment/db.env
    ports:
      - "8000:8000" 
    restart: on-failure
    depends_on:
      - db
    networks:
      default:
        ipv4_address: <ip address>

networks:
  default:
    driver: bridge
    ipam:
      config:
        - subnet: <ip address>/16

额外注意细节:

  • 修正environment的语法:Docker Compose规范写法是KEY: VALUE,而非KEY=VALUE
  • 调整路径:主目录下的相对路径要对应到后端目录内的文件/文件夹
  • 保留depends_on:确保backend在db启动后再尝试连接
  • 无需links配置:Docker Compose默认网络已支持服务名解析

内容的提问来源于stack exchange,提问作者mish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:52:41