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

docker-compose up启动后Django+Postgres项目容器未正常运行如何解决

问题根本原因

depends_on 仅控制Docker容器的启动先后顺序,不会等待Postgres内部的初始化流程完全完成、可以正常响应数据库请求后再启动web容器。首次启动时Postgres需要完成数据目录初始化、默认权限配置等操作,即使日志显示「准备好接受连接」,此时实际还无法响应Django的数据库请求,web容器执行migrate命令时连接失败直接退出,所以看起来卡住。第二次启动时Postgres的初始化已经完成,就可以正常连接了。

修复方案

步骤1:新增数据库等待脚本

在项目根目录新建wait-for-postgres.sh文件,内容如下:

#!/bin/bash
set -e

# 检测5432端口是否就绪,不需要额外安装数据库客户端,更轻量
until nc -z db 5432; do
  >&2 echo "Postgres 还未就绪,等待中..."
  sleep 1
done

>&2 echo "Postgres 已就绪,启动web服务"
exec "$@"

步骤2:修改Dockerfile补充依赖和权限

删除原有重复的ADD/COPY逻辑,补充工具安装和脚本赋权操作,修改后内容如下:

FROM python:3

ENV PYTHONUNBUFFERED 1

WORKDIR /app

# 安装netcat用于端口检测
RUN apt-get update && apt-get install -y netcat-traditional && rm -rf /var/lib/apt/lists/*

COPY ./requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt

COPY . /app
# 给等待脚本赋予执行权限
RUN chmod +x /app/wait-for-postgres.sh

步骤3:修改docker-compose.yml启动逻辑

调整web服务的启动命令,先执行等待脚本再运行业务逻辑,修改后内容如下:

version: '3'

services:
  web:
    build: .
    command: bash -c "./wait-for-postgres.sh && python manage.py migrate && python manage.py load_patient_data && python manage.py runserver 0.0.0.0:8000"
    ports:
      - 8000:8000
    depends_on:
      - db
    # 兜底重启策略,偶发连接失败时自动重试
    restart: on-failure

  db:
    image : postgres
    restart: always
    environment:
      - "POSTGRES_HOST_AUTH_METHOD=trust"
    # 可选:挂载数据卷,避免容器重建后数据库数据丢失
    volumes:
      - postgres_data:/var/lib/postgresql/data/

volumes:
  postgres_data:

修改完成后重新执行docker-compose up --build即可单次启动成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:15:06