Этот проект демонстрирует возможности docker compose watch для более удобной разработки с автоматической синхронизацией изменений, позволяя сосредоточиться на создании кода, а не на ручном перезапуске контейнеров.
docker compose watch - это функция Docker Compose, которая позволяет автоматически:
- Синхронизировать изменения файлов между локальной машиной и контейнерами
- Перезапускать сервисы при необходимости
- Пересобирать контейнеры при важных изменениях (например, в зависимостях)
Основное преимущество: вам не нужно вручную перезапускать или пересобирать контейнеры при внесении изменений в код!
- Docker Engine версии 23.0 или выше
- Docker Compose версии 2.22.0 или выше
Проверьте ваши версии:
docker --version
docker compose version.
├── docker-compose.yml # Конфигурация Docker Compose с настройками watch
├── app/ # FastAPI приложение
│ ├── Dockerfile # Сборка приложения
│ ├── requirements.txt # Зависимости Python
│ ├── main.py # Код FastAPI
│ └── data/ # Данные приложения
│ └── fake_data.json
└── nginx/ # Nginx для проксирования
├── Dockerfile # Сборка Nginx
└── nginx.conf # Конфигурация Nginx
git clone <ссылка-на-репозиторий>
cd docker-compose-watch-demodocker compose watchПри первом запуске Docker соберет образы и запустит контейнеры, затем начнет отслеживать изменения в режиме реального времени.
В файле docker-compose.yml мы используем секцию develop.watch, где указываем, что нужно делать при изменениях файлов:
develop:
watch:
# Пример для app сервиса
- action: sync # Только синхронизация файлов
path: ./app # Локальный путь
target: /app # Путь в контейнере
- action: rebuild # Пересборка контейнера
path: ./app/requirements.txt
# Пример для nginx сервиса
- action: sync+restart # Синхронизация + перезапуск
path: ./nginx/nginx.conf
target: /etc/nginx/conf.d/default.confsync- синхронизирует изменённые файлы без перезапуска (идеально для кода с hot-reload)rebuild- пересобирает контейнер при изменении важных файлов (Dockerfile, зависимости)sync+restart- синхронизирует файлы и перезапускает сервис (для конфигураций)
После запуска ваше приложение будет доступно:
- FastAPI напрямую: http://localhost:8000
- Через Nginx: http://localhost:8070
Запросы проксируются следующим образом:
- Основной API: http://localhost:8070/api
- Документация API: http://localhost:8070/docs
- WebSocket (если используется): http://localhost:8070/ws
- Статические файлы: http://localhost:8070/static
- Откройте
app/main.py - Измените текст в функции
read_root(), например:def read_root(): return { "message": "Привет из Docker Compose Watch!", # другие поля... }
- Сохраните файл
- Обновите страницу в браузере - изменения применятся автоматически!
- Откройте
app/requirements.txt - Добавьте новую зависимость, например:
python-dotenv==1.0.0 - Сохраните файл
- Docker автоматически пересоберет контейнер с приложением
- Откройте
nginx/nginx.conf - Измените или добавьте комментарий в конце файла:
# Docker Compose Watch - это очень удобно! - Сохраните файл
- Nginx автоматически перезагрузит конфигурацию
- Что происходит: Измененные файлы копируются в контейнер без его перезапуска
- Когда использовать: Для кода с поддержкой hot-reload (как в нашем FastAPI приложении)
- Пример в проекте: Изменения в
app/main.py
- Что происходит: Контейнер полностью пересобирается заново
- Когда использовать: При изменении зависимостей, Dockerfile или других критичных файлов
- Пример в проекте: Изменения в
app/requirements.txt
- Что происходит: Файлы синхронизируются, а затем сервис перезапускается
- Когда использовать: Для конфигурационных файлов, требующих перезапуска сервиса
- Пример в проекте: Изменения в
nginx/nginx.conf
- action: sync
path: ./app
target: /app
ignore:
- "__pycache__" # Игнорируем кэш Python
- "*.pyc" # Игнорируем скомпилированные файлы
- "*.log" # Игнорируем логиdocker compose watch --no-attachНажмите Ctrl+C в терминале, где запущен docker compose watch
- Проверьте пути в
pathиtarget- они должны быть указаны правильно - Убедитесь, что у файлов правильные права доступа
- Проверьте логи контейнера:
docker logs fastapi_app
- Убедитесь, что оно запущено с флагом
--reload(для uvicorn) - Это уже настроено в нашем Dockerfile:
CMD ["uvicorn", "main:app", "--reload"]