【问题标题】:Docker-compose - build with maven that re-uses the maven repositoryDocker-compose - 使用 maven 构建,可重用 maven 存储库
【发布时间】:2019-02-06 19:18:37
【问题描述】:

使用 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=“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"]

【问题讨论】:

  • 您遇到的错误是什么?
  • 没有,没有错误,我看到相同的下载列表......在每次构建期间。我想重用现有的 Win10/home/repository。
  • This 问题似乎与您想要的相似。

标签: maven docker docker-compose


【解决方案1】:

@Jack Gore - 非常感谢你为我指路。我看过这个帖子,但还没有一个明确的答案。在深入了解所有单独的答案之后,这些信息为我提供了对症状的答案以及如何解决类似问题的见解。

回答:通过 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"]

然后你会得到以下构建场景:

  • 第一次构建此项目(docker build。)下载依赖项,并在第 2 步中构建应用程序 jar。
  • 当您立即重建时,依赖项 (pom.xml) 和应用程序源没有更改。因此,不需要更改图像层。构建很快就准备好了。
  • 如果您更改 1 个应用程序源文件,则只下载少量下载并构建应用程序。所以你不是在下载世界。
  • 如果您更改 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 等。

就我而言,这是最好的选择。您可以自动化该过程并保持较小的图像尺寸。

【讨论】:

  • 对于镜像大小,Docker现在支持multistage builds。所以基本上在你构建了 jar 之后,你可以创建一个新的 Production 镜像,并从 dev 镜像中复制 jar。因此,您的生产映像中没有任何构建/测试依赖项。
猜你喜欢
  • 1970-01-01
  • 2021-03-26
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 2018-01-21
  • 2020-08-07
相关资源
最近更新 更多