【问题标题】:java layertools extract does not preserve timestampsjava layertools extract不保留时间戳
【发布时间】:2021-11-23 03:54:39
【问题描述】:

我正在使用分层 jar 文件方法 [1] 来优化我们的 Docker 映像构建时间。我注意到从以下命令中提取的 jar 文件不保留提取的单个 jar 文件的时间戳。

java -Djarmode=layertools -jar my-uber-jar.jar extract

如果我运行上述命令,请检查提取文件上的时间戳,然后重新运行该命令并重新检查它们始终更新为当前时间的时间戳。

示例:

$ java -Djarmode=layertools -jar my-uber-jar.jar  extract 
$ ls -l dependencies/BOOT-INF/lib/commons-*
-rw-r--r--  1 legacy  staff   327K Oct  1 09:23 dependencies/BOOT-INF/lib/commons-codec-1.11.jar
-rw-r--r--  1 legacy  staff   204K Oct  1 09:23 dependencies/BOOT-INF/lib/commons-io-2.5.jar
-rw-r--r--  1 legacy  staff   490K Oct  1 09:23 dependencies/BOOT-INF/lib/commons-lang3-3.8.1.jar
-rw-r--r--  1 legacy  staff    60K Oct  1 09:23 dependencies/BOOT-INF/lib/commons-logging-1.2.jar
-rw-r--r--  1 legacy  staff   2.1M Oct  1 09:23 dependencies/BOOT-INF/lib/commons-math3-3.6.1.jar

...等待约 5 分钟...

$ java -Djarmode=layertools -jar my-uber-jar.jar extract 
$ ls -l dependencies/BOOT-INF/lib/commons-*
-rw-r--r--  1 legacy  staff   327K Oct  1 09:29 dependencies/BOOT-INF/lib/commons-codec-1.11.jar
-rw-r--r--  1 legacy  staff   204K Oct  1 09:29 dependencies/BOOT-INF/lib/commons-io-2.5.jar
-rw-r--r--  1 legacy  staff   490K Oct  1 09:29 dependencies/BOOT-INF/lib/commons-lang3-3.8.1.jar
-rw-r--r--  1 legacy  staff    60K Oct  1 09:29 dependencies/BOOT-INF/lib/commons-logging-1.2.jar
-rw-r--r--  1 legacy  staff   2.1M Oct  1 09:29 dependencies/BOOT-INF/lib/commons-math3-3.6.1.jar

这对我来说是个问题的原因是我正在尝试使用 Docker buildkit [2] 优化来减少发送到远程 Docker 守护程序的构建上下文的数量。使用分层 jar 文件方法和 Docker buildkit 背后的想法是避免将任何依赖 jar 文件发送到远程 docker 守护程序,除非它们以某种方式发生变化。 Docker buildkit 似乎注意到了更改的时间戳,然后将所有文件发送到远程服务器,即使这些文件的校验和与之前的构建相同。我已经确认,如果我只是在不重新提取文件的情况下进行构建,那么很少有数据会发送到远程 Docker 守护进程。

使用分层 jar 文件可以很好地减少在 docker push 上发送的数据量,但我们的工作流程需要在远程服务器上进行 docker 构建(通过 IntelliJ 的远程 docker 构建功能)

这引出了我的问题:

a) 是否可以在保留时间戳的同时提取图层?

b) 是否可以让 docker buildkit 查看校验和而不是时间戳?

[1]https://spring.io/blog/2020/08/14/creating-efficient-docker-images-with-spring-boot-2-3 [2]https://docs.docker.com/develop/develop-images/build_enhancements/

【问题讨论】:

    标签: spring-boot docker docker-buildkit


    【解决方案1】:

    是否可以在保留时间戳的同时提取图层?

    Spring Boot 的图层工具目前不支持此功能。不过,这听起来像是一个有用的功能,我认为它可能应该是默认行为。我们在创建 jar 时已经注意保留时间戳,所以我认为在提取过程中也保留它们是有意义的。

    open a Spring Boot issue,我们会看看。

    【讨论】:

    • 我打开了一个问题here
    • github问题已修复并发布到spring boot 2.5.6版本。我已经对其进行了重新测试,可以确认它解决了这个问题,并使 BuildKit 能够仅将具有更新时间戳的文件发送到远程 Docker 守护进程。
    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2021-11-10
    • 2017-03-16
    相关资源
    最近更新 更多