当前位置: 首页 > 知识库问答 >
问题:

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

康秋月
2023-03-14

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

如何通过docker-compose (Dockerfile)指定构建过程重用我的“windows 10 Home”Maven库?所以,(新)下载的数量是最小的。我的开发环境:我使用Docker quickstart终端,所以使用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

我的泊坞文件是:

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个答案

周朗
2023-03-14

@杰克·戈尔-非常感谢你给我指路。我看到了帖子,但还没有一个明确的答案。在深入研究了所有不同的答案后,这些信息为我提供了对症状的答案以及如何解决类似问题的见解。

答:通过Dockerfile,您可以通过1个或多个后续映像层构建最终映像。为了防止该步骤每次都重新下载依赖项,您可以为依赖项的“下载世界”创建一个映像层。只有当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"]

然后得到以下构建场景:

    < li >第一次构建时(docker构建。)下载依赖项,在步骤2中构建应用程序jar。 < li >当您立即重建依赖项(pom.xml)和应用程序源时,它们不会发生变化。因此,不需要改变图像层。大楼很快就建成了。 < li >如果您更改了1个应用程序源文件,则仅下载少量内容,并构建应用html" target="_blank">程序。所以你没有下载这个世界。 < li >如果您更改pom.xml文件,从而更改依赖关系,则所有依赖关系下载都将完成。

通过一些非常短的视频显示了分离图像层的影响。

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

如何解决这个图像太大的问题:

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

对我来说,这是最好的选择。你可以自动化这个过程,并保持图像尺寸较小。

 类似资料:
  • Docker Compose Maven Plugin Quickstart Available on Maven Central. <dependency> <groupId>com.dkanejs.maven.plugins</groupId> <artifactId>docker-compose-maven-plugin</artifactId> <version>$VER

  • 我们目前没有自己的存储库。因此,当我们使用maven构建时,它将在当前用户的主目录中创建.m2存储库。 现在有两个第三方JAR在Maven Central中找不到。假设其中之一是hasp-srm-api.jar。今天的过程是这样的: a.依赖于hasp-srm-api.jar的项目的pom.xml包含以下行: b.在进行第一次构建之前,我们执行以下命令: 我的问题是这样的--这一步有没有可能自动化

  • 当我使用docker-maven-plugin构建docker映像时,它失败了 错误:无法执行目标com.spotify:docker-maven-plugin:1.0.0:build(default-cli)on project spring-boot-basic:捕获异常:basedir/root/workspace/spring-boot-basic/spring-boot-basic/sp

  • 问题内容: 我想创建本地Maven存储库。我做了以下步骤: 在中安装了Maven插件 在apache服务器中创建了一个文件夹localrepository,可使用访问 在我的项目中,我提供了 但这并没有解决上的jar 是否需要提供存储库? 问题答案: 使用具有默认配置的Web服务器来设置简单的存储库。关键是目录结构。该文档没有明确提及它,但其结构与本地存储库相同。 要建立一个内部存储库,只需要您有

  • 我试图使用maven插件为maven java项目添加一个源文件夹到Eclipse。 从http://mojo.codehaus.org/build-helper-maven-plugin/usage.html上的文档来看,这应该是正确的吧?文件夹target/sources/mygeneratedfiles存在。