使用內容信任實現自動化

將 Docker 內容信任內建到現有自動化系統中是非常普遍的。為了讓工具能夠封裝 Docker 並推送受信任的內容,可以透過環境變數傳遞給客戶端。

本指南遵循 使用 Docker 內容信任為映象簽名 中描述的步驟。請確保您理解並遵循先決條件。

當直接使用 Notary 客戶端時,它會使用其自己的一套環境變數

新增委託私鑰

為了自動化將委託私鑰匯入本地 Docker 信任庫,我們需要為新金鑰傳遞一個密碼。每次該委託對標籤進行簽名時,都需要這個密碼。

$ export DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE="mypassphrase123"

$ docker trust key load delegation.key --name jeff
Loading key from "delegation.key"...
Successfully imported key from delegation.key

新增委託公鑰

如果您在新增委託公鑰的同時初始化一個倉庫,那麼您將需要使用本地 Notary 規範根金鑰的密碼來建立倉庫的信任資料。如果倉庫已經初始化,那麼您只需要倉庫的密碼。

# Export the Local Root Key Passphrase if required.
$ export DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE="rootpassphrase123"

# Export the Repository Passphrase
$ export DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE="repopassphrase123"

# Initialize Repo and Push Delegation
$ docker trust signer add --key delegation.crt jeff registry.example.com/admin/demo
Adding signer "jeff" to registry.example.com/admin/demo...
Initializing signed repository for registry.example.com/admin/demo...
Successfully initialized "registry.example.com/admin/demo"
Successfully added signer: registry.example.com/admin/demo

為映象簽名

最後,在為映象簽名時,我們需要匯出簽名金鑰的密碼。這是在透過 $ docker trust key load 將金鑰載入到本地 Docker 信任庫時建立的。

$ export DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE="mypassphrase123"

$ docker trust sign registry.example.com/admin/demo:1
Signing and pushing trust data for local image registry.example.com/admin/demo:1, may overwrite remote trust data
The push refers to repository [registry.example.com/admin/demo]
428c97da766c: Layer already exists
2: digest: sha256:1a6fd470b9ce10849be79e99529a88371dff60c60aab424c077007f6979b4812 size: 524
Signing and pushing trust metadata
Successfully signed registry.example.com/admin/demo:1

使用內容信任進行構建

您還可以使用內容信任進行構建。在執行 docker build 命令之前,您應該手動或以指令碼方式設定環境變數 DOCKER_CONTENT_TRUST。請看下面這個簡單的 Dockerfile。

# syntax=docker/dockerfile:1
FROM docker/trusttest:latest
RUN echo

FROM 標籤正在拉取一個已簽名的映象。您不能構建一個其 FROM 映象既不存在於本地也未被簽名的映象。假設 latest 標籤存在內容信任資料,那麼以下構建應該會成功。

$  docker build -t docker/trusttest:testing .
Using default tag: latest
latest: Pulling from docker/trusttest

b3dbab3810fc: Pull complete
a9539b34a6ab: Pull complete
Digest: sha256:d149ab53f871

如果啟用了內容信任,從依賴於沒有信任資料的標籤的 Dockerfile 構建,會導致構建命令失敗。

$  docker build -t docker/trusttest:testing .
unable to process Dockerfile: No trust data for notrust