java如何编写dockerfile,在包含jdk的现有spring boot项目上添加maven build
我的老板要去度假几天,我是一名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包
我以前从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 clean软件包提供一个等效的脚本,以便我可以将其添加到构建我的图像的dockerfile中
# 1 楼答案
如果我理解的很好,你的问题是你想在docker构建中添加maven打包步骤,同时仍然使用JDK的确切版本:
FROM openjdk:8-jdk-alpine
在运行时,并且不依赖于该基本映像:FROM maven:3.6.0-jdk-11-slim AS build
第一件事:不要担心在docker构建中依赖另一个基本docker映像
自17.05 Docker版本(2017年5月)以来,Docker build有一个multi-stage build功能,允许在一个构建中定义多个阶段,并适合您的需要
实际上,在第一阶段,您可以依赖maven docker映像来构建应用程序,而在第二阶段,您可以依赖JDK docker映像来运行应用程序
多阶段构建功能还有另一个优点:图像大小优化,因为之前步骤生成的中间层不会保留在最终图像大小中
对于类似于集成/生产的环境,我可能会使用这种方式
回到你的问题上来,如果你想使用你链接的the answer,你需要改变的主要事情是最终基本映像的JDK标记,以符合你的要求,你还应该调整一些小东西
顺便说一句,目前您复制了图像根处的JAR。出于安全原因,这不是一个好做法。你应该把它复制到一个文件夹中,例如
/app
当您引用由Maven构建的jar时,也最好用它的AutoFrutd/最终名称来前缀JAR,而不是考虑它的版本,而不是将目标文件夹中的任何jar当作您在这里所做的FAT jar:^ {< CD4>}。
所以它会给出:
请注意,建议的解决方案非常简单,在许多情况下已经足够,但可能不适合您的特定环境
有几种方法可以解决你的问题。根据您的目标环境,您的需求不同,策略也不同
这些要求可能是构建速度、最终图像大小优化、对本地开发人员的快速反馈。所有这些都不一定是兼容的
Docker build区域确实是一个非常大的主题。我强烈建议您进行更多研究,以便能够根据您的实际需要调整docker build解决方案