Java 如何编写dockerfile在包含jdk的现有SpringBoot项目上添加maven构建

Java 如何编写dockerfile在包含jdk的现有SpringBoot项目上添加maven构建,java,spring-boot,maven,docker,Java,Spring Boot,Maven,Docker,我的老板要去度假几天,我是一名java开发人员,我对docker不太了解,只知道基本知识 我有一个JavaSpring启动项目,在项目的根目录下有一个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.j

我的老板要去度假几天,我是一名java开发人员,我对docker不太了解,只知道基本知识

我有一个JavaSpring启动项目,在项目的根目录下有一个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包

我以前从中获得的资源很少,但我不能做实验,我需要能够运行前面提到的给定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 clean软件包提供一个等效的脚本,以便我可以将其添加到构建我的映像的dockerfile中

这通常是两个步骤:

构建jar。 运行docker build以生成包含jar的映像。 有一些maven/gradle插件可以帮助您从maven构建中自动化流程,不过,请参见dockerfile maven,这可能就是您想要的:

我以前从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
如果我理解的很好,您的问题是您希望在docker构建中添加maven打包步骤,同时仍然使用JDK的确切版本: 在运行时从openjdk:8-jdk-alpine开始,不依赖于基础映像:从maven:3.6.0-jdk-11-slim开始构建

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

回到你的问题上来,如果你想使用你链接的东西,你需要改变的主要事情是最终基本映像的JDK标记以符合你的需求,你也应该调整一些小东西。 作为旁注,当前您复制了图像根处的JAR。出于安全原因,这不是一个好做法。您应该将其复制到文件夹中,例如/app

当您引用由Maven构建的jar时,也最好用它的AutoFrutd/最终名称来前缀JAR而不是它的版本,而不是将目标文件夹中的任何jar视为您在这里所做的胖jar:ARGJARYFrase=目标/*.jar。p> 因此,它将给出:

# 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解决方案

您是否正在尝试在容器中构建Spring Boot应用程序源代码,或者构建Spring Boot应用程序,然后构建包含新构建jar的容器?两种不同的东西docker文件已经存在了,它只包含运行jar的代码,请参阅代码的第一部分,现在我想在java运行脚本的顶部添加maven build脚本,这样我就可以从docker build-t本身构建它。