【问题标题】:How to write a dockerfile to add maven build on existing spring boot project which contains jdk如何编写 dockerfile 以在包含 jdk 的现有 Spring Boot 项目上添加 Maven 构建
【发布时间】:2020-05-24 04:50:34
【问题描述】:

老板放假了,我是java开发者,对docker了解不多(只有基础知识)

我有 java Spring boot 项目,项目的根目录下有一个 Dockerfile。

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

我想在不修改结构的情况下添加 maven。并且maven应该清理它。?

例如。 docker build -t user/myimage .

它应该自动安装 maven 并清理我的项目。 无需我显式运行 mvn clean package

我之前从stackoverflow 获得的资源很少,但我无法进行实验,我需要可以运行之前提到的给定 jdk 脚本的代码。

FROM maven:3.6.0-jdk-11-slim AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package

我请求您为 Maven 清洁包提供一个等效的脚本,以便我可以将它添加到构建我的图像的 dockerfile 中。

【问题讨论】:

  • 您是要在容器中构建 Spring Boot 应用程序源代码(目前为止),还是构建您的 Spring Boot 应用程序,然后构建包含新构建的 jar 的容器? (两个不同的东西)
  • Dockerfile已经存在,它只包含运行jar的代码,见第一段代码,现在我想在java运行脚本的顶部添加maven构建脚本,这样我就可以从 docker build -t 本身构建它。

标签: java spring-boot maven docker


【解决方案1】:

我之前从 stackoverflow 获得的资源很少,但我做不到 实验,我需要可以运行给定 jdk 脚本的代码 前面提到过。

如果我理解得很好,您的问题是您想在 docker 构建中添加 maven 打包步骤,同时仍使用该确切版本的 JDK: FROM openjdk:8-jdk-alpine 在运行时并且不依赖于该基本映像:FROM maven:3.6.0-jdk-11-slim AS build

第一件事:不要担心在 Docker 构建中依赖另一个基础 Docker 映像。
自 17.05 Docker 版本 (05/2017) 以来,Docker 构建具有multi-stage build 功能,它允许在构建中定义多个阶段并满足您的需求。
事实上,在第一阶段,您可以依靠 maven docker 镜像来构建您的应用程序,而在第二阶段,您可以依靠 JDK docker 镜像来运行您的应用程序。
多阶段构建功能还有另一个优点:图像大小优化,因为先前步骤产生的中间层不会保留在最终图像大小中。
对于类似集成/生产的环境,这可能是我会使用的方式。

回到您的问题,如果您想使用您链接的the answer,您需要更改的主要内容是最终基础映像的 JDK 标记以符合您的要求,您还应该调整一些小的东西。
作为旁注,目前您将 JAR 复制到图像的根目录。出于安全原因,这不是一个好的做法。您应该将其复制到一个文件夹中,例如/app

当您引用由 maven 构建的 jar 时,最好在 jar 前加上其 artifactId/final 名称而不是其版本,而不是像您在此处所做的那样将目标文件夹中的任何 jar 视为胖 jar:ARG JAR_FILE=target/*.jar .

所以它会给:

# Build stage
FROM maven:3.6.0-jdk-11-slim AS build
COPY pom.xml /app/
COPY src /app/src
RUN mvn -f /app/pom.xml clean package

# Run stage
FROM openjdk:8-jdk-alpine # Use your target JDK here !
COPY --from=build /app/target/app*.jar /app/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

请注意,建议的解决方案非常简单,在许多情况下就足够了,但可能不适合您的具体情况。
确实有几种方法可以处理您的问题。根据您的目标环境,您的要求不一样,策略也会有所不同。
这些要求可能是构建速度、最终图像大小优化、本地开发人员的快速反馈。而且所有这些都不一定兼容。
Docker 构建区域确实是一个非常大的主题。我强烈建议您学习更多内容,以便能够根据您的实际需求调整 docker build 解决方案。

【讨论】:

    【解决方案2】:

    这通常是两个步骤:

    1. 构建 jar。
    2. 运行 docker build 以构建包含 jar 的映像。

    有一些 maven/gradle 插件可以帮助您从您的 maven 构建中自动执行该过程,请参阅 dockerfile-maven,这可能是您正在寻找的:https://github.com/spotify/dockerfile-maven

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2021-07-15
      • 2012-04-02
      • 2018-05-21
      • 2018-12-01
      相关资源
      最近更新 更多