Docker环境下Django应用代码修改后自动重载失效求助
Django + PostGIS + Docker 代码修改不自动重载问题解决方案
核心问题与修复步骤
1. 启用Daphne自动重载
当前entrypoint.sh中的Daphne启动命令缺少--reload参数,这是触发代码改动后自动重启的关键。修改entrypoint.sh:
python manage.py collectstatic --no-input python manage.py migrate --force # 添加--reload开启自动重载 daphne core.asgi:application --bind 0.0.0.0 --reload
2. 禁用Python字节码缓存
Dockerfile中PYTHONWRITEBYTECODE=1会生成.pyc缓存文件,导致容器读取旧代码而非修改后的文件。修改Dockerfile的环境变量:
ENV PYTHONWRITEBYTECODE=0 # 关闭字节码生成,避免缓存干扰
3. 优化本地文件挂载规则
创建.dockerignore文件,排除不必要的本地文件,避免挂载到容器中引发冲突:
venv/ __pycache__/ *.pyc *.pyo .env .dockerignore Dockerfile docker-compose.yml
4. 修正Dockerfile的文件复制路径
当前Dockerfile的COPY路径存在逻辑错误,导致entrypoint脚本路径不匹配。调整Dockerfile:
FROM python:3.11.3-slim-buster WORKDIR /app ENV REDIS_HOST "redis" ENV PYTHONUNBUFFERED=1 ENV PYTHONWRITEBYTECODE=0 # 修正字节码配置 RUN apt-get update \ && apt-get -y install netcat gcc postgresql \ && apt-get clean RUN apt-get update \ && apt-get install -y binutils libproj-dev gdal-bin python-gdal python3-gdal RUN pip install --upgrade pip # 先复制依赖文件,利用Docker缓存 COPY ./requirements.txt . RUN pip install -r requirements.txt # 复制entrypoint脚本到工作目录 COPY ./entrypoint.sh . ENTRYPOINT ["sh", "/app/entrypoint.sh"] # 最后复制项目代码 COPY . .
5. 验证卷挂载一致性
确认docker-compose.yml中app_django的卷挂载路径与Dockerfile的工作目录匹配:
app_django: restart: always build: . volumes: - .:/app/ # 本地项目根目录挂载到容器工作目录/app - static_files:/app/static # 修正静态文件挂载路径,与容器内路径一致 ports: - 8000:8000 env_file: - .env depends_on: - pgdb
6. 重启容器生效
修改完成后,重新构建并启动容器:
docker-compose down docker-compose up --build
内容的提问来源于stack exchange,提问作者firstTimer
相关产品推荐
相关产品推荐

