Quarkus:尝试使用多级docker构建缓存maven依赖项
我有一个简单的Quarkus应用程序,我尝试使用以下多级Dockerfile构建它Quarkus:尝试使用多级docker构建缓存maven依赖项,maven,docker,quarkus,Maven,Docker,Quarkus,我有一个简单的Quarkus应用程序,我尝试使用以下多级Dockerfile构建它 FROM maven:3-jdk-8-slim AS build WORKDIR /build # Download Dependencies COPY pom.xml . RUN mvn dependency:go-offline # Build App COPY src/ /build/src/ RUN mvn -Dmaven.test.skip=true package -Dcheckstyle.skip
FROM maven:3-jdk-8-slim AS build
WORKDIR /build
# Download Dependencies
COPY pom.xml .
RUN mvn dependency:go-offline
# Build App
COPY src/ /build/src/
RUN mvn -Dmaven.test.skip=true package -Dcheckstyle.skip
# Stage 2 : create the docker final image
FROM adoptopenjdk:8-jre-openj9 AS runtime
COPY --from=build /build/target/*-runner.jar /app/app.jar
COPY --from=build /build/target/lib/* /app/lib/
WORKDIR /app
RUN chgrp -R 0 /app &&\
chmod g=u /app
USER 1001
EXPOSE 8080
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar"]
以及pom.xml文件
4.0.0
com.test
预订经理
1.0-快照
3.8.1
真的
1.8
1.8
UTF-8
UTF-8
1.1.1.最终版本
夸克宇宙物质清单
夸克斯
1.1.1.最终版本
2.22.1
${quarkus.platform.group id}
${quarkus.platform.artifact id}
${quarkus.platform.version}
聚甲醛
进口
org.projectlombok
龙目
1.18.10
假如
夸克斯
夸克斯轻松
夸克斯
quarkus-junit5
测试
放心吧
放心
测试
夸克斯
quarkus resteasy jsonb
夸克斯
quarkus smallrye openapi
夸克斯
quarkus smallrye反应式消息传递卡夫卡
夸克斯
quarkus maven插件
${quarkus plugin.version}
建造
maven编译器插件
${compiler plugin.version}
maven surefire插件
${surefire plugin.version}
org.jboss.logmanager.logmanager
本地的
本地的
maven故障保护插件
${surefire plugin.version}
集成测试
验证
${project.build.directory}/${project.build.finalName}-runner
本地的
构建工作正常,它下载maven依赖项,然后创建.jar并在最终容器中运行.jar。但是,如果我在源代码中更改了一些内容,并且保持pom.xml不变,那么依赖项将再次下载。似乎mvn依赖项:脱机并没有下载所有依赖项
有没有办法加快docker的构建速度?例如,我对Spring Boot也做了同样的操作,在那里一切都很好
谢谢您的帮助。您的pom.xml和src文件夹位于生成上下文中(命令中的点)。
如果您在src中更改文件,那么您将更改生成上下文,从而使副本缓存无效
请参见构建上下文(命令中的点)中的pom.xml和src文件夹。
如果您在src中更改文件,那么您将更改生成上下文,从而使副本缓存无效
请参见简单地说,您可以将Dockerfile分为两部分,例如builder base.Dockerfile
和final.Dockerfile
。然后,创建一个目录builderbase
,并将pom.xml
移动到builderbase
中
目录结构:
。
+--建筑工地
|+--pom.xml
|--src
|--builder-base.dockerfile
|--final.dockerfile
在final.dockerfile
中:
来自java builder的作为构建的
#构建应用程序
复制src//build/src/
运行mvn-Dmaven.test.skip=true包-Dcheckstyle.skip
#阶段2:创建docker最终图像
从采用OpenJDK:8-jre-openj9作为运行时
复制--from=build/build/target/*-runner.jar/app/app.jar
复制--from=build/build/target/lib/*/app/lib/
WORKDIR/app
运行chgrp-R 0/应用程序&&\
chmod g=u/应用程序
用户1001
曝光8080
入口点[“java”、“-Djava.security.egd=file:/dev//uradom”、“-jar”、“/app/app.jar”]
首先,将此代码放入builder base.dockerfile
:
来自maven:3-jdk-8-slim
WORKDIR/构建
#下载依赖项
复制pom.xml。
运行mvn依赖项:脱机
因此,首先,您应该构建一个名为“java builder”的映像
docker build-t java builder-f builder.dockerfile./builder base
现在,您可以使用以下命令编译源代码:
docker build-t app-f final.dockerfile。
final.dockerfile
中的基本映像是java builder
,如果不重新构建映像,则始终可以使用缓存创建docker最终映像。只需将docker文件拆分为两个,例如builder base.dockerfile
和final.dockerfile
。然后,创建一个目录builderbase
,并将pom.xml
移动到builderbase
中
目录结构:
。
+--建筑工地
|+--pom.xml
|--src
|--builder-base.dockerfile
|--final.dockerfile
在final.dockerfile
中:
来自java builder的作为构建的
#构建应用程序
复制src//build/src/
运行mvn-Dmaven.test.skip=true包-Dcheckstyle.skip
#阶段2:创建docker最终图像
从采用OpenJDK:8-jre-openj9作为运行时
复制--from=build/build/target/*-runner.jar/app/app.jar
复制--from=build/build/target/lib/*/app/lib/
WORKDIR/app
运行chgrp-R 0/应用程序&&\
chmod g=u/应用程序
用户1001
曝光8080
入口点[“java”、“-Djava.security.egd=file:/dev//uradom”、“-jar”、“/app/app.jar”]
首先,将此代码放入builder base.dockerfile
:
来自maven:3-jdk-8-slim
WORKDIR/构建
#下载依赖项
复制pom.xml。
运行mvn依赖项:脱机
因此,首先,您应该构建一个名为“java builder”的映像
docker build-t java builder-f builder.dockerfile./builder base
现在,您可以使用以下命令编译源代码:
docker build-t app-f final.dockerfile。
如果不重新构建im,则final.dockerfile
中的基本映像是JavaBuilder
COPY pom.xml .
RUN mvn --batch-mode \
--quiet \
--errors \
dependency:go-offline \
package
COPY src ./src
RUN mvn --batch-mode \
--quiet \
--errors \
--define maven.test.skip=true \
--define java.awt.headless=ture \
clean package