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

