docker buildx build

說明開始建置
用法docker buildx build [選項] 路徑 | URL | -
別名
docker build docker builder build docker image build docker buildx b

說明

docker buildx build 指令使用 BuildKit 開始建置。

選項

選項預設值說明
--add-host新增自訂主機到 IP 的映射(格式:host:ip
--allow允許額外的權限(例如,network.host、`security.insecure`)
--annotation新增註釋到映像檔
--attest證明參數(格式:type=sbom,generator=image
--build-arg設定建置時期變數
--build-context額外的建置上下文(例如,name=path)
--cache-from外部快取來源(例如,user/app:cachetype=local,src=path/to/dir
--cache-to快取匯出目的地(例如,user/app:cachetype=local,dest=path/to/dir
--callbuild設定評估建置的方法(`check`、`outline`、`targets`)
--cgroup-parent設定建置期間 `RUN` 指令的父 cgroup
--check--call=check 的簡寫
--detach實驗性 (CLI) detach buildx server (僅支援 Linux)
-f, --fileDockerfile 的名稱(預設值:PATH/Dockerfile
--iidfile將映像檔 ID 寫入檔案
--label設定影像的後設資料
--load--output=type=docker 的簡寫
--metadata-file將建置結果後設資料寫入檔案
--network設定建置期間 RUN 指令的網路模式
--no-cache建置影像時不使用快取
--no-cache-filter不快取指定的階段
-o, --output輸出目的地(格式:type=local,dest=path
--platform設定建置的目標平台
--progressauto設定進度輸出的類型(autoplainttyrawjson)。使用 plain 來顯示容器輸出
--provenance--attest=type=provenance 的簡寫
--pull永遠嘗試提取所有參考的影像
--push--output=type=registry 的簡寫
-q, --quiet隱藏建置輸出,成功時印出影像 ID
--root實驗性 (CLI) 指定要連線的伺服器根目錄
--sbom--attest=type=sbom 的簡寫
--secret要公開給建置的秘密資訊(格式:id=mysecret[,src=/local/secret]
--server-config實驗性 (CLI) 指定 buildx 伺服器設定檔(僅在啟動新伺服器時使用)
--shm-size建置容器的共享記憶體大小
--ssh要公開給建置的 SSH 代理程式通訊端或金鑰(格式:default|<id>[=<socket>|<key>[,<key>]]
-t, --tag名稱和選用的標籤(格式:name:tag
--target設定要建置的目標建置階段
--ulimitUlimit 選項

範例

將項目新增至容器 hosts 檔案 (--add-host)

您可以使用一個或多個 --add-host 旗標,將其他主機新增至建置容器的 /etc/hosts 檔案中。此範例為名為 my-hostnamemy_hostname_v6 的主機新增靜態位址

$ docker buildx build --add-host my_hostname=8.8.8.8 --add-host my_hostname_v6=2001:4860:4860::8888 .

如果您需要建置連線到主機上執行的服務,您可以將特殊的 host-gateway 值用於 --add-host。在以下範例中,建置容器會將 host.docker.internal 解析為主機的閘道器 IP。

$ docker buildx build --add-host host.docker.internal=host-gateway .

您可以將 IPv6 位址括在方括弧中。=: 都是有效的區隔符號。以下範例中的兩種格式都是有效的

$ docker buildx build --add-host my-hostname:10.180.0.1 --add-host my-hostname_v6=[2001:4860:4860::8888] .

建立註釋 (--annotation)

--annotation="key=value"
--annotation="[type:]key=value"

將 OCI 註釋新增至影像索引、資訊清單或描述元。以下範例將 foo=bar 註釋新增至影像資訊清單

$ docker buildx build -t TAG --annotation "foo=bar" --push .

您可以選擇性地新增類型前綴來指定註釋的層級。預設情況下,會註釋影像資訊清單。以下範例將 foo=bar 註釋新增至影像索引,而不是資訊清單

$ docker buildx build -t TAG --annotation "index:foo=bar" --push .

您可以指定多種類型,以逗號 (,) 分隔,以將註釋新增至多個影像元件。以下範例將 foo=bar 註釋新增至影像索引、描述元、資訊清單

$ docker buildx build -t TAG --annotation "index,manifest,manifest-descriptor:foo=bar" --push .

您也可以在類型前綴中指定平台限定詞,以方括弧 ([os/arch]) 括起來,以將註釋套用至具有相符平台的資訊清單子集。以下範例僅將 foo=bar 註釋新增至具有 linux/amd64 平台的資訊清單

$ docker buildx build -t TAG --annotation "manifest[linux/amd64]:foo=bar" --push .

平台限定詞不支援萬用字元;您無法指定像 manifest[linux/*] 這樣的類型前綴,以僅將註釋新增至以 linux 作為作業系統平台的資訊清單。

如需註釋的詳細資訊,請參閱註釋

建立證明 (--attest)

--attest=type=sbom,...
--attest=type=provenance,...

建立影像證明。BuildKit 目前支援

  • sbom - 軟體物料清單。

    使用 --attest=type=sbom 在建置時為影像產生 SBOM。或者,您可以使用--sbom 簡寫

    如需詳細資訊,請參閱這裡

  • provenance - SLSA 出處

    使用 --attest=type=provenance 在建置時為影像產生出處。或者,您可以使用--provenance 簡寫

    預設情況下,會為建置結果建立最少的出處證明,這只會附加到推送到登錄處的影像。

    如需詳細資訊,請參閱這裡

允許額外的權限授權 (--allow)

--allow=ENTITLEMENT

允許額外的權限授權。授權清單

要啟用授權,BuildKit 精靈也需要使用 --allow-insecure-entitlement 來允許它們(請參閱create --buildkitd-flags)。

$ docker buildx create --use --name insecure-builder --buildkitd-flags '--allow-insecure-entitlement security.insecure'
$ docker buildx build --allow security.insecure .

設定建置時變數 (--build-arg)

您可以在 Dockerfile 中使用 ENV 指令來定義變數值。這些值會保留在建置的影像中。通常,持續性不是您想要的。使用者希望根據建置影像的主機來指定不同的變數。

一個很好的例子是 http_proxy 或用於提取中間檔案的來源版本。ARG 指令允許 Dockerfile 作者定義使用者可以在建置時使用 --build-arg 旗標設定的值

$ docker buildx build --build-arg HTTP_PROXY=http://10.20.30.2:1234 --build-arg FTP_PROXY=http://40.50.60.5:4567 .

此旗標允許您傳遞建置時變數,這些變數在 Dockerfile 的 RUN 指令中可以像一般環境變數一樣被存取。這些值不像 ENV 值那樣保留在中間或最終影像中。您必須為每個建置參數新增 --build-arg

使用此旗標不會改變您在建置程序回應 Dockerfile 中的 ARG 行時看到的輸出。

有關使用 ARGENV 指令的詳細資訊,請參閱Dockerfile 參考

您也可以在沒有值的情況下使用 --build-arg 旗標,在這種情況下,精靈會將本地環境中的值傳播到它正在建置的 Docker 容器中

$ export HTTP_PROXY=http://10.20.30.2:1234
$ docker buildx build --build-arg HTTP_PROXY .

此範例類似於 docker run -e 的運作方式。請參閱docker run 文件以取得更多資訊。

還有一些有用的內建建置參數,例如

  • BUILDKIT_CONTEXT_KEEP_GIT_DIR=<bool>:觸發 git context 保留 .git 目錄
  • BUILDKIT_INLINE_CACHE=<bool>:是否將快取後設資料內嵌到影像設定中
  • BUILDKIT_MULTI_PLATFORM=<bool>:選擇加入確定性輸出,無論是否為多平台輸出
$ docker buildx build --build-arg BUILDKIT_MULTI_PLATFORM=1 .

Dockerfile 參考文件中進一步了解內建建置參數。

額外的建置上下文 (--build-context)

--build-context=name=VALUE

使用指定的內容定義額外的建置上下文。在 Dockerfile 中,當使用 FROM name--from=name 時,可以存取上下文。當 Dockerfile 定義具有相同名稱的階段時,它會被覆蓋。

值可以是本地來源目錄、符合本地 OCI 佈局的目錄、容器映像(使用 docker-image:// 前綴)、Git 或 HTTP URL。

alpine:latest 替換為固定版本。

$ docker buildx build --build-context alpine=docker-image://alpine@sha256:0123456789 .

公開次要的本地來源目錄。

$ docker buildx build --build-context project=path/to/project/source .
# docker buildx build --build-context project=https://github.com/myuser/project.git .
# syntax=docker/dockerfile:1
FROM alpine
COPY --from=project myfile /

使用 OCI 佈局目錄作為建置上下文。

從本地的 符合 OCI 佈局的目錄 來源映像,可以使用標籤或摘要。

$ docker buildx build --build-context foo=oci-layout:///path/to/local/layout:<tag>
$ docker buildx build --build-context foo=oci-layout:///path/to/local/layout@sha256:<digest>
# syntax=docker/dockerfile:1
FROM alpine
RUN apk add git
COPY --from=foo myfile /

FROM foo

OCI 佈局目錄必須符合 OCI 佈局規範。您可以使用標籤或確切的摘要來參考佈局中的映像。

覆寫已設定的建置器執行個體 (--builder)。

buildx --builder 相同。

使用外部快取來源進行建置 (--cache-from)。

--cache-from=[NAME|type=TYPE[,KEY=VALUE]]

使用外部快取來源進行建置。支援的類型有 registrylocalghas3

關於快取輸出器和可用屬性的更多資訊:https://github.com/moby/buildkit#export-cache呼叫前端方法 (--call)。

BuildKit 前端可以使用前端方法支援建置的替代執行模式。前端方法是一種更改或擴展建置呼叫行為的方法,例如,您可以檢查、驗證或從建置產生替代輸出。

docker buildx build--call 旗標可讓您指定要執行的前端方法。如果未指定此旗標,則預設會執行建置並評估 建置檢查

對於 Dockerfile,可用的方法如下:

命令說明
build(預設)執行建置並評估目前建置目標的建置檢查。
check評估整個 Dockerfile 或所選目標的建置檢查,而不執行建置。
outline顯示您可以為目標設定的建置引數及其預設值。
targets列出 Dockerfile 中的所有建置目標。
subrequests.describe列出目前前端支援的所有前端方法。

請注意,其他前端可能會實作這些方法或其他方法。要查看您正在使用的前端的可用方法清單,請使用 --call=subrequests.describe

$ docker buildx build -q --call=subrequests.describe .

NAME                 VERSION DESCRIPTION
outline              1.0.0   List all parameters current build target supports
targets              1.0.0   List all targets current build supports
subrequests.describe 1.0.0   List available subrequest types

說明

--call=targets--call=outline 方法會包含建置目標和參數的說明(如果有的話)。說明是從 Dockerfile 中的註釋產生的。FROM 指令前一行的註釋會成為建置目標的說明,而 ARG 指令前的註釋則會成為建置參數的說明。註釋必須以階段或參數的名稱開頭,例如

# syntax=docker/dockerfile:1

# GO_VERSION sets the Go version for the build
ARG GO_VERSION=1.22

# base-builder is the base stage for building the project
FROM golang:${GO_VERSION} AS base-builder

當您執行 docker buildx build --call=outline 時,輸出會包含說明,如下所示

$ docker buildx build -q --call=outline .

TARGET:      base-builder
DESCRIPTION: is the base stage for building the project

BUILD ARG    VALUE   DESCRIPTION
GO_VERSION   1.22    sets the Go version for the build

如需更多關於如何撰寫 Dockerfile 文件字串的範例,請參閱 Docker 文件的 Dockerfile

呼叫:檢查 (--check)

check 方法會在不執行建置的情況下評估建置檢查。--check 旗標是 --call=check 的簡便縮寫。使用 check 方法可以在開始建置之前驗證建置設定。

$ docker buildx build -q --check https://github.com/docker/docs.git

WARNING: InvalidBaseImagePlatform
Base image wjdp/htmltest:v0.17.0 was pulled with platform "linux/amd64", expected "linux/arm64" for current build
Dockerfile:43
--------------------
  41 |         "#content/desktop/previous-versions/*.md"
  42 |
  43 | >>> FROM wjdp/htmltest:v${HTMLTEST_VERSION} AS test
  44 |     WORKDIR /test
  45 |     COPY --from=build /out ./public
--------------------

使用 --check 而不指定目標會評估整個 Dockerfile。如果您要評估特定目標,請使用 --target 旗標。

呼叫:大綱 (outline)

outline 方法會印出指定目標的名稱(如果未指定 --target,則為預設目標),以及目標使用的建置參數,以及它們的預設值(如果已設定)。

以下範例顯示預設目標 release 及其建置參數

$ docker buildx build -q --call=outline https://github.com/docker/docs.git

TARGET:      release
DESCRIPTION: is an empty scratch image with only compiled assets

BUILD ARG          VALUE     DESCRIPTION
GO_VERSION         1.22      sets the Go version for the base stage
HUGO_VERSION       0.127.0
HUGO_ENV                     sets the hugo.Environment (production, development, preview)
DOCS_URL                     sets the base URL for the site
PAGEFIND_VERSION   1.1.0

這表示可以使用這些建置參數來設定 release 目標

$ docker buildx build \
  --build-arg GO_VERSION=1.22 \
  --build-arg HUGO_VERSION=0.127.0 \
  --build-arg HUGO_ENV=production \
  --build-arg DOCS_URL=https://example.com \
  --build-arg PAGEFIND_VERSION=1.1.0 \
  --target release https://github.com/docker/docs.git

呼叫:目標 (targets)

targets 方法會列出 Dockerfile 中的所有建置目標。這些是您可以使用 --target 旗標建置的階段。它還會指示預設目標,也就是當您未指定目標時將會建置的目標。

$ docker buildx build -q --call=targets https://github.com/docker/docs.git

TARGET            DESCRIPTION
base              is the base stage with build dependencies
node              installs Node.js dependencies
hugo              downloads and extracts the Hugo binary
build-base        is the base stage for building the site
dev               is for local development with Docker Compose
build             creates production builds with Hugo
lint              lints markdown files
test              validates HTML output and checks for broken links
update-modules    downloads and vendors Hugo modules
vendor            is an empty stage with only vendored Hugo modules
build-upstream    builds an upstream project with a replacement module
validate-upstream validates HTML output for upstream builds
unused-media      checks for unused graphics and other media
pagefind          installs the Pagefind runtime
index             generates a Pagefind index
test-go-redirects checks that the /go/ redirects are valid
release (default) is an empty scratch image with only compiled assets

將建置快取匯出到外部快取目的地 (--cache-to)

--cache-to=[NAME|type=TYPE[,KEY=VALUE]]

將建置快取匯出到外部快取目的地。支援的類型有 registrylocalinlineghas3

關於快取輸出器和可用屬性的更多資訊:https://github.com/moby/buildkit#export-cache使用自訂父 cgroup (--cgroup-parent)

當您使用 --cgroup-parent 選項執行 docker buildx build 時,守護行程會使用 相對應的 docker run 旗標 執行建置中使用的容器。

指定 Dockerfile (-f, --file)

$ docker buildx build -f <filepath> .

指定要使用的 Dockerfile 的檔案路徑。如果未指定,則預設使用建置上下文根目錄中名為 Dockerfile 的檔案。

若要從標準輸入讀取 Dockerfile,您可以使用 - 作為 --file 的參數。

$ cat Dockerfile | docker buildx build -f - .

將單平台建置結果載入到 docker images (--load)

--output=type=docker 的縮寫。將自動將單平台建置結果載入到 docker images

將建置結果中繼資料寫入檔案 (--metadata-file)

若要輸出建置中繼資料(例如映像檔摘要),請傳遞 --metadata-file 旗標。中繼資料將以 JSON 物件的形式寫入指定的檔案。指定檔案的目錄必須已存在且可寫入。

$ docker buildx build --load --metadata-file metadata.json .
$ cat metadata.json
{
  "buildx.build.provenance": {},
  "buildx.build.ref": "mybuilder/mybuilder0/0fjb6ubs52xx3vygf6fgdl611",
  "buildx.build.warnings": {},
  "containerimage.config.digest": "sha256:2937f66a9722f7f4a2df583de2f8cb97fc9196059a410e7f00072fc918930e66",
  "containerimage.descriptor": {
    "annotations": {
      "config.digest": "sha256:2937f66a9722f7f4a2df583de2f8cb97fc9196059a410e7f00072fc918930e66",
      "org.opencontainers.image.created": "2022-02-08T21:28:03Z"
    },
    "digest": "sha256:19ffeab6f8bc9293ac2c3fdf94ebe28396254c993aea0b5a542cfb02e0883fa3",
    "mediaType": "application/vnd.oci.image.manifest.v1+json",
    "size": 506
  },
  "containerimage.digest": "sha256:19ffeab6f8bc9293ac2c3fdf94ebe28396254c993aea0b5a542cfb02e0883fa3"
}

注意

建置記錄來源 (buildx.build.provenance) 預設包含最少的來源資訊。設定 BUILDX_METADATA_PROVENANCE 環境變數來自訂此行為。

注意

建置警告 (buildx.build.warnings) 預設不包含在內。將 BUILDX_METADATA_WARNINGS 環境變數設定為 1true 即可包含它們。

設定建置期間 RUN 指令的網路模式 (--network)

網路模式的可用選項如下:

更多詳細資訊請參閱 Dockerfile 參考

忽略特定階段的建置快取 (--no-cache-filter)

--no-cache-filter 允許您指定一個或多個多階段 Dockerfile 的階段,應忽略這些階段的建置快取。要指定多個階段,請使用逗號分隔的語法。

$ docker buildx build --no-cache-filter stage1,stage2,stage3 .

例如,以下 Dockerfile 包含四個階段:

# syntax=docker/dockerfile:1

FROM oven/bun:1 AS base
WORKDIR /app

FROM base AS install
WORKDIR /temp/dev
RUN --mount=type=bind,source=package.json,target=package.json \
    --mount=type=bind,source=bun.lockb,target=bun.lockb \
    bun install --frozen-lockfile

FROM base AS test
COPY --from=install /temp/dev/node_modules node_modules
COPY . .
RUN bun test

FROM base AS release
ENV NODE_ENV=production
COPY --from=install /temp/dev/node_modules node_modules
COPY . .
ENTRYPOINT ["bun", "run", "index.js"]

要忽略 install 階段的快取:

$ docker buildx build --no-cache-filter install .

要忽略 installrelease 階段的快取:

$ docker buildx build --no-cache-filter install,release .

--no-cache-filter 旗標的參數必須是階段的名稱。

設定建置結果的匯出動作 (-o, --output)

-o, --output=[PATH,-,type=TYPE[,KEY=VALUE]

設定建置結果的匯出動作。使用 docker 建置驅動程式 時,預設輸出是一個匯出到本地映像檔儲存庫的容器映像檔。--output 旗標使此步驟可設定,允許將結果直接匯出到用戶端的檔案系統、OCI 映像檔壓縮檔、registry 等等。

使用 docker 驅動程式的 Buildx 僅支援本地、壓縮檔和映像檔 匯出器docker-container 驅動程式支援所有匯出器。

如果您僅指定檔案路徑作為 --output 的參數,Buildx 將使用本地匯出器。如果值為 -,Buildx 將使用 tar 匯出器并将輸出寫入 stdout。

$ docker buildx build -o . .
$ docker buildx build -o outdir .
$ docker buildx build -o - . > out.tar
$ docker buildx build -o type=docker .
$ docker buildx build -o type=docker,dest=- . > myimage.tar
$ docker buildx build -t tonistiigi/foo -o type=registry

您可以透過重複此旗標來匯出多個輸出。

支援的匯出類型如下:

local

local 匯出類型會將所有結果檔案寫入用戶端上的目錄。新檔案將由目前使用者擁有。在多平台建置中,所有結果都將按其平台放置在子目錄中。

屬性鍵值

更多資訊,請參閱 本地和 tar 匯出器

tar

tar 匯出類型會將所有結果檔案寫入用戶端上的單個 tar 压缩檔。在多平台建置中,所有結果都將按其平台放置在子目錄中。

屬性鍵值

更多資訊,請參閱 本地和 tar 匯出器

oci

oci 匯出類型會將結果映像檔或 manifest 清單寫入用戶端上的 OCI 映像檔佈局OCI 和 Docker 匯出器

docker

docker 匯出類型會將單平台結果映像檔寫入用戶端上的 Docker 映像檔規格registry

屬性鍵

更多資訊,請參閱 OCI 和 Docker 匯出器

image

image 匯出器將建置結果寫入映像檔或 manifest 清單。使用 docker 驅動程式時,映像檔將出現在 docker images 中。或者,可以透過指定屬性將映像檔自動推送到 registry。

屬性鍵

更多資訊,請參閱 映像檔和 registry 匯出器

registry

registry 匯出器是 type=image,push=true 的捷徑。

更多資訊,請參閱 映像檔和 registry 匯出器

設定建置的目標平台 (--platform)

--platform=value[,value]

設定建置的目標平台。Dockerfile 中所有沒有自己的 --platform 旗標的 FROM 指令都將为此平台提取基礎映像檔,此值也將是結果映像檔的平台。

預設值是執行建置的 BuildKit daemon 的平台。值的格式為 os/archos/arch/variant。例如,linux/amd64linux/arm/v7。此外,--platform 旗標也支援特殊的 local 值,它指示 BuildKit 使用叫用建置的 BuildKit 用戶端的平台。

docker-container 驅動程式與 buildx 一起使用時,此旗標可以接受多個以逗號分隔的值作為輸入。使用多個值時,將為所有指定的平台建置結果,並將其合併到單個 manifest 清單中。

如果 Dockerfile 需要叫用 RUN 指令,建置器需要對指定平台的執行階段支援。在乾淨的設定中,您只能為您的系統架構執行 RUN 指令。如果您的核心支援 binfmt_miscDockerfile 參考

您可以在 containerd 原始碼 中找到平台指定符的格式定義。

$ docker buildx build --platform=linux/arm64 .
$ docker buildx build --platform=linux/amd64,linux/arm64,linux/arm/v7 .
$ docker buildx build --platform=darwin .

設定進度輸出類型 (--progress)

--progress=VALUE

設定進度輸出類型 (autoplainttyrawjson)。 使用 plain 顯示容器輸出 (預設為 auto)。

注意

您也可以使用 BUILDKIT_PROGRESS 環境變數來設定其值。

以下範例在構建期間使用 plain 輸出

$ docker buildx build --load --progress=plain .

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 227B 0.0s done
#1 DONE 0.1s

#2 [internal] load .dockerignore
#2 transferring context: 129B 0.0s done
#2 DONE 0.0s
...

注意

另請查看 BUILDKIT_COLORS 環境變數以修改終端輸出的顏色。

rawjson 輸出將 BuildKit 的解決狀態事件編組為 JSON 行。 此模式設計為由外部程式讀取。

建立來源證明 (--provenance)

--attest=type=provenance 的簡寫,用於設定構建結果的來源證明。 例如,--provenance=mode=max 可以用作 --attest=type=provenance,mode=max 的縮寫。

此外,--provenance 可以與布林值一起使用來啟用或停用來源證明。 例如,--provenance=false 停用所有來源證明,而 --provenance=true 啟用所有來源證明。

預設情況下,將為構建結果建立最少的來源證明。 請注意,Docker Engine 中的預設映像檔儲存庫不支援證明。 如果您使用預設映像檔儲存庫,來源證明僅適用於直接推送到登錄檔的映像檔。 或者,您可以切換到使用 containerd 映像檔儲存庫。

有關來源證明的更多資訊,請參閱 這裡

將構建結果推送到登錄檔 (--push)

--output=type=registry 的簡寫。 將自動將構建結果推送到登錄檔。

建立 SBOM 證明 (--sbom)

--attest=type=sbom 的簡寫,用於設定構建結果的 SBOM 證明。 例如,--sbom=generator=<user>/<generator-image> 可以用作 --attest=type=sbom,generator=<user>/<generator-image> 的縮寫。

此外,--sbom 可以與布林值一起使用來啟用或停用 SBOM 證明。 例如,--sbom=false 停用所有 SBOM 證明。

請注意,Docker Engine 中的預設映像檔儲存庫不支援證明。 如果您使用預設映像檔儲存庫,來源證明僅適用於直接推送到登錄檔的映像檔。 或者,您可以切換到使用 containerd 映像檔儲存庫。

如需詳細資訊,請參閱這裡

要公開給構建的機密 (--secret)

--secret=[type=TYPE[,KEY=VALUE]

將機密(身份驗證憑證、權杖)公開給構建。 可以使用 Dockerfile 中的 RUN --mount=type=secret 掛載將機密掛載到構建中。 有關如何使用構建機密的更多資訊,請參閱 構建機密

支援的類型為

如果未設定,Buildx 會嘗試自動偵測 type。 如果設定了與 id 相同鍵值的環境變數,則 Buildx 使用 type=env,並且變數值成為機密。 如果未設定此類環境變數,且未設定 type,則 Buildx 回退到 type=file

type=file

從檔案來源構建機密。

type=file 概要
$ docker buildx build --secret [type=file,]id=<ID>[,src=<FILEPATH>] .
type=file 屬性
鍵值說明預設值
id機密的 ID。不適用(此鍵值為必填)
srcsource包含機密值的檔案路徑(絕對路徑或相對於目前工作目錄的路徑)。如果未設定,則為 id
type=file 用法

在以下範例中,由於未設定符合 aws(ID)的環境變數,因此會自動偵測 type=file

$ docker buildx build --secret id=aws,src=$HOME/.aws/credentials .
# syntax=docker/dockerfile:1
FROM python:3
RUN pip install awscli
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
  aws s3 cp s3://... ...

type=env

從環境變數來源構建機密。

type=env 概要
$ docker buildx build --secret [type=env,]id=<ID>[,env=<VARIABLE>] .
type=env 屬性
鍵值說明預設值
id機密的 ID。不適用(此鍵值為必填)
envsrcsource來源機密的環境變數。如果未設定,則為 id
type=env 用法

在以下範例中,由於設定了符合 id 的環境變數,因此會自動偵測 type=env

$ SECRET_TOKEN=token docker buildx build --secret id=SECRET_TOKEN .
# syntax=docker/dockerfile:1
FROM node:alpine
RUN --mount=type=bind,target=. \
  --mount=type=secret,id=SECRET_TOKEN,env=SECRET_TOKEN \
  yarn run test

在以下範例中,構建參數 SECRET_TOKEN 設定為包含環境變數 API_KEY 的值。

$ API_KEY=token docker buildx build --secret id=SECRET_TOKEN,env=API_KEY .

您也可以使用 srcsource 指定環境變數的名稱

$ API_KEY=token docker buildx build --secret type=env,id=SECRET_TOKEN,src=API_KEY .

注意

使用 srcsource 指定環境變數名稱時,您需要明確設定 type=env,否則 Buildx 會假設機密為 type=file,並尋找名稱為 srcsource 的檔案(在本例中,為名為 API_KEY 的檔案,相對於執行 docker buildx build 命令的位置)。

構建容器的共享記憶體大小 (--shm-size)

設定使用 RUN 指令時為構建容器分配的共享記憶體大小。

格式為 <數字><單位>數字 必須大於 0。 單位是可選的,可以是 b(位元組)、k(千位元組)、m(兆位元組)或 g(吉位元組)。 如果您省略單位,系統將使用位元組。

注意

在大多數情況下,建議讓構建器自動確定適當的配置。 僅當需要針對複雜的構建場景進行特定效能調整時,才應考慮手動調整。

要公開給構建的 SSH 代理程式通訊端或金鑰 (--ssh)

--ssh=default|<id>[=<socket>|<key>[,<key>]]

當 Dockerfile 中的某些命令需要特定的 SSH 身份驗證時(例如,複製私有儲存庫),這會很有用。

--ssh 將 SSH 代理程式通訊端或金鑰公開給構建,並且可以與 RUN --mount=type=ssh 掛載 一起使用。

使用 SSH 代理程式通訊端存取 Gitlab 的範例

# syntax=docker/dockerfile:1
FROM alpine
RUN apk add --no-cache openssh-client
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
RUN --mount=type=ssh ssh -q -T git@gitlab.com 2>&1 | tee /hello
# "Welcome to GitLab, @GITLAB_USERNAME_ASSOCIATED_WITH_SSHKEY" should be printed here
# with the type of build progress is defined as `plain`.
$ eval $(ssh-agent)
$ ssh-add ~/.ssh/id_rsa
(Input your passphrase here)
$ docker buildx build --ssh default=$SSH_AUTH_SOCK .

標記映像檔 (-t, --tag)

$ docker buildx build -t docker/apache:2.0 .

此範例的構建方式與前一個範例相同,但它會標記產生的映像檔。 儲存庫名稱將為 docker/apache,標籤為 2.0

閱讀更多關於有效標籤的資訊.

您可以將多個標籤套用到映像檔。 例如,您可以將 latest 標籤套用到新構建的映像檔,並新增另一個參考特定版本的標籤。

例如,要將映像檔同時標記為 docker/fedora-jboss:latestdocker/fedora-jboss:v2.1,請使用以下命令

$ docker buildx build -t docker/fedora-jboss:latest -t docker/fedora-jboss:v2.1 .

指定目標構建階段 (--target)

使用多個構建階段構建 Dockerfile 時,使用 --target 選項按名稱指定中間構建階段作為結果映像檔的最終階段。 構建器會跳過目標階段之後的命令。

FROM debian AS build-env
# ...

FROM alpine AS production-env
# ...
$ docker buildx build -t mybuildimage --target build-env .

設定 ulimits (--ulimit)

使用 RUN 指令時,--ulimit 會覆蓋建置容器的預設 ulimit,並使用軟限制和硬限制進行指定,格式如下:<類型>=<軟限制>[:<硬限制>],例如

$ docker buildx build --ulimit nofile=1024:1024 .

注意

如果您未提供 硬限制,則 軟限制 將同時用於兩個值。如果未設定任何 ulimit,則會繼承守護行程上設定的預設 ulimit

注意

在大多數情況下,建議讓構建器自動確定適當的配置。 僅當需要針對複雜的構建場景進行特定效能調整時,才應考慮手動調整。