自定义 Dockerfile 语法
Dockerfile 前端
BuildKit 支持从容器镜像动态加载前端。要使用外部 Dockerfile 前端,您的 Dockerfile 的第一行需要设置 syntax 指令 指向您要使用的特定镜像
# syntax=[remote image reference]例如
# syntax=docker/dockerfile:1
# syntax=docker.io/docker/dockerfile:1
# syntax=example.com/user/repo:tag@sha256:abcdef...您也可以使用预定义的 BUILDKIT_SYNTAX 构建参数在命令行上设置前端镜像引用
$ docker build --build-arg BUILDKIT_SYNTAX=docker/dockerfile:1 .
这定义了用于构建 Dockerfile 的 Dockerfile 语法的存储位置。BuildKit 后端允许无缝使用作为 Docker 镜像分发的外部实现,并在容器沙箱环境中执行。
自定义 Dockerfile 实现允许您
- 无需更新 Docker 守护程序即可自动获取错误修复
- 确保所有用户都使用相同的实现来构建您的 Dockerfile
- 无需更新 Docker 守护程序即可使用最新功能
- 在将新功能或第三方功能集成到 Docker 守护程序之前尝试它们
- 使用 其他构建定义,或创建您自己的
- 使用自定义功能构建自己的 Dockerfile 前端
注意
BuildKit 附带内置的 Dockerfile 前端,但建议使用外部镜像来确保所有用户在构建器上使用相同版本,并自动获取错误修复,而无需等待 BuildKit 或 Docker Engine 的新版本。
官方发布版
Docker 在 Docker Hub 上的 docker/dockerfile 仓库中分发了官方版本的镜像,这些镜像可用于构建 Dockerfile。有两个发布新镜像的通道:stable 和 labs。
稳定版通道
stable 通道遵循 语义化版本控制. 例如
docker/dockerfile:1- 与最新的1.x.x次要和修补程序版本保持更新。docker/dockerfile:1.2- 与最新的1.2.x修补程序版本保持更新,并在发布版本1.3.0后停止接收更新。docker/dockerfile:1.2.1- 不可变:从不更新。
我们建议使用 docker/dockerfile:1,它始终指向版本 1 语法的最新稳定版本,并在版本 1 发布周期中接收“次要”和“修补程序”更新。BuildKit 在执行构建时会自动检查语法的更新,确保您使用的是最新版本。
如果使用特定版本(例如 1.2 或 1.2.1),则需要手动更新 Dockerfile 才能继续接收错误修复和新功能。Dockerfile 的旧版本与构建器的新版本兼容。
实验室版通道
labs 通道提供了对尚未在 stable 通道中提供的 Dockerfile 功能的抢先体验。labs 镜像与稳定版本同时发布,并遵循相同的版本模式,但使用 -labs 后缀,例如
docker/dockerfile:labs-labs通道上的最新版本。docker/dockerfile:1-labs- 与dockerfile:1相同,启用了实验性功能。docker/dockerfile:1.2-labs- 与dockerfile:1.2相同,启用了实验性功能。docker/dockerfile:1.2.1-labs- 不可变:从不更新。与dockerfile:1.2.1相同,启用了实验性功能。
选择最适合您需求的通道。如果您想从新功能中获益,请使用 labs 通道。labs 通道中的镜像包含 stable 通道中的所有功能,以及抢先体验功能。labs 通道中的稳定功能遵循 语义化版本控制,但抢先体验功能不遵循,较新版本可能不向后兼容。固定版本以避免处理重大更改。
其他资源
有关 labs 功能、主构建和每日构建的文档,请参阅 GitHub 上的 BuildKit 源代码仓库 中的描述。有关可用镜像的完整列表,请访问 Docker Hub 上的 docker/dockerfile 仓库 和 Docker Hub 上的 docker/dockerfile-upstream 仓库,以及 Docker Hub 上的 docker/dockerfile-upstream 仓库 中的开发构建。