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

