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

Docker Compose部署Django项目时容器文件未更新的问题

问题描述

我基于Nginx和uWSGI搭建了Django项目,现在尝试用Docker Compose维护项目时遇到异常:单独使用docker build构建Django应用容器时,本地修改的文件能正常同步到镜像中;但通过Docker Compose启动服务时,容器内的文件无法更新(具体是django_app/my_app/template/pattern_form.html.j2的变更始终无法在容器中体现)。

我的配置文件

Dockerfile

FROM python:3.10-alpine

# Install Imagemagick package
# gcc and more are required to build the uswgi wheel
RUN apk add imagemagick imagemagick-dev imagemagick-pdf gcc python3-dev build-base linux-headers pcre-dev curl

# set environment variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

COPY requirements.txt /

RUN pip install -r requirements.txt

COPY django_app/ /app

COPY uwsgi.ini /

WORKDIR /app

RUN python ./manage.py migrate
RUN python ./manage.py collectstatic --noinput

docker-compose.yml

services:
  redis:
    image: redis:7-alpine

  celery_worker:
    build:
      context: .
      dockerfile: ./Dockerfile
    image: celery
    command: celery -A bg_upgrades worker -l info
    env_file:
      - ./docker_env
    depends_on:
      - redis

  uwsgi:
    build:
      context: .
      dockerfile: ./Dockerfile
    image: uwsgi
    env_file:
      - ./docker_env
    command: uwsgi --ini /uwsgi.ini
    volumes:
      - django_app:/app/
      - socket:/sock/
    depends_on:
      - redis

  nginx:
    build:
      context: ./nginx
      dockerfile: ./Dockerfile
    volumes:
      - django_app:/app/
      - socket:/sock/
    depends_on:
      - redis
      - uwsgi
      - celery_worker
    ports:
      - 80:80

volumes:
  django_app:
  socket:
已尝试的解决方法
  • docker compose up -d --build --force-recreate
  • docker compose build --no-cache
  • 在Docker UI中删除所有容器和镜像
  • 修改docker-compose.yml中的镜像名称
  • 在Dockerfile的COPY指令前添加RUN rm -Rf /app/*命令
  • 重启前执行docker compose down
问题原因及解决方案

问题核心是Docker Compose中使用的命名卷django_app会覆盖容器内的/app目录:
第一次启动时,命名卷会从镜像复制/app的初始内容,但后续即使镜像更新,卷内的旧内容仍会优先挂载到容器,导致新代码无法生效。

场景1:开发环境(需要实时同步本地代码)

将命名卷替换为绑定挂载,直接映射本地代码目录到容器:
修改docker-compose.yml中uwsgi和nginx服务的volumes配置:

services:
  uwsgi:
    # 保留其他配置
    volumes:
      - ./django_app:/app/  # 替换命名卷为本地目录映射
      - socket:/sock/
  nginx:
    # 保留其他配置
    volumes:
      - ./django_app:/app/  # 同样替换为本地目录映射
      - socket:/sock/

同时删除文件末尾volumes下的django_app:定义。

本地修改的文件会实时同步到容器,无需重新构建镜像。

场景2:生产环境(依赖镜像内的代码)

直接移除django_app命名卷的挂载,让容器使用镜像内的代码:
修改docker-compose.yml中uwsgi和nginx服务的volumes配置:

services:
  uwsgi:
    # 保留其他配置
    volumes:
      - socket:/sock/  # 仅保留socket卷
  nginx:
    # 保留其他配置
    volumes:
      - socket:/sock/  # 仅保留socket卷

并删除文件末尾volumes下的django_app:定义。

后续更新代码后,执行docker compose build --no-cache重新构建镜像,再启动服务即可。

额外操作(若之前已创建过命名卷)

需要先删除旧的命名卷才能让新配置生效:

docker volume rm 你的项目名称_django_app

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:33:11