Как заставить контейнер docker обновляться при изменении исходных файлов?

Я создаю Django/React приложение с помощью docker-compose, и я хотел бы, чтобы оно перезагружало мои приложения при изменении, до сих пор я пробовал добавлять CHOKIDAR_USEPOLLING, добавить npm-watch в мой package.json, но он, похоже, не может обнаружить изменения в файле host.

В идеале я не хочу запускать docker-compose up --build каждый раз, когда я вношу изменения, поскольку это делает разработку утомительной.

edit: я должен упомянуть, что оба приложения перезагружаются при запуске вне docker (npm start (cra по умолчанию) и python manage.py runserver), как и ожидалось, только не внутри контейнеров

Есть ли что-то не так с моими файлами или что-то еще, что я должен сделать здесь?

docker-compose.yml

version: "3.9"
   
services:
  db:
    container_name: db
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  backend:
    container_name: backend
    build: ./backend
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/core
    ports:
      - "8000:8000"
    depends_on:
      - db
  frontend:
    container_name: frontend
    build: ./frontend
    command: npm start
    volumes:
      - '.:/frontend/app'
      - '/frontend/node_modules'
    ports:
      - "3000:3000"
    environment:
      # Allow hot reload on edits
      - CHOKIDAR_USEPOLLING=true
    depends_on:
      - backend
    # Enable interactive terminal (crucial for react container to work)
    stdin_open: true 
    tty: true

backend Dockerfile

FROM python:3 
ENV PYTHONUNBUFFERED=1
WORKDIR /code/
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

frontend Dockerfile

FROM node:16

WORKDIR /app/

COPY package*.json /app/

RUN npm install

COPY . /app/

EXPOSE 3000

CMD ["npm", "start"]

Вместо копирования вам следует монтировать тома непосредственно в папку, где вы запускаете код на вашем docker-образе. Таким образом, изменения в коде будут отражены в вашем приложении.

Пример в docker-compose.yml:

volumes:
      - "local_source_destination:/server_source_destination"

В вашем фронтенде docker-compose-yml у вас есть:

    volumes:
  - '.:/frontend/app'

но в вашем Dockerfile есть

COPY . /app/

Похоже, что вы перепутали место монтирования тома. Убедитесь, что '.' находится в корне папки с кодом или измените его соответствующим образом.

Попробуйте что-нибудь вроде:

 volumes:
  - '.:/app'

Похоже, это то место, где ваш сервер хочет разместить ваш код.

Если ваш код правильно смонтирован в нужное место назначения, возможно, вы не запускаете скрипт watch изнутри контейнера docker. Попробуйте запустить:

docker exec -itw source_destination_in_container your_container_name command_to_run_watch
Вернуться на верх