У меня есть проект 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
Я думаю, что лучший подход — использовать многоэтапную сборку, аналогичную тому, что предлагается здесь? Однако я не уверен, как это реализовать.
Примеры Dockerfile в ответе Марка О'Коннора на вопрос, на который вы ссылаетесь, должны быть очень близки к тому, что вам нужно. Это многоэтапные сборки, потому что в них есть несколько FROM
s. На первом этапе используется базовый образ, который уже содержит 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
Вы можете сказать сделать все это в 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. Я бы прочитал о лучших практиках, связанных с этим.
Это было очень полезно, но я совсем запутался, так как мой java-проект состоит из нескольких модулей, поэтому я не могу просто скопировать src?