Добавление шагов сборки Maven в файл докера для Java Jar?

У меня есть проект Java, который создает файл jar, который затем запускается на сервере Jboss EAP. Файл jar создается с помощью команды maven:

mvn clean install

В настоящее время я создаю jar вручную, используя maven, а затем добавляю его в свой dockerfile следующим образом:

# rest of dockerfile...

EXPOSE 8080 9990
ADD app.jar "/opt/jboss/jboss-eap-6.2/standalone/deployments/"

RUN ["chmod", "+rx", "/opt/jboss/jboss-eap-6.2/"]
ENTRYPOINT ["sh","/opt/jboss/jboss-eap-6.2/bin/standalone.sh"]

Как я могу добавить команду maven в свой dockerfile, чтобы разработчику не нужно было сначала устанавливать maven и собирать его самостоятельно?

то есть шаги будут просто:

1. checkout the code from git
2. run dockerfile

Я думаю, что лучший подход — использовать многоэтапную сборку, аналогичную тому, что предлагается здесь? Однако я не уверен, как это реализовать.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
1 254
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Примеры Dockerfile в ответе Марка О'Коннора на вопрос, на который вы ссылаетесь, должны быть очень близки к тому, что вам нужно. Это многоэтапные сборки, потому что в них есть несколько FROMs. На первом этапе используется базовый образ, который уже содержит maven, поэтому его не нужно устанавливать: FROM maven:3.6.0-jdk-11-slim AS build.

Затем ваш текущий файл Dockerfile становится вторым этапом, но вам нужно будет заменить ваш ADD app.jar ... на COPY, который выбирает файл из этапа build. Что-то вроде

COPY --from=build /path/to/mvn/output/app.jar \
        /opt/jboss/jboss-eap-6.2/standalone/deployments/

--from=build относится к AS build с более ранней стадии. Никакие другие файлы со стадии сборки не будут скопированы на более поздние этапы, поэтому окончательное изображение будет состоять только из слоев с последнего FROM и далее.

Редактирование для добавления: чтобы решить вопрос о том, как это предотвращает необходимость выполнения другим пользователем какой-либо сборки и установки вручную: вместо этого это может сделать новый пользователь. Предполагая, что Dockerfile находится в корне вашего проекта git.

git clone <url> your-app
docker build -t your-img your-app # builds all stages
docker run --rm -it your-img      # runs whatever the final stage produced

Это было очень полезно, но я совсем запутался, так как мой java-проект состоит из нескольких модулей, поэтому я не могу просто скопировать src?

java12399900 23.12.2020 12:51

Вы можете сказать сделать все это в Dockerfile! Вы можете сначала предоставить инструкции по установке maven внутри Dockerfile, а затем запустить любую команду, которая вам нужна, из установленного maven.

Например,

RUN cd /usr/local && wget -O- http://mirror.ox.ac.uk/sites/rsync.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz | tar -xzf -

установить maven 3.6.3, а затем запустить команду, которая делает то, что вам нужно, будь то чистый maven или что-то еще.

Я только что предоставил приведенную выше команду, потому что она у меня лежала, но если нужная вам версия доступна в yum, другим способом было бы просто использовать любой установленный менеджер пакетов. Нравится RUN yum --assumeyes install ________.

Вы должны быть в состоянии сделать что-то подобное с Git. Я бы прочитал о лучших практиках, связанных с этим.

Другие вопросы по теме