我正在为我的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发布于 2021-09-07 16:21:40
您将收到"no no file or directory“错误。尝试从dockerfile和target所在的位置运行以下命令。
mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)祝你好运!
发布于 2021-09-09 14:04:32
我通过将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"]发布于 2021-09-09 14:16:02
不能直接回答你的问题,但你也可以看看jib。它提供了一个Gradle插件,并遵循Docker分层的最佳实践,自动为您创建一个Docker容器。
https://stackoverflow.com/questions/69091434
复制相似问题