Docker-compose - сборка с maven, которая повторно использует репозиторий maven - PullRequest
0 голосов
/ 31 августа 2018

При создании образа Spring-boot с использованием Maven я теперь делаю это внутри Dockerfile. Maven загрузит все зависимости и затем скомпилирует мои файлы. Это занимает довольно много времени.

Как я могу указать, что процесс сборки через docker-compose (Dockerfile) повторно использует мой репозиторий "Windows10 Home" Maven? Таким образом, количество (новых) загрузок минимально. Мой контекст разработки: я использую терминал быстрого запуска Docker, поэтому использую docker-машину.

Это часть моего файла docker-compose.yml:

version: '3'
services:
  spring-boot-app:
    image: spring-boot-image
    build:
      context: ./
      dockerfile: Dockerfile
    depends_on:
      - mysql-docker-container
    ports:
      - 8087:8080
    volumes:
      - $HOME/.m2/repository:/root/.m2/repository
      - /data/spring-boot-app

Мой Dockerfile:

FROM java:8
FROM maven:alpine
WORKDIR /app
COPY . /app
RUN mvn -v
RUN mvn clean install -DskipTests
EXPOSE 8080
LABEL maintainer=“xyz@holland.nl”
ADD ./target/spring-boot-example-0.0.1-SNAPSHOT.jar /developments/
ENTRYPOINT ["java","-jar","/developments/spring-boot-example-0.0.1-SNAPSHOT.jar"]

1 Ответ

0 голосов
/ 01 сентября 2018

@ Джек Гор - большое спасибо за указание мне пути. Я видел пост, но окончательного ответа еще не было. После погружения во все отдельные ответы информация дала мне как ответ на симптом, так и понимание того, как решать подобные вопросы.

ОТВЕТ : С помощью файла Docker вы можете создавать окончательные изображения с помощью одного или нескольких последующих слоев изображений. Чтобы шаг не перезагружал зависимости каждый раз, вы можете создать слой изображения для «загрузки мира» зависимостей. Повторная загрузка будет выполняться только при изменении зависимости в файле pom.xml.

Чтобы сделать это, вы разбили Dockerfile на 2 этапа сборки: сначала скопируйте файл pom.xml и соберите его. Это создаст слой изображения со всеми зависимостями. В качестве второго шага вы создаете приложение.

FROM java:8
FROM maven:alpine

# image layer
WORKDIR /app
ADD pom.xml /app
RUN mvn verify clean --fail-never

# Image layer: with the application
COPY . /app
RUN mvn -v
RUN mvn clean install -DskipTests
EXPOSE 8080
ADD ./target/your.jar /developments/
ENTRYPOINT ["java","-jar","/developments/your.jar"]

Тогда вы получите следующий сценарий сборки:

  • В первый раз вы создаете эту (сборку Docker) зависимости, которые загружаются, и на шаге 2 создается jar приложения.
  • При немедленной перестройке зависимости (pom.xml) и исходные тексты приложений не изменились. Таким образом, слои изображения не нужно менять. Сборка готова в кратчайшие сроки.
  • Если вы измените 1 из ваших исходных файлов приложения, будет загружено всего несколько загрузок, и приложение будет собрано. Таким образом, вы НЕ загружаете мир.
  • Если вы измените файл pom.xml, тем самым изменив зависимости, то все загрузки зависимостей будут завершены.

Влияние разделения слоев изображения показано через количество очень коротких видеороликов .

Недостатком этого способа построения является, конечно, то, что конечное (производственное) изображение содержит больше, чем приложение. В нем есть не только JAR, но и ряд зависимостей.

Как решить, что этот iamge слишком велик:

  • Уменьшите размер изображения с помощью трюка. Используйте опцию: --squash. Это объясняется в этом посте .
  • Отделяйте процесс сборки (здесь: maven и / или ng build --prod) как шаг перед шагом сборки докера. Затем выполните сборку Docker и поместите ТОЛЬКО файл jar в окончательное изображение.
  • Использование среды CI / CD с, например, Дженкинсфайл (конвейер). В конвейере Jenkins вы сначала строите образ. Все зависимости уже есть. Вы только перестройте приложение. Вы выполняете сборку докера и т. Д.

Для моего случая это лучший вариант из возможных. Вы автоматизируете процесс И сохраняете размер изображения низким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...