建置密碼

建構機密是指應用程式建構過程中所需的任何敏感資訊,例如密碼或 API 權杖 (token)。

建構引數 (Build arguments) 與環境變數不適合用於傳遞機密至建構過程中,因為它們會保留在最終映像檔內。相反地,您應該使用機密掛載或 SSH 掛載,這些方式能安全地將機密暴露給建構過程。

建構機密類型

  • 機密掛載是用於將機密傳遞至建構過程中的通用掛載方式。機密掛載會從建構用戶端取得機密,並在建構指令執行期間,使其在建構容器內臨時可用。若您的建構過程需要與私人元件伺服器或 API 通訊,這會非常實用。
  • SSH 掛載是用於使 SSH 通訊端或金鑰在建構過程中可用的特殊用途掛載。當您需要在建構時取得私人 Git 儲存庫時,這通常會被使用。
  • 遠端環境的 Git 身份驗證是一組預先定義的機密,適用於當您使用同時為私人儲存庫的遠端 Git 環境進行建構時。這些機密屬於「預檢 (pre-flight)」機密:它們不會在建構指令內被消耗,而是用於提供建構器必要的憑證以取得環境內容。

使用建構機密

對於機密掛載與 SSH 掛載,使用建構機密是一個兩步驟的過程。首先,您需要將機密傳遞給 docker build 指令,接著需要在 Dockerfile 中使用該機密。

若要將機密傳遞至建構過程,請使用 docker build --secret 旗標,或 Bake 的對應選項。

$ docker build --secret id=aws,src=$HOME/.aws/credentials .
variable "HOME" {
  default = null
}

target "default" {
  secret = [
    "id=aws,src=${HOME}/.aws/credentials"
  ]
}

若要在建構過程中使用機密並使其可供 RUN 指令存取,請在 Dockerfile 中使用 --mount=type=secret 旗標。

RUN --mount=type=secret,id=aws \
    AWS_SHARED_CREDENTIALS_FILE=/run/secrets/aws \
    aws s3 cp ...

機密掛載 (Secret mounts)

機密掛載會以檔案或環境變數的形式將機密暴露給建構容器。您可以使用機密掛載將敏感資訊傳遞至建構過程,例如 API 權杖、密碼或 SSH 金鑰。

來源

機密的來源可以是檔案環境變數。當您使用 CLI 或 Bake 時,類型會自動偵測。您也可以使用 type=filetype=env 明確指定。

以下範例將環境變數 KUBECONFIG 掛載至 ID 為 kube 的機密,作為建構容器中 /run/secrets/kube 的一個檔案。

$ docker build --secret id=kube,env=KUBECONFIG .

當您使用來自環境變數的機密時,可以省略 env 參數,將機密繫結至與變數名稱相同的檔案。在以下範例中,API_TOKEN 變數的值被掛載至建構容器中的 /run/secrets/API_TOKEN

$ docker build --secret id=API_TOKEN .

目標

在 Dockerfile 中使用機密時,預設會將機密掛載為一個檔案。建構容器內機密的預設檔案路徑為 /run/secrets/<id>。您可以使用 Dockerfile 中 RUN --mount 旗標的 targetenv 選項,自訂機密在建構容器中的掛載方式。

以下範例取得 ID 為 aws 的機密,並將其掛載至建構容器中的檔案 /run/secrets/aws

RUN --mount=type=secret,id=aws \
    AWS_SHARED_CREDENTIALS_FILE=/run/secrets/aws \
    aws s3 cp ...

若要將機密掛載為不同名稱的檔案,請在 --mount 旗標中使用 target 選項。

RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
    aws s3 cp ...

若要將機密掛載為環境變數而非檔案,請在 --mount 旗標中使用 env 選項。

RUN --mount=type=secret,id=aws-key-id,env=AWS_ACCESS_KEY_ID \
    --mount=type=secret,id=aws-secret-key,env=AWS_SECRET_ACCESS_KEY \
    --mount=type=secret,id=aws-session-token,env=AWS_SESSION_TOKEN \
    aws s3 cp ...

您可以同時使用 targetenv 選項,將機密同時掛載為檔案與環境變數。

SSH 掛載 (SSH mounts)

若您要在建構中使用的憑證是 SSH 代理通訊端或金鑰,您可以使用 SSH 掛載代替機密掛載。複製私人 Git 儲存庫是 SSH 掛載的常見使用場景。

以下範例使用 Dockerfile SSH 掛載複製一個私人 GitHub 儲存庫。

# syntax=docker/dockerfile:1
FROM alpine
ADD git@github.com:me/myprivaterepo.git /src/

若要將 SSH 通訊端傳遞至建構過程,請使用 docker build --ssh 旗標,或 Bake 的對應選項。

$ docker buildx build --ssh default .

遠端環境的 Git 身份驗證

BuildKit 支援兩種預定義的建構機密:GIT_AUTH_TOKENGIT_AUTH_HEADER。當您使用遠端私人 Git 儲存庫進行建構時,可使用它們來指定 HTTP 驗證參數,包含:

  • 以私人 Git 儲存庫作為建構環境
  • 在帶有 ADD 的建構過程中取得私人 Git 儲存庫

例如,假設您有一個位於 https://gitlab.com/example/todo-app.git 的私人 GitLab 專案,且您希望將該儲存庫作為建構環境來執行建構。未經驗證的 docker build 指令會失敗,因為建構器沒有權限提取 (pull) 該儲存庫。

$ docker build https://gitlab.com/example/todo-app.git
[+] Building 0.4s (1/1) FINISHED
 => ERROR [internal] load git source https://gitlab.com/example/todo-app.git
------
 > [internal] load git source https://gitlab.com/example/todo-app.git:
0.313 fatal: could not read Username for 'https://gitlab.com': terminal prompts disabled
------

若要讓建構器通過 Git 伺服器的驗證,請將 GIT_AUTH_TOKEN 環境變數設定為有效的 GitLab 存取權杖,並將其作為機密傳遞給建構過程。

$ GIT_AUTH_TOKEN=$(cat gitlab-token.txt) docker build \
  --secret id=GIT_AUTH_TOKEN \
  https://gitlab.com/example/todo-app.git

GIT_AUTH_TOKEN 也適用於 ADD,可在建構過程中取得私人 Git 儲存庫。

FROM alpine
ADD https://gitlab.com/example/todo-app.git /src

HTTP 驗證配置

預設情況下,透過 HTTP 進行的 Git 驗證使用 Bearer 驗證機制。

Authorization: Bearer <GIT_AUTH_TOKEN>

如果您需要使用包含使用者名稱與密碼的 Basic 機制,可以設定 GIT_AUTH_HEADER 建構機密。

$ export GIT_AUTH_TOKEN=$(cat gitlab-token.txt)
$ export GIT_AUTH_HEADER=basic
$ docker build \
  --secret id=GIT_AUTH_TOKEN \
  --secret id=GIT_AUTH_HEADER \
  https://gitlab.com/example/todo-app.git

BuildKit 目前僅支援 Bearer 與 Basic 機制。

多主機

您可以按主機設定 GIT_AUTH_TOKENGIT_AUTH_HEADER 機密,這讓您能針對不同的主機名稱使用不同的驗證參數。若要指定主機名稱,請將主機名稱作為字尾附加至機密 ID。

$ export GITLAB_TOKEN=$(cat gitlab-token.txt)
$ export GERRIT_TOKEN=$(cat gerrit-username-password.txt)
$ export GERRIT_SCHEME=basic
$ docker build \
  --secret id=GIT_AUTH_TOKEN.gitlab.com,env=GITLAB_TOKEN \
  --secret id=GIT_AUTH_TOKEN.gerrit.internal.example,env=GERRIT_TOKEN \
  --secret id=GIT_AUTH_HEADER.gerrit.internal.example,env=GERRIT_SCHEME \
  https://gitlab.com/example/todo-app.git
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.