spring - Spring Boot 分层 jar + docker builder
问题描述
我的目标是使用分层 jar 设置多阶段 docker 映像构建。
为此,我使用以下 Dockerfile:
FROM maven:3.6-openjdk-16-slim AS builder
WORKDIR application
COPY pom.xml ./
# store maven dependencies so next build doesn't have to download them again
RUN mvn dependency:go-offline
COPY src src
RUN mvn package
# LAYERED JAR
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} ./application.jar
RUN java -Djarmode=layertools -jar application.jar extract
# Alpine Linux with OpenJDK JRE
FROM azul/zulu-openjdk-alpine:16-jre
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
#JVM
ENV MAX_HEAP_MB="512"
# Appliction Insights
ENV APP_INSIGHTS_JAR_FILE=app-insights-agent.jar
RUN wget --no-verbose --no-check-certificate -O ./${APP_INSIGHTS_JAR_FILE} https://github.com/microsoft/ApplicationInsights-Java/releases/download/3.0.3/applicationinsights-agent-3.0.3.jar
ENTRYPOINT java -javaagent:./${APP_INSIGHTS_JAR_FILE} -Xmx${MAX_HEAP_MB}m org.springframework.boot.loader.JarLauncher
乍一看,这就像一个魅力,问题是当你想“重建”你的形象时。为该 dockerfile 运行 docker build 会生成一个没有最新代码更改的图像。
将clean添加到 mvn 包解决了这个问题,但是我失去了缓存 mvn dependency:go-offline 给我的依赖项的能力,因为所有依赖项都被再次下载。
我试图添加
RUN rm -rf target/classes
但是没有效果...
谢谢
编辑:解决方案是改变
COPY ${JAR_FILE} ./application.jar
为了
RUN cp ${JAR_FILE} application.jar
解决方案
推荐阅读
- c# - 异步删除显示数据的问题
- .net-core - EF Core 引用同一张表,单个集合
- reactjs - 在无状态组件中获取 ref
- javascript - 与 ng-options 中的硬编码 json 相比,解析我的动态 json 时出错
- google-cloud-platform - 如何在没有 ?authuser=1 的情况下获得经过身份验证的 GCS URL
- swift - 运行应用程序时,表格视图单元上未显示 Swift 按钮
- amazon-web-services - AWS Classic Load Balancer 随机不接收请求
- python - 用于单词计数、平均单词长度、单词频率和以字母开头的单词频率的 Python 程序
- android - (Mockito + Kotlin) Android 测试中的 eq() 和 any() 返回 null
- mysql - 只有当另一列正常时,sql才想计算一列