Как заставить контейнер 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