笔记:这既是一个关于哪个 Docker 版本的问题,也是一个关于如何找到实现 COPY --link 的 Docker 版本的问题。
背景:问题始于我的本地 docker 安装在解析 Dockerfile 时不支持 COPY --link。快速搜索后,我发现它已添加到 Dockerfile 前端版本 1.4.0 [1] 中。
之后我就陷入了困境。我不知道如何找到哪个版本的 docker 实现了 Dockerfile 前端版本 1.4.0。不过经过一番搜索,我找到了一个页面,上面提到 COPY --link 是在 Docker Engine 26.0 [2][3] 中添加的。
幸运的是,我找到了 Docker Engine 26.0 的里程碑列表 [4],其中列出了一个名为“Dockerfile:将 xx 更新至 v1.4.0”的拉取请求 [5]。
目前,我仍然不知道哪个 docker 版本支持 COPY --link。我还没有找到如何将 Docker Engine 版本映射到 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 中哪个 docker 版本实现了对 COPY --link 的支持?
[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%3Aclosed+milestone%3A26.0.0
[5]https://github.com/moby/moby/pull/47570
答案1
该功能已添加buildkit PR #2596。
随后在Dockerfile v1.4.0(这是 buildkit 用来解释您的 Dockerfile 的前端解析器)。
从那里,您可以使用#syntax=docker.io/docker/dockerfile:1.4.0
Dockerfile 顶部的行来引入该功能。或者,为了避免对该#syntax
行的依赖,您可以等待它成为默认的 Dockerfile 前端解析器。
Dockerfile 前端已更新至 1.4.0buildkit v0.10.0。
第一个使用该版本 buildkit 的 docker 引擎版本是23.0。
尽管如此,根据我的经验,这个功能带来的麻烦比我得到的要多,所以我很快将其从我自己的 Dockerfile 中删除。我相信它会导致诸如不可预测的父目录权限之类的问题。
答案2
据我所知,我发现了这个错误报告 COPY --link 不会在已更改的图层之上重新设置缓存的图层 #1099。
评论来自 极性分子 说:
3 月份 Docker Engine 的版本发布(23.0.2)故意禁用 COPY --link 支持看起来是这样。发布说明参考 Github PR 来了解该更改,这个相关的 BuildKit PR 指出,在再次启用 COPY --link 之前,Docker Engine 需要特别处理一些额外的工作。
订阅此跟踪问题了解何时为 Docker Engine 解析该问题。
因此问题只出现在版本 23 上。版本 22 和 24 也许可以正常工作。
后来 mahangu 的评论 说:
COPY --link
将使用默认设置docker 驱动程序在 Docker CE 24 beta 及更高版本上,只要容器存储已启用。
然而,阅读链接跟踪问题 mergeop/diffop 与 Moby worker 无法正常工作 #45111 对于 2023 年 12 月 22 日写的第 24 版来说,情况似乎不太乐观。
您必须尝试一下,或许可以试用最新的测试版。