поэтому я делаю приложение для весенней загрузки, которое я должен вставлять и запускать из контейнера докеров, и я хотел бы создать весь образ, используя файл докера.
я использую этот dockerFile:
FROM openjdk:8-jdk-alpine
ADD . /analytics-service
WORKDIR /analytics-service
ENTRYPOINT ./mvnw spring-boot:run
когда я создаю образ, он просто копирует файлы, и только после того, как я его запускаю, он начинает загружать все зависимости maven. что занимает некоторое время, учитывая, что я буду запускать несколько контейнеров. так как мне это сделать? я хочу, чтобы он получал все зависимости при создании образа, поэтому, когда я создаю контейнер, он не начинает загрузку.




Если я правильно вас понял, вы хотели бы сначала загрузить зависимости Maven, а затем объединить их с вашим приложением в образ?
Если это то, что вы хотите, то правильный способ сделать это выглядит следующим образом:
Вот как это выглядит в 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.
Да, команда RUN mvn -B dependency:go-offline сделает это за вас. Если вы запустите это, maven позаботится о том, чтобы у вас было все (в соответствии с вашим файлом pom.xml), и не будет загружать зависимости при запуске вашего приложения.
хорошо, отлично, а могу я просто добавить эту команду в файл докера в своем посте перед командой ENTRYPOINT? или мне нужно получить изображение maven? как именно будет dockerfile? спасибо
Я считаю, что есть способ делать то, что вы хотите, без .jar, но это может быть немного громоздко. Мое предложение состоит в том, чтобы все было упаковано в .jar, а затем запущено. Следует иметь в виду, что вы используете mvw в своем исходном файле Dockerfile. mvw — это оболочка для maven, что означает, что вы загружаете его каждый раз, когда запускаете свой контейнер. Это может быть тем, что также вызывает у вас проблемы. В идеале вы должны создать базовый образ из maven (как в моем файле Docker выше), установить свои зависимости, упаковать его в файл jar, а затем превратить его в собственный образ.
ок буду разбираться дальше, спасибо за помощь
эй, не уверен, что ты все еще здесь, но кажется, что когда я упаковываю свое приложение в банку и копирую его в контейнер, он, кажется, не видит JSP, есть идеи?
Я не очень хорошо разбираюсь в JSP, но посмотрите, поможет ли это: stackoverflow.com/questions/21243690/…
Должен ли я упаковать его в банку? Есть ли способ просто создать контейнер, получить зависимости от него до вызова команд ENTRYPOINT? Сейчас он работает так, что когда я создаю образ, он имеет только код, но когда он запускается, он начинает тянуть зависимости, я хочу, чтобы образ, созданный файлом докера, имел зависимости от него. Я знаю, что ваше решение делает это, но есть ли способ без упаковки в банку?