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
相关产品推荐
相关产品推荐

