Quarkus:尝试使用多级docker构建缓存maven依赖项

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

我有一个简单的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

# 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