Думаю, это знакомая ситуация, когда вы решили создать какой-то сервис, написали первичный код, завернули это в контейнер, запустили в docker или в kubernetes, и все заработало...но вам понадобилось поменять код, ведь вы собираетесь вести активную разработку - изменять файлы, добавлять новые зависимости и так далее, не хотелось бы каждый раз вручную собирать или синхронизировать файлы, т.к. это занимает много времени. К счастью мир не стоит на месте, и уже есть несколько инструментов, которые позволят вам решить эту задачу, и ниже я вам расскажу о некоторых из них с примерами и кодом.

skaffold/tile конфигурации настроены для kubernetes, самый простой способ развернуть у себя локальный кластер - это docker desktop, заходим в настройки и отмечаем галочкой Enable Kubernetes или же можем воспользоваться minikube

Docker compose watch

Пожалуй, стоит начать с самого простого, как инструмента, так и конфигурации - это Docker compose watch, которая стала доступна начиная с версии 2.22.
Watch можно использовать, чтобы отслеживать изменения в файлах и выполнить одно из трех действий:

  1. Sync - синхронизирует изменения в файле с файлом в контейнере.

  2. Rebuild - запускает процесс сборки образа и заменяет уже запущенный контейнер новым

  3. Sync + Restart - синхронизирует изменения и перезапускает контейнер

Пример:

https://github.com/idsulik/local-dev/blob/main/compose.yaml

На примере выше можно увидеть простой конфиг для docker compose, но нам интересен ключ watch, где указано, что если поменялся файл web/package.json, нужно запустить пересборку, т.к. нужно обновить зависимости и перезапустить процесс, но если изменилось что-то другое в папке web, то запускаем процесс синхронизации, а npm start внутри контейнера увидит эти изменения и обновит сервис.

Запускать в режиме watch очень легко, нужно запустить следующую команду:

docker compose watch
Пример работы docker compose watch
Пример работы docker compose watch

Это простой пример показывает, как легко можно запустить контейнер и синхронизировать изменения на лету, более подробную информацию про эту возможность читайте на официальном сайте https://docs.docker.com/compose/file-watch/


Skaffold

Следующий на очереди Skaffold, прекрасный инструмент, которым пользуюсь в течение последних двух лет, работает стабильно, имеет довольно обширный функционал, но в рамках данной статьи рассмотрим только команду skaffold dev, которая автоматически отслеживает изменения и синхронизирует их в kubernetes pod.

Пример:

https://github.com/idsulik/local-dev/blob/main/deploy/skaffold.yaml

На примере выше можно увидеть простую конфигурацию, где указан путь до Dockerfile и путь до k8s manifest-а, в конфиге sync выбран тип manual, который говорит о том, что путь до директории, который нужно синхронизировать, мы укажем сами, что и сделано(синхронизируем изменения в локальной папке web в /app папку контейнера).
Для запуска в режиме разработки(в этом режиме отслеживаются и синхронизируются изменения) нужно запустить команду:

skaffold run -f deploy/skaffold.yaml --port-forward=pods
Пример работы skaffold dev
Пример работы skaffold dev

Это не все возможности Skaffold, это очень мощный инструмент, который можно использовать как для локальной разработки, так и на продакшне, более подробную информацию можете прочитать на официальном сайте https://skaffold.dev/docs/


Tilt

Последний, но не по важности, инструмент Tilt, с которым у меня практически нет опыта, но на github более 7k звездочек и они присоединились к Docker, что звучит многообещающе.

Пример:

https://github.com/idsulik/local-dev/blob/main/deploy/Tiltfile

У этого инструмента свой формат файла и для подсветки синтаксиса в intellij idea можно воспользоваться этим репозиторием https://github.com/tilt-dev/tiltfile.tmbundle, на скрине можно увидеть 3 функции:
1. k8s_yaml - указываем путь до k8s manifest
2. docker_build - указываем данные для сборки и, интересная часть live_update, где указываем, что нужно синхронизировать и какую команду нужно запустить, если изменился какой-то файл
3. k8s_resource - тут указаны название ресурса и порт, который хотим прокинуть

Запуск довольно простой:

tilt up -f deploy/Tiltfile
Пример работы title up
Пример работы title up

Как и с другими инструментами, это лишь простой пример применения tilt, который способен на большее, подробности можете прочесть на официальном сайте https://docs.tilt.dev/


Если вы знаете другие инструменты, которыми вы пользуетесь или пользовались, просьба отписаться в комментариях, по возможности буду обновлять пост с примерами других инструментов.

Все исходники можно найти тут

p.s. если вам нужна отдельная утилита, которая отслеживает изменения и синхронизирует в контейнер пода, то рекомендую skasync(https://github.com/konrin/skasync), можно использовать вкупе с skaffold и не только.

Комментарии (6)


  1. Tony-Sol
    15.01.2024 08:15
    +3

    Раньше, при локальной разработке, просто создавал volume с маунтом на директорию с проектом и не нужно было делать дополнительную синхронизацию.

    Потом перешел на синхронизацию файлов с помощью mutagen.

    С тех пор, насколько мне известно, mutagen стал частью docker и compose watch работает как раз через него.


    1. idsulik Автор
      15.01.2024 08:15

      Не слышал про mutagen, но вижу, что действительно mutagen стал частью Docker https://www.docker.com/blog/mutagen-acquisition/


  1. grinsv
    15.01.2024 08:15

    Мне кажется, для разработки проще volume прокинуть. Но тогда получается, нужны разные версии Dockerfile для разработчиков и для деплоя, так?


    1. idsulik Автор
      15.01.2024 08:15

      А что делать, если нужен ребилд? делать ручную?) рабочий вариант, но устаревший, тк появился более удобный метод, автоматизированный.

      Отдельный Dockerfile наверно зависит от самого Dockerfile, где-то нужен, где-то нет


  1. Rapira2388
    15.01.2024 08:15

    Каждый раз делал новый докер образ и контейнер, спасибо что просветили. Docker watch выглядит весьма удобно и быстро.


    1. idsulik Автор
      15.01.2024 08:15

      Я раньше тоже также делал, теперь планирую использовать watch) для докер уже пользуюсь skaffold dev и полет отличный