spring-boot - 在 Dockerfile 中解压 Spring Boot fat jar 时出错
问题描述
我正在为我的 Spring Boot 应用程序构建一个 Docker 容器。为了优化缓存,我想将 Spring Boot 生成的 fat jar 分解成层。我可以通过拆分 Gradle 文件和 Dockerfile 之间的解包过程来实现这一点,但我更愿意处理 Dockerfile 中的所有内容。我目前的方法: Gradle 片段:
task explodeJar {
dependsOn(jar)
doLast {
project.delete "$projectDir/build/dependencies"
project.mkdir "$projectDir/build/dependencies"
exec {
workingDir "$projectDir/build/dependencies"
commandLine "jar", "-xf", "../libs/${project.name}-${project.version}.jar"
}
}
}
Dockerfile:
ARG DEPENDENCY=/build/dependencies
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","mypackage.MyApp"]
当我运行./gradlew explodeJar
命令然后docker build -t myapp-spring:0.0.1-SNAPSHOT --build-arg BUILD_VERSION=0.0.1-SNAPSHOT .
容器构建没有问题时,但是当我尝试将 jar 提取移动到 Dockerfile
ARG BUILD_VERSION
ARG JAR_FILE=build/libs/payouts-spring-${BUILD_VERSION}.jar
ARG DEPENDENCY=/build/dependencies
CMD unzip -d ${DEPENDENCY} ${JAR_FILE}
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","mypackage.MyApp"]
Docker 构建失败并出现以下错误:
=> CACHED [2/6] RUN yum install -y java-11-amazon-corretto 0.0s
=> CACHED [3/6] RUN yum install -y tar unzip procps 0.0s
=> ERROR [4/6] COPY /build/dependencies/BOOT-INF/lib /app/lib 0.0s
=> ERROR [5/6] COPY /build/dependencies/META-INF /app/META-INF 0.0s
=> ERROR [6/6] COPY /build/dependencies/BOOT-INF/classes /app 0.0s
------
> [4/6] COPY /build/dependencies/BOOT-INF/lib /app/lib:
------
------
> [5/6] COPY /build/dependencies/META-INF /app/META-INF:
------
------
> [6/6] COPY /build/dependencies/BOOT-INF/classes /app:
------
failed to compute cache key: "/build/dependencies/BOOT-INF/classes" not found: not found
解决方案
我通过将 jar 复制到容器中并在那里解压来解决了这个问题:
FROM amazonlinux:2
RUN yum install -y java-11-amazon-corretto
ARG BUILD_VERSION
ENV APP_HOME /apps/services
EXPOSE 8080
# unpack and copy folders
ARG JAR_FILE=build/libs/payouts-spring-${BUILD_VERSION}.jar
ARG JAR_DIR=/build
ARG DOCKER_JAR_FILE=${JAR_DIR}/payouts-spring.jar
COPY ${JAR_FILE} ${DOCKER_JAR_FILE}
WORKDIR ${JAR_DIR}
RUN jar -xf ${DOCKER_JAR_FILE}
RUN mkdir -p ${APP_HOME}
RUN cp -R BOOT-INF/lib ${APP_HOME}
RUN cp -R META-INF/* ${APP_HOME}/META-INF
RUN cp -R BOOT-INF/classes/* ${APP_HOME}
WORKDIR /
RUN rm -r ${JAR_DIR}
ENTRYPOINT ["java","-cp","apps/services:apps/services/lib/*", "com.myApp"]
推荐阅读
- javascript - 在我第二次运行该函数之前无法更新 DOM。试图将 x 分配给所选文件的文件路径
- python - Errno 13 迁移学习 Inception v3
- javascript - 传递事件数据时未触发jquery表单提交
- python - 获取烧瓶中的用户ID
- sql - 有没有办法“减慢”触发器?
- c# - 如何获取特定元素中的所有元素?
目前我对每个循环都有这个:
var table = document.DocumentNode.SelectNodes("//*[@id=\"NpcTable\"]/tbody"); foreach (var row in table) { HtmlAttribute attr = row.Attributes["role"]; Console.WriteLine("<tr> E
- git - 在 Git 别名的位置参数中传递字符串
- php - 如何使用不同的 Linux 用户运行 PHPUnit
- python-3.x - 作为 systemd 服务运行的金字塔应用程序的打印命令在哪里
- ios - 我有一个带有不同/多个 UIView 的情节提要,并且我想要每个 UIView 都有一个 ViewController。迅速