spring-boot - Spring Boot 2.3.0.M4 分层 jar 缺少一层,Docker 在缺少目录时失败
问题描述
我正在尝试使用 Spring Boot 2.3.0 的新层功能创建一个分层的 docker 映像。我正在使用默认图层,并将它们添加到我的 docker 图像中。
FROM openjdk:14-slim-buster as builder
# Fatjar location, but could be set to different location from command line
ARG JAR_FILE=target/*.jar
# Copy fat jar file to current image builder
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar --enable-preview application.jar extract
FROM openjdk:14-slim-buster
VOLUME /tmp
# Copy all layers from builder stage to current image
COPY --from=builder temp/dependencies/ ./
COPY --from=builder temp/snapshot-dependencies/ ./
COPY --from=builder temp/spring-boot-loader/ ./
COPY --from=builder temp/application/ ./
# Expose current application to port 8080 and 8081
EXPOSE 8080
EXPOSE 8081
ARG JAVA_OPTS=""
# Run the application with JVM configs if any
ENTRYPOINT ["bash", "-c", \
"java -server --enable-preview -XX:+UseContainerSupport \
-XX:+AlwaysActAsServerClassMachine -XX:+UseG1GC -XX:+UseStringDeduplication ${JAVA_OPTS} \
org.springframework.boot.loader.JarLauncher ${0} ${@}"]
但是,当我发布我的应用程序时,我没有任何 SNAPSHOT 依赖项。提取步骤不会创建快照依赖文件夹,并且 Docker 由于缺少目录而失败。
[ERROR] COPY failed: stat /var/lib/docker/overlay2/2973e275e2de0cd32dd797d56eaae58c937e4c0fbd0223339a0beb79b187965d/merged/temp/snapshot-dependencies: no such file or directory
[WARNING] An attempt failed, will retry 1 more times
org.apache.maven.plugin.MojoExecutionException: Could not build image
at com.spotify.plugin.dockerfile.BuildMojo.buildImage (BuildMojo.java:247)
at com.spotify.plugin.dockerfile.BuildMojo.execute (BuildMojo.java:135)
at com.spotify.plugin.dockerfile.AbstractDockerMojo.tryExecute (AbstractDockerMojo.java:265)
at com.spotify.plugin.dockerfile.AbstractDockerMojo.execute (AbstractDockerMojo.java:254)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:564)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: com.spotify.docker.client.exceptions.DockerException: COPY failed: stat /var/lib/docker/overlay2/2973e275e2de0cd32dd797d56eaae58c937e4c0fbd0223339a0beb79b187965d/merged/temp/snapshot-dependencies: no such file or directory
at com.spotify.plugin.dockerfile.LoggingProgressHandler.handleError (LoggingProgressHandler.java:105)
at com.spotify.plugin.dockerfile.LoggingProgressHandler.progress (LoggingProgressHandler.java:63)
at com.spotify.docker.client.DefaultDockerClient$BuildProgressHandler.progress (DefaultDockerClient.java:312)
at com.spotify.docker.client.ProgressStream.tail (ProgressStream.java:77)
at com.spotify.docker.client.DefaultDockerClient$ResponseTailReader.call (DefaultDockerClient.java:2754)
at com.spotify.docker.client.DefaultDockerClient$ResponseTailReader.call (DefaultDockerClient.java:2738)
at java.util.concurrent.FutureTask.run (FutureTask.java:264)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:630)
at java.lang.Thread.run (Thread.java:832)
我如何告诉 Docker 跳过丢失的目录或 Spring Boot 甚至生成一个层,即使它是空的?
解决方案
啊,我想这已经在 Spring Boot 中注册为问题,并将在下一个里程碑中解决:https ://github.com/spring-projects/spring-boot/issues/20858
推荐阅读
- python - Python:如果任何行项目为空,熊猫将丢弃所有行
- python-3.x - 在 python 中处理 USR1 信号
- css - 如何在关键帧动画后隐藏元素
- python-3.x - 我正在尝试使用 subprocces 向 spi.exe 发送一些命令
- python - Fitting empirical distribution to theoretical ones with Scipy (Python) with bounds of parameters
- tensorflow-lite - 尝试使用 TFlite 运行推理时出错
- sql - 正则表达式否定后缀否定环视不起作用
- pandas - Oracle中无法识别的表
- java - Java JsonIgnore 没有隐藏字段
- javascript - 如何将 POST WMS 请求中的 base64 图像与 ImageMapType getTileUrl 一起使用?