自定義 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 的官方映象。新映象釋出有兩個通道:stablelabs

穩定通道

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.21.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 倉庫以獲取開發構建。