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

Docker部署Django+PostgreSQL时数据库容器连接失败求助

问题:Docker搭建React/Django+PostgreSQL环境时数据库连接失败

执行docker-compose up时,后端服务的migrate步骤出现以下错误:

psycopg2.OperationalError: could not translate host name "database" to address: Name or service not known

相关配置文件

docker-compose.yml

version: "3"
services:

  database:
    image: postgres:12.7-alpine
    volumes:
        - ./backup_data/db:/var/lib/postgresql/data
    environment:
        - POSTGRES_DB=postgres
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=postgres

  backend:
    build: ./mash_backend
    volumes:
      - ./backend:/app
    depends_on:
      - database
  
  frontend:
    build: ./mash_frontend
    volumes:
      - ./frontend:/app
    depends_on:
      - backend
    ports:
      - 80:80
  
  nginx_backend_server:
    build: ./nginx_backend_server
    ports:
        - 8000:8000
    depends_on:
        - backend

Django settings.py 数据库配置

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

后端Dockerfile

FROM python:3.8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
COPY . /app
WORKDIR /app
RUN pip3 install -r req.txt
RUN python manage.py makemigrations
RUN python manage.py migrate
CMD gunicorn -b 0.0.0.0:8000 --worker-class=gevent --worker-connections=1000 --workers=5 backend.wsgi

问题原因及解决方案

1. 构建阶段无法访问Docker Compose网络

Dockerfile中的RUN python manage.py makemigrations和RUN python manage.py migrate是在镜像构建阶段执行的,此时容器还未加入Docker Compose创建的网络,无法解析database这个服务名。

修改方案:将数据库迁移命令移到容器启动阶段执行,而非构建阶段。修改后端Dockerfile如下:

FROM python:3.8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
COPY . /app
WORKDIR /app
RUN pip3 install -r req.txt
# 移除构建阶段的迁移命令,改为启动时执行
CMD ["sh", "-c", "python manage.py makemigrations && python manage.py migrate && gunicorn -b 0.0.0.0:8000 --worker-class=gevent --worker-connections=1000 --workers=5 backend.wsgi"]

2. depends_on不保证数据库服务就绪

默认的depends_on仅保证database容器启动,但PostgreSQL服务可能还在初始化(比如创建数据库、加载数据),此时后端连接会失败。

修改方案:为database服务添加健康检查,并让backend等待数据库健康检查通过后再启动。更新docker-compose.yml:

version: "3"
services:

  database:
    image: postgres:12.7-alpine
    volumes:
        - ./backup_data/db:/var/lib/postgresql/data
    environment:
        - POSTGRES_DB=postgres
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=postgres
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  backend:
    build: ./mash_backend
    volumes:
      - ./backend:/app
    depends_on:
      database:
        condition: service_healthy  # 等待数据库健康检查通过
  
  # 其他服务配置保持不变
  frontend:
    build: ./mash_frontend
    volumes:
      - ./frontend:/app
    depends_on:
      - backend
    ports:
      - 80:80
  
  nginx_backend_server:
    build: ./nginx_backend_server
    ports:
        - 8000:8000
    depends_on:
        - backend

完成以上修改后,重新执行docker-compose up --build即可解决数据库连接问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:22:46