Как хранить зависимости maven внутри образа докера с помощью файла Dockerfile

поэтому я делаю приложение для весенней загрузки, которое я должен вставлять и запускать из контейнера докеров, и я хотел бы создать весь образ, используя файл докера.
я использую этот dockerFile:

FROM openjdk:8-jdk-alpine
ADD . /analytics-service
WORKDIR /analytics-service
ENTRYPOINT ./mvnw spring-boot:run 

когда я создаю образ, он просто копирует файлы, и только после того, как я его запускаю, он начинает загружать все зависимости maven. что занимает некоторое время, учитывая, что я буду запускать несколько контейнеров. так как мне это сделать? я хочу, чтобы он получал все зависимости при создании образа, поэтому, когда я создаю контейнер, он не начинает загрузку.

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

Ответы 1

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

Если я правильно вас понял, вы хотели бы сначала загрузить зависимости Maven, а затем объединить их с вашим приложением в образ?

Если это то, что вы хотите, то правильный способ сделать это выглядит следующим образом:

  1. Вытяните изображение maven (обычно вы называете этот этап «строитель» - это просто имя)
  2. Скопируйте файл pom.xml в рабочий каталог.
  3. Запустите maven один раз, чтобы получить свои зависимости, а затем еще раз, чтобы упаковать их.
  4. Создайте новую базу изображений из openjdk
  5. Скопируйте результат шага 3 в изображение вашего приложения.
  6. Откройте порт
  7. Обеспечьте точку входа

Вот как это выглядит в Dockerfile:

FROM maven AS builder
WORKDIR /usr/src/analytics
COPY pom.xml .
RUN mvn -B dependency:go-offline

COPY . .
RUN mvn package

FROM openjdk:8-jdk-alpine
WORKDIR /analytics-service
COPY --from=builder /usr/src/analytics/target/YOUR_JAR_FILENAME.jar .
EXPOSE 80
ENTRYPOINT ["java", "-jar", "/analytics-service/YOUR_JAR_FILENAME.jar"]

Вам нужно знать, как называется ваш jar-файл, прежде чем запускать это. Вы можете запустить пакет mvn вне Docker на своем компьютере и увидеть сгенерированное имя файла. Скопируйте это в два места выше в Dockerfile.

Должен ли я упаковать его в банку? Есть ли способ просто создать контейнер, получить зависимости от него до вызова команд ENTRYPOINT? Сейчас он работает так, что когда я создаю образ, он имеет только код, но когда он запускается, он начинает тянуть зависимости, я хочу, чтобы образ, созданный файлом докера, имел зависимости от него. Я знаю, что ваше решение делает это, но есть ли способ без упаковки в банку?

Grim Ranger 07.05.2022 04:27

Да, команда RUN mvn -B dependency:go-offline сделает это за вас. Если вы запустите это, maven позаботится о том, чтобы у вас было все (в соответствии с вашим файлом pom.xml), и не будет загружать зависимости при запуске вашего приложения.

Andrew 07.05.2022 04:49

хорошо, отлично, а могу я просто добавить эту команду в файл докера в своем посте перед командой ENTRYPOINT? или мне нужно получить изображение maven? как именно будет dockerfile? спасибо

Grim Ranger 07.05.2022 04:57

Я считаю, что есть способ делать то, что вы хотите, без .jar, но это может быть немного громоздко. Мое предложение состоит в том, чтобы все было упаковано в .jar, а затем запущено. Следует иметь в виду, что вы используете mvw в своем исходном файле Dockerfile. mvw — это оболочка для maven, что означает, что вы загружаете его каждый раз, когда запускаете свой контейнер. Это может быть тем, что также вызывает у вас проблемы. В идеале вы должны создать базовый образ из maven (как в моем файле Docker выше), установить свои зависимости, упаковать его в файл jar, а затем превратить его в собственный образ.

Andrew 07.05.2022 05:29

ок буду разбираться дальше, спасибо за помощь

Grim Ranger 07.05.2022 05:38

эй, не уверен, что ты все еще здесь, но кажется, что когда я упаковываю свое приложение в банку и копирую его в контейнер, он, кажется, не видит JSP, есть идеи?

Grim Ranger 08.05.2022 03:01

Я не очень хорошо разбираюсь в JSP, но посмотрите, поможет ли это: stackoverflow.com/questions/21243690/…

Andrew 08.05.2022 08:10

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