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

