注意:这既是哪个 docker 版本的问题,也是如何找到实现 COPY --link 的 docker 版本的问题。
背景:它始于我的本地 docker 安装在解析我的 Dockerfile 时不支持 COPY --link 。快速搜索后,我发现它已添加到 Dockerfile 前端版本 1.4.0 [1]。
之后我就陷入困境了。我不知道如何找到实现 Dockerfile 前端版本 1.4.0 的 docker 版本。但幸运的是,我发现一个页面提到 Docker Engine 26.0 [2][3] 中添加了 COPY --link。
额外的运气让我看到了 Docker Engine 26.0 的里程碑列表 [4],其中列出了一个名为“Dockerfile: update xx to v1.4.0”的拉取请求 [5]。
此时我仍然不知道哪个 docker 版本支持 COPY --link。我还没有找到如何将 Docker 引擎版本映射到 docker 版本。
编辑:忽略这部分。apt show
列出可用的软件包,而不是已安装的软件包。我没有 docker 版本 24.0.5。
apt show docker.io
在我的机器上显示我正在使用 docker 版本 24.0.5 (24.0.5-0ubuntu1~20.04.1)。
但docker version
显示客户端和引擎的版本均为 19.03.13。
那么24.0.5版本从何而来呢?编辑:忽略这部分。
Docker 软件环境感觉就像是一团混乱,我无法理解。它似乎也分为两个存储库https://github.com/docker和https://github.com/moby。
那么回到问题:你应该如何找到 Ubuntu 中实现了 COPY --link 支持的 docker 版本?
[1] https://github.com/docker/docs/blob/c416e68959110bb8d04d92de3f9f0d3e181360b1/content/build/dockerfile/release-notes.md#140
[2] https://www.howtogeek.com/devops/how-to -accelerate-docker-builds-and-optimize-caching-with-copy-link/
[3] https://docs.docker.com/engine/release-notes/26.0/#2600
[4] https://github .com/moby/moby/issues?q=is%3Aclose+milestone%3A26.0.0
[5] https://github.com/moby/moby/pull/47570
该功能已添加到buildkit PR #2596中。
然后在Dockerfile v1.4.0中发布(这是 buildkit 用于解释 Dockerfile 的前端解析器)。
从那里您可以使用
#syntax=docker.io/docker/dockerfile:1.4.0
Dockerfile 顶部的行来引入该功能。或者,为了避免对线路的依赖#syntax
,您可以等待它成为默认的 Dockerfile 前端解析器。Dockerfile 前端在buildkit v0.10.0中更新至 1.4.0 。
带有该版本 buildkit 的第一个 docker 引擎版本是23.0。
也就是说,根据我的经验,这个功能带来的麻烦比我从中获得的还要多,所以我很快将其从我自己的 Dockerfile 中删除了。我相信这会导致诸如不可预测的父目录权限之类的问题。
据我跟踪问题,我发现这个错误报告 COPY --link 不会在更改的层之上重新设置缓存层 #1099。
Polarathene的评论 说:
因此,问题仅出现在版本 23 上。版本 22 和 24 或许可以工作。
mahangu后来的 评论 说:
然而,阅读链接跟踪问题 mergeop/diffop 无法与 Moby Worker #45111 正常工作 相比,对于 2023 年 12 月 22 日编写的版本 24 似乎并不乐观。
您必须尝试看看,也许尝试最新的测试版本。