共用方式為


教學課程:在另一個私人容器登錄中更新基礎映像時自動化容器映像建置

ACR 工作支援在容器的基礎映像更新時自動進行映像建置,例如當您在其中一個基礎映像中修補 OS 或應用程式架構時。

在本教學課程中,您將學習如何建立一個 ACR 工作,當容器的基礎映像推送至另一個 Azure 容器登錄時,在雲端觸發建置。 您也可以嘗試另一個教學課程,建立一個 ACR 工作,當基礎映像推送至相同的 Azure 容器登錄時觸發映像建置。

在本教學課程中:

  • 在基礎登錄中建置基礎映像
  • 在另一個登錄中建立應用程式建置工作以追蹤基礎映像
  • 更新基礎映像以觸發應用程式映像工作
  • 顯示已觸發的工作
  • 驗證已更新的應用程式映像

先決條件

完成先前的教學課程

本教學課程假設您已經設定好環境,並完成此系列前兩個教學課程中的步驟,在這些教學課程中,您已經:

  • 建立 Azure Container Registry
  • 分支範例存放庫
  • 複製範例存放庫
  • 建立 GitHub 個人存取權杖

如果您尚未完成,請先完成下列教學課程再繼續:

使用 Azure Container Registry 工作在雲端建置容器映像

使用 Azure Container Registry 工作自動化容器映像建置

除了先前教學課程中建立的容器登錄 之外,您還需要建立另一個 Registry 來儲存基礎映像。 如果您願意,可以在與原始登錄不同的位置建立第二個登錄。

設定環境

請使用適合您環境的值來填入這些 Shell 環境變數。 此步驟並非絕對必要,但能讓您在本教學課程中執行多行 Azure CLI 命令時更為方便。 如果您未填入這些環境變數,則必須在範例命令中每次出現時手動取代對應的值。

BASE_ACR=<base-registry-name>   # The name of your Azure container registry for base images
ACR_NAME=<registry-name>        # The name of your Azure container registry for application images
GIT_USER=<github-username>      # Your GitHub user account name
GIT_PAT=<personal-access-token> # The PAT you generated in the second tutorial

基礎映像更新案例

本教學課程將引導您完成一個基礎映像更新案例。 此案例反映了一種開發工作流程,用於在建立其他登錄中的應用程式映像時,在共用的私人容器登錄中管理基礎映像。 基礎映像可以指定團隊所使用的共通作業系統與架構,甚至是共通的服務元件。

例如,在各自登錄中開發應用程式映像的開發人員,可以存取由共用基礎登錄維護的一組基礎映像。 基礎登錄可以位於其他區域,甚至是進行異地複寫。

程式碼範例包含兩個 Dockerfile:一個是應用程式映像,另一個是其指定為基礎的映像。 在接下來的章節中,您會建立一個 ACR 工作,當新的基礎映像版本被推送到另一個 Azure Container Registry 時,自動觸發應用程式映像的建置。

  • Dockerfile-app:一個小型的 Node.js Web 應用程式,會呈現一個靜態網頁,顯示其所基於的 Node.js 版本。 版本字串是模擬的:它會顯示定義於基礎映像中的環境變數 NODE_VERSION 的內容。

  • Dockerfile-baseDockerfile-app 指定為其基礎的映像。 它本身是以節點映像為基礎,並包含 NODE_VERSION 環境變數。

在接下來的章節中,您會建立一個工作,更新基礎映像 Dockerfile 中的 NODE_VERSION 值,然後使用 ACR 工作建置基礎映像。 當 ACR 工作將新的基礎映像推送到您的登錄時,會自動觸發應用程式映像的建置。 您也可以選擇在本機執行應用程式容器映像,以查看已建置映像中不同的版本字串。

在本教學課程中,您的 ACR 工作會建置並推送 Dockerfile 中所指定的應用程式容器映像。 ACR 工作也可以執行多步驟工作,使用 YAML 檔案來定義建置、推送,並視需要測試多個容器的步驟。

建立基礎映像

首先,使用 ACR 工作快速工作,透過 az acr build 建立基礎映像。 如系列中的第一個教學課程所述,這個過程不僅建立映像,若建立成功還會將映像推送到您的容器登錄中心。 在此範例中,映像會被推送到基礎映像登錄中心。

az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .

建立工作以追蹤私人基礎映像

接下來,在應用程式映像登錄中心建立工作,使用 az acr task create,並啟用受控識別。 受控識別在後續步驟中使用,以便工作可以使用基礎映像登錄中心進行驗證。

此範例使用系統指派識別,但您也可以為特定情境建立並啟用使用者指派受控識別。 詳細資訊,請參閱 ACR 工作中使用 Azure 受控識別的跨登錄中心驗證

az acr task create \
    --registry $ACR_NAME \
    --name baseexample2 \
    --image helloworld:{{.Run.ID}} \
    --context https://github.com/$GIT_USER/acr-build-helloworld-node.git#main \
    --file Dockerfile-app \
    --git-access-token $GIT_PAT \
    --arg REGISTRY_NAME=$BASE_ACR.azurecr.io \
    --assign-identity

此工作類似於先前教學課程中建立的工作。 它指示 ACR 工作在將提交推送至 --context 指定的儲存庫時觸發映像建立。 雖然先前教學課程用來建立映像的 Dockerfile 指定了公共基礎映像 (FROM node:15-alpine),此工作的 Dockerfile-app 指定了基礎映像登錄中心的基礎映像:

FROM ${REGISTRY_NAME}/baseimages/node:15-alpine

此組態讓在本教學課程稍後模擬基礎映像框架修補變得簡單。

給予識別提取基礎登錄中心的權限

為了給工作的受控識別權限從基礎映像登錄中心提取映像,首先執行 az acr task show 以取得識別的服務主體 ID。 然後執行 az acr show 以取得基礎登錄中心的資源 ID:

# Get service principal ID of the task
principalID=$(az acr task show --name baseexample2 --registry $ACR_NAME --query identity.principalId --output tsv) 

# Get resource ID of the base registry
baseregID=$(az acr show --name $BASE_ACR --query id --output tsv) 

執行 az role assignment create,將受控識別提取許可權指派給登錄。 角色指派中應使用的正確角色取決於登錄中心是否啟用 ABAC

ROLE="Container Registry Repository Reader" # For ABAC-enabled registries. For non-ABAC registries, use AcrPull.
az role assignment create \
  --assignee $principalID \
  --scope $baseregID --role "$ROLE" 

將目標登錄中心的認證新增至工作

執行 az acr task credential add 將認證新增至工作。 傳遞 --use-identity [system] 參數以表示工作的系統指派受控識別可以存取這些認證。

az acr task credential add \
  --name baseexample2 \
  --registry $ACR_NAME \
  --login-server $BASE_ACR.azurecr.io \
  --use-identity [system] 

手動執行工作

使用 az acr task run 手動觸發工作並建立應用程式映像。 此步驟是必要的,以便工作追蹤應用程式映像對基礎映像的相依性。

az acr task run --registry $ACR_NAME --name baseexample2

工作完成後,請記下 Run ID (例如「da6」),以便完成後續的選用步驟。

選用:在本地執行應用程式容器

如果您在本地作業 (非 Cloud Shell),並且已安裝 Docker,請執行容器以在重新建立基礎映像前在瀏覽器中查看應用程式呈現。 如果使用 Cloud Shell,請略過此部分 (Cloud Shell 不支援 az acr logindocker run)。

首先,使用 az acr login 驗證您的容器登錄中心:

az acr login --name $ACR_NAME

現在,使用 docker run 在本地執行容器。 將 <run-id> 替換為前一步驟輸出中找到的 Run ID (例如「da6」)。 此範例將容器命名為 myapp,並包含 --rm 參數,以在停止容器時將其移除。

docker run -d -p 8080:80 --name myapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>

在瀏覽器中前往 http://localhost:8080,您應該可以看到網頁中呈現的 Node.js 版本號,如下所示。 在後續步驟中,您會在版本字串後加入「a」來提升版本。

瀏覽器中範例應用程式的螢幕擷取畫面

要停止並移除容器,執行以下命令:

docker stop myapp

列出建立紀錄

接下來,使用 az acr task list-runs 命令列出 ACR 工作為您的登錄中心完成的工作執行紀錄:

az acr task list-runs --registry $ACR_NAME --output table

如果您完成了前一個教學課程 (且未刪除登錄中心),您應該會看到類似的輸出。 請記下工作執行的數量以及最新的 RUN ID,以便在下一節更新基礎映像後比較輸出。

az acr task list-runs --registry $ACR_NAME --output table
UN ID    TASK            PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
ca12      baseexample2    linux       Succeeded  Manual        2020-11-21T00:00:56Z  00:00:36
ca11      baseexample1    linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:34
ca10      taskhelloworld  linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:24
cay                       linux       Succeeded  Manual        2020-11-20T23:38:08Z  00:00:22
cax       baseexample1    linux       Succeeded  Manual        2020-11-20T23:33:12Z  00:00:30
caw       taskhelloworld  linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:29

更新基礎映像

在此模擬基礎映像中的框架修補。 編輯 Dockerfile-base,並在 NODE_VERSION 定義的版本號後加入「a」:

ENV NODE_VERSION 15.2.1a

執行快速工作以建立修改後的基礎映像。 請記下輸出中的 Run ID

az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .

當建立完成且 ACR 工作將新的基礎映像推送到您的登錄中心後,它會觸發應用程式映像的建立。 由於必須偵測新建立並推送的基礎映像,先前建立的工作可能需要一些時間才會觸發應用程式映像的建立。

列出更新後的建立紀錄

現在您已更新基礎映像,再次列出工作執行紀錄以與之前的列表比較。 如果最初輸出沒有差異,請定期執行命令以查看新工作執行出現。

az acr task list-runs --registry $ACR_NAME --output table

輸出類似如下。 最後執行的建立的 TRIGGER 應為「Image Update」,表示工作是由基礎映像的快速工作觸發的。

az acr task list-runs --registry $ACR_NAME --output table
         PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
ca13      baseexample2    linux       Succeeded  Image Update  2020-11-21T00:06:00Z  00:00:43
ca12      baseexample2    linux       Succeeded  Manual        2020-11-21T00:00:56Z  00:00:36
ca11      baseexample1    linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:34
ca10      taskhelloworld  linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:24
cay                       linux       Succeeded  Manual        2020-11-20T23:38:08Z  00:00:22
cax       baseexample1    linux       Succeeded  Manual        2020-11-20T23:33:12Z  00:00:30
caw       taskhelloworld  linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:29

如果您想執行選用步驟以運行新建立的容器以查看更新的版本號,請記下 Image Update 觸發的建立的 RUN ID (在前一個輸出中為「ca13」)。

選用:執行新建立的映像

如果您在本地作業 (非 Cloud Shell),並且已安裝 Docker,請在建立完成後運行新的應用程式映像。 將 <run-id> 替換為前一步驟取得的 RUN ID。 如果使用 Cloud Shell,請略過此部分 (Cloud Shell 不支援 docker run)。

docker run -d -p 8081:80 --name updatedapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>

在瀏覽器中前往 http://localhost:8081,您應該可以看到網頁中呈現的更新 Node.js 版本號 (含「a」):

瀏覽器中更新後的範例應用程式的螢幕擷取畫面

重點是,您已用新版本號更新了基礎映像,但最後建立的應用程式映像仍然顯示新版本。 ACR 工作偵測到您對基礎映像的變更,並自動重新建立了您的應用程式映像。

要停止並移除容器,執行以下命令:

docker stop updatedapp

後續步驟

在本教學課程中,您學會了如何使用工作,在基礎映像更新時自動觸發容器映像建立。 現在,請進入下一個教學課程以了解如何在定義的排程上觸發工作。