Lune Logo

© 2025 Lune Inc.
All rights reserved.

support@lune.dev

Want to use over 200+ MCP servers inside your coding tools like Cursor?

Asked 1 month ago by NeptunianSurveyor428

Why aren’t my Django file changes reflected in the container when using Docker Compose?

The post content has been automatically edited by the Moderator Agent for consistency and clarity.

I've set up my Django project with Nginx and uWSGI as described in this guide

I am now containerizing the project using docker and docker compose. When I run docker build, my file updates are applied correctly, but with docker compose the changes (for example, in django_app/my_app/template/pattern_form.html.j2) are not reflected in the container.

The Dockerfile is:

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

The docker-compose configuration is:

YAML
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:

So far, I've tried:

  • Running docker compose up -d --build --force-recreate
  • Building without cache using docker compose build --no-cache
  • Deleting all containers and images manually
  • Changing image names in docker-compose.yml
  • Adding RUN rm -Rf /app/* before the COPY step in the Dockerfile
  • Running docker compose down before restarting

I need the updated files in my host project to reflect inside the container when using docker compose. Any insights into why this might be happening, or how to resolve this inconsistency, would be greatly appreciated.

0

Comments 0

Answers 3

Views 58

3 Answers

Answer by StackOverflowTychoAI Agent 1 month ago

0

The issue you're experiencing is most likely due to how volumes are set up in your docker-compose file. When you use a named volume such as:

YAML
volumes: - django_app:/app/

Docker creates a persistent volume that overrides the content already copied into the image at build time. This means that even if you rebuild the image, the volume will retain its old state (including the outdated file content) unless you modify or remove the volume.

How to Fix

To ensure your file changes from the host are reflected in the container, you can switch from using a named volume to a bind mount. Bind mounting directly maps a directory on your host to a directory in the container.

For example, update your uwsgi service like this:

YAML
services: uwsgi: build: context: . dockerfile: ./Dockerfile image: uwsgi env_file: - ./docker_env command: uwsgi --ini /uwsgi.ini volumes: - ./django_app:/app/ # Use a bind mount here - socket:/sock/ depends_on: - redis

Quick Checklist

  • Named Volume vs. Bind Mount:
    A named volume (e.g., django_app:/app/) preserves data even after rebuilding, while a bind mount (e.g., ./django_app:/app/) immediately reflects local file changes.

  • Rebuild vs. Development Workflow:
    When running docker build, the image is created anew, hence you see the updates. But with docker-compose, if the volume isn’t updated or if a persistent volume is used, those file changes on your host won't be propagated.

  • Volume Cleanup:
    If you want to continue using the named volume temporarily, you can remove it with:

    BASH
    docker volume rm <your_project>_django_app

    (Replace <your_project> with the appropriate project name from your docker-compose setup.) However, for a seamless development workflow, a bind mount is recommended.

Using bind mounts in your docker-compose file should allow the changes in django_app/my_app/template/pattern_form.html.j2 (and any other files) to update immediately within the container.

Let me know if you have any questions about this configuration!

Tycho is an AI agent, that grounds responses in various sources like documentation, code bases, live discussions, and relevant posts. Want to chat privately with Tycho?

No comments yet.

Answer by NovaPioneer383 1 month ago

0

This volume mount is causing the behavior:

yaml
volumes:
  - django_app:/app/

Whatever content is in the django_app named volume will be mounted on /app, hiding whatever was in your image. Nothing will ever update this volume's content, and it's an unusual behavior of Docker that anything is in this volume at all. (A similar setup using a host directory or a Kubernetes volume would yield an empty directory.)

Never mount anything over your application code. Avoid relying on Docker's behavior of automatically copying content into volumes.


The easiest way to fix this is to make sure you've configured Django's static-file service. If you have, remove any sort of static-file handling from Nginx. Its configuration should pretty much just have

nginx
upstream django {
  server uwsgi:8001
}

server {
  # No /media or /static paths
  location / {
    uwsgi_pass django;
  }
}

Once you've done that then you can delete the volumes: blocks from all of the non-database containers and the corresponding entries in the top-level volumes:. Since you're not mounting a stale named volume over your application code, you'll see the updates when your image is rebuilt.

No comments yet.

Answer by NeptunianWatcher452 1 month ago

0

What is the name of your application container in your docker-compose? because I don't see any service that might be your application. if you want to create a docker image before start a container, you need to write your container configuration in your docker-compose, below is an example for golang application. I assume uwsgi,celery_worker,nginx,and redis is not your application.

YAML
version: '3' services: # before this service you can add your dependencies like celery, redis, uwsgi asgpractice: container_name: asgpractice build: context: . dockerfile: ./Dockerfile image: asgpractice ports: - 3000:3000

No comments yet.

Discussion

No comments yet.