Как использовать локальный репозиторий maven в многоэтапной сборке докеров?

Я пытался создать многоэтапную сборку докеров для моего весеннего загрузочного приложения. Проблема заключается в каждом изменении в основной ветке, файл pom.xml изменяется (благодаря плагину выпуска maven), поэтому сложно использовать кеш сборки докеров на этапе сборки, и все зависимости будут загружаться каждый время, когда я запускаю сборку. Насколько я знаю, я не могу монтировать тома во время сборки образа. Экспериментальная версия докера позволяет монтировать тома во время сборки, но она все еще экспериментальная, поэтому я стараюсь ее избегать.

Поэтому я решил попытать счастья с docker-compose, где первый сервис запустит «mvn package» внутри контейнера и создаст jar-файл внутри общего тома, который затем будет использоваться вторым сервисом для создания собственного образа ( в основном добавляя этот jar в свой образ), который будет опубликован в Docker Hub. Все, что я пытался сделать, казалось неправильным. Я не очень разбираюсь в docker-compose, но правильный ли это подход?
Я использую Docker version 18.09.0, build 4d60db4

version: '3'
#Specify all the services you want to create
services:
  #service name
  build-service:
    context: .
    dockerfile: Dockerfile-build
    volumes:
      - ./:/usr/app
      - "$(HOME)"/.m2:/usr/mvn/.m2
  spring-app:
    conext: .
    dockerfile: Dockerfile-jar
    volumes:
      - ./:/usr/app

Есть ли способ использовать локальный репозиторий .m2 на первом этапе. Или любые другие предложения приветствуются.


person omjego    schedule 12.08.2019    source источник
comment
см. stackoverflow.com/a/52129134/2746335   -  person caduceus    schedule 31.03.2020


Ответы (1)


Короткий ответ: вы не можете. Единственный способ использовать репозиторий maven во время сборки — это скопировать его внутрь образа на первом этапе. Но вы не можете этого сделать, потому что обычно расположение репозитория maven находится вне вашего контекста сборки. Конечно, вы можете изменить это для своего проекта (поместите папку .m2 в свой текущий проект), и тогда этот подход может сработать. Я не рекомендую этот подход, я просто упоминаю его как вариант.

Однако я думаю, что вы можете решить свою проблему, следуя рекомендациям не использовать Docker во время разработки. Хотя Docker — отличный инструмент, он замедляет разработку. Сборка и отправка образа должны быть делегированы вашему конвейеру CI/CD (Jenkins, Gitlab CI и т. д.). В повседневной деятельности лучше и быстрее просто запускать сборки maven локально.

person Mihai    schedule 13.08.2019