У меня есть пара вопросов, связанных с использованием Docker на этапе разработки.
Я собираюсь предложить три различных сценария использования Docker в среде разработки. Представим, что мы создаем REST API в Java и Spring Boot. Для этого мне понадобится база данных MySQL.
Первый сценарий - это создание docker-compose для разработки с контейнером MySQL и производственного docker-compose с MySQL и Java-приложением (jar) в другом контейнере. Для разработки я запускаю docker-compose-dev.yml, чтобы запустить только базу данных. Приложение запускается и отлаживается с помощью IDE, например, IntelliJ Idea. Любые изменения, внесенные в код, IDE распознает и перезапустит приложение, применив изменения.
Второй сценарий должен иметь как для среды разработки, так и для производственной среды docker-compose с контейнерами базы данных и приложений. Таким образом, каждый раз, когда я вношу изменения в код, я должен перестраивать изображение, чтобы изменения загружались в изображение, а контейнеры снова запускались. Этот сценарий может быть наиболее типичным и использоваться для разработки с помощью Docker, но он кажется очень медленным из-за необходимости перестраивать образ каждый раз, когда происходит изменение.
Третий сценарий представляет собой смесь двух предыдущих. Два docker-compose. Docker-compose для разработки содержит оба контейнера, но с механизмами, которые позволяют выполнять перезагрузку приложения в реальном времени, отображать тома и использовать, например, Spring Dev Tools. Таким образом, контейнеры запускаются, и в случае любого изменения в файлах контейнер приложения обнаружит изменение и будет перезапущен. Для производства docker-compose будет создаваться просто с обоими контейнерами, но без функции live reload. На мой взгляд, это был бы идеальный сценарий, но я думаю, что он очень зависит от используемых технологий, поскольку не все допускают перезагрузку в реальном времени.
Вопросы следующие.
Какой из этих сценариев наиболее типичен при использовании Docker для фазы?
Хорошо ли рассмотрен сценарий 1? То есть докеризуйте только внешние службы, такие как базы данных, очереди и т. Д., И выполняйте разработку и отладку приложения с помощью IDE, не используя для этого Docker.
Сомнения и сценарии, которые я поднимаю, возникли после того, как я поднял проблему, имеющуюся в сценарии 2. При каждом изменении кода необходимость перестраивать образ и снова запускать контейнеры - значительная трата времени. Короче говоря, возникает вопрос: как этого избежать?
Спасибо заранее за ваше время.
ПРИМЕЧАНИЕ. Это может быть вопрос, требующий отдельного мнения, но было бы неплохо узнать, как разработчики обычно решают эти проблемы.