Docker-compose - 使用maven构建,重用maven存储库

问题描述 投票:1回答:1

使用Maven构建我的Spring-boot映像时,我现在在Dockerfile中执行此操作。 Maven将下载所有依赖项,然后编译我的文件。这需要相当长的时间。

如何通过docker-compose(Dockerfile)指定构建过程重用我的“Windows10 Home”Maven存储库?因此,(新)下载的数量很少。我的开发环境:我使用Docker快速启动终端,所以使用docker-machine。

这是我的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=“[email protected]”
ADD ./target/spring-boot-example-0.0.1-SNAPSHOT.jar /developments/
ENTRYPOINT ["java","-jar","/developments/spring-boot-example-0.0.1-SNAPSHOT.jar"]
maven docker docker-compose
1个回答
1
投票

@Jack Gore - 非常感谢你给我指路。我看过这篇文章,但还没有确定的答案。在完成所有单独答案后,该信息为我提供了症状的答案以及如何解决类似问题的见解。

解答:通过Dockerfile,您可以通过一个或多个后续图像层构建最终图像。为了防止步骤每次重新下载依赖项,您可以为“下载世界”的依赖项创建一个图像层。只有在pom.xml文件中的依赖项发生更改时才会重新下载。

为此,您需要在两个构建步骤中拆分Dockerfile:首先复制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 build。)时,将下载依赖项,并在第2步构建应用程序jar。
  • 当您立即重建依赖项(pom.xml)并且未更改应用程序源时。因此,不需要更改图像层。构建已经准备就绪。
  • 如果更改了一个应用程序源文件,则只下载少量下载并构建应用程序。所以你不是在下载这个世界。
  • 如果更改pom.xml文件,从而更改依赖项,则完成所有依赖项下载。

分离图像层的影响通过number of very short videos显示。

这种构建方式的缺点当然是最终(生产)图像包含的不仅仅是应用程序。不仅JAR在其中,而且还有许多依赖项。

如何解决这个图像太大了:

  • 通过技巧减少图像大小。使用选项:--squash。这在this post中有解释。
  • 将构建过程(此处:maven和/或ng build --prod)分隔为docker构建步骤之前的步骤。然后执行docker build并将jar文件放在最终图像中。
  • 使用CI / CD环境,例如一个Jenkinsfile(管道)。在Jenkins管道中,首先构建映像。所有依赖都已存在。您只需重建该应用程序。你执行docker build等。

对于我的情况,这是最好的选择。您可以自动执行此过程并保持较低的图像大小。

© www.soinside.com 2019 - 2024. All rights reserved.