Как мы создаем, распространяем и запускаем приложения, кардинально изменилось в эпоху Docker. Docker Compose, мощный инструмент для управления многоконтейнерными приложениями Docker, дополнительно усилил это преобразование. Теперь, с введением функции “watch”, целью становится еще большее упрощение процесса разработки.

С включенной функцией “watch”, Docker Compose может автоматически обновлять активные службы, когда вы вносите изменения и сохраняете свой код. Это означает, что службы обновляют себя в реальном времени, по мере вашей работы, что делает процесс разработки еще более эффективным.

Использование функции “Watch”

В Docker Compose атрибут watch устанавливает набор правил для автоматического обновления служб на основе локальных изменений файлов. Каждое правило требует как шаблон пути, так и действие, которое следует выполнить при обнаружении изменения. Для watch доступны два действия: sync и rebuild.

Sync

Когда действие установлено на sync, Docker Compose гарантирует, что любые изменения файлов на вашем хосте немедленно отражаются в соответствующем контейнере службы. Это особенно полезно для фреймворков, поддерживающих “Hot Reload” или подобные функции. Правила sync часто могут заменить bind mounts во многих сценариях разработки, обеспечивая более тонкую степень контроля над отслеживаемыми файлами и директориями.

Rebuild

Когда действие установлено на rebuild, Docker Compose автоматически использует BuildKit для создания нового образа, заменяя текущий контейнер службы. Это поведение идентично выполнению docker compose up --build <svc>. Это действие идеально подходит для компилируемых языков или изменений в определенных файлах, которые требуют полного пересоздания образа.

Настройка функции “Watch”

Чтобы использовать функцию “watch”, вам нужно включить секции watch для одной или нескольких служб в вашем файле compose.yml. После этого вы можете запустить проект Compose с помощью docker compose up --build --wait и инициировать режим наблюдения за файлами, выполнив docker compose alpha watch. Docker Compose затем автоматически обрабатывает обновления в соответствии с вашими настройками watch, когда вы редактируете исходные файлы своих служб.

В этой конфигурации действие sync отслеживает директорию ./web на вашем хосте. Любые изменения синхронизируются с соответствующей директорией /src/web в вашем Docker контейнере, за исключением изменений, сделанных в директории node_modules/.

С другой стороны, действие rebuild отслеживает файл package.json. Если этот файл изменяется каким-либо образом, Docker Compose пересобирает образ и заменяет активный контейнер службы.

После того как вы настроите конфигурацию watch, запустите свой проект Docker Compose, используя docker compose up --build --wait, затем выполните команду docker compose alpha watch для активации режима наблюдения за файлами. Docker Compose теперь будет автоматически синхронизировать или пересобирать вашу службу каждый раз, когда вы сохраняете изменение в файле в директории web/ или файле package.json, соответственно.

Этот минимальный пример нацелен на приложение Node.js со следующей структурой:

myproject/
├── web/
│   ├── App.jsx
│   └── index.js
├── Dockerfile
├── compose.yaml
└── package.json
services:
  web:
    build: .
    command: npm start
    x-develop:
      watch:
        - action: sync
          path: ./web
          target: /src/web
          ignore:
            - node_modules/
        - action: rebuild
          path: package.json

Следуйте инструкциям на dockersamples/avatars для быстрого запуска небольшого демо-приложения, как показано ниже:

git clone https://github.com/dockersamples/avatars.git
cd avatars
docker compose up -d
docker compose alpha watch

Откройте http://localhost:5735 в вашем браузере.

Заключение

Новая функция “watch” в Docker Compose представляет собой обнадеживающий шаг к более простому и эффективному процессу разработки. Отслеживая ваши файлы и реагируя на изменения, Docker Compose позволяет разработчикам больше сосредоточиться на своем коде, а не на административных задачах построения и синхронизации их Docker-сервисов.

В дополнение к предоставленному примеру на Node.js, этот метод можно применить к другим языкам и фреймворкам. Например, исходные файлы Python для проекта Flask могут быть синхронизированы, а изменение файла requirements.txt вызовет пересборку.

Следуя лучшим практикам, всегда проверяйте, что ваш Dockerfile оптимизирован для быстрых инкрементных пересборок. Этого можно достичь с помощью многостадийных сборок и кэширования слоев образов. Кэширование слоев использует тот факт, что если в слоях вашего Dockerfile не производилось изменений, последующие сборки могут их повторно использовать.

Функция “watch” в Docker Compose определенно облегчает процесс разработки. Эта функция, вместе с постоянными улучшениями, которые Docker регулярно внедряет, помогает увеличить популярность и принятие этого инструмента контейнеризации.

Помните, что гибкость Docker - вот что делает его таким надежным. Это проявляется в функции “watch”, которая предоставляет возможность разработки без участия пользователя, тем самым повышая продуктивность. Будь вы разработчиком маленького приложения или большой распределенной системы, функция “watch” может стать тем решающим фактором, который вам нужен.

Как и с многими инструментами, лучший способ понять функцию “watch” в Docker Compose - это использовать ее. Счастливого кодинга!

Мои услуги

💼 Загляните в мой каталог услуг и узнайте, как мы можем сделать вашу технологическую жизнь лучше. Будь то повышение эффективности вашей IT-инфраструктуры, развитие вашей карьеры или расширение технологических горизонтов — я здесь, чтобы помочь вам достичь ваших целей. От DevOps-трансформаций до сборки игровых компьютеров — давайте сделаем ваши технологии непревзойденными!

Пополнить запасы кофе автора

💡 Telegram | Boost
💖 PayPal
🏆 Patreon
💎 GitHub
🥤 BuyMeaCoffee
🍪 Ko-fi

Владимир Михалев
Я - Владимир Михалев, Капитан Docker, но друзья могут называть меня Вальдемарыч.

DevOps комьюнити

Привет! 👋 Если у тебя есть вопросы по установке или настройке, то задайте их мне и другим IT-экспертам нашего сообщества: