共用方式為


教學課程: 在 Azure Container Registry 中更新基底映像時自動執行容器映像建置

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

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

在本教學課程中:

  • 建置基底映像
  • 在相同登錄中建立應用程式映像以追蹤基礎映像
  • 更新基底映像以觸發應用程式映像工作
  • 顯示已觸發的工作
  • 確認更新的應用程式映像

必要條件

完成先前的教學課程

本教學課程假設您已設定環境,並完成本系列前兩個教學課程中的步驟,其間您完成了下列作業:

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

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

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

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

設定環境

  • 本文需要 2.0.46 版或更新版本的 Azure CLI。 如果您是使用 Azure Cloud Shell,就已安裝最新版本。

請在這些殼層環境變數中填入您的環境適用的值。 此步驟並不是必要動作,但可簡化在本教學課程中執行多行 Azure CLI 命令的作業。 若未填入這些環境變數,則必須手動取代命令範例中出現的每個值。

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

基底映像更新案例

本教學課程會逐步引導您進行基礎映像更新案例,以在單一登錄中維護基礎映像和應用程式映像。

程式碼範例包含兩個 Dockerfile:一個應用程式映像,及其指定作為基底的映像。 在以下幾節中,您會建立一項 ACR 工作,以在基底映像的新版本推送至相同容器登錄時自動觸發應用程式映像的建置。

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

  • Dockerfile-base: Dockerfile-app 指定作為其基底的映像。 它本身會以節點映像為基礎,且包含 NODE_VERSION 環境變數。

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

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

建置基底映像

首先請使用 az acr build,透過 ACR 工作的快速工作來建置基礎映像。 如本系列的第一個教學課程所討論的,此程序不僅會建置映像,也會在建置成功時將映像推送至您的容器登錄。

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

建立工作

接著,請使用 az acr task create 建立工作:

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

此工作類似於上一個教學課程中建立的工作。 它會指示 ACR 工作在認可推送至 --context 所指定的存放庫時觸發映像建置。 在上一個教學課程中用來建置映像的 Dockerfile 會指定公用基底映像 (FROM node:15-alpine),而此工作中的 Dockerfile Dockerfile-app,則是會指定相同登錄中的基底映像:

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

此組態可以讓稍後在本教學課程中的基底映像模擬架構修補程式變得容易。

建置應用程式容器

請使用 az acr task run 手動觸發工作,並建置應用程式映像。 必須執行此步驟,工作才會在基礎映像上追蹤應用程式映像的相依性。

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

工作完成後,如果您想要完成下列選擇性步驟,請記下回合識別碼 (例如 "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> 取代為在上一個步驟的輸出中找到的回合識別碼 (例如 "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    TASK            PLATFORM    STATUS     TRIGGER    STARTED               DURATION
--------  --------------  ----------  ---------  ---------  --------------------  ----------
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
cav       example2        linux       Succeeded  Commit     2020-11-20T23:16:07Z  00:00:55
cau       example1        linux       Succeeded  Commit     2020-11-20T23:16:07Z  00:00:40
cat       taskhelloworld  linux       Succeeded  Manual     2020-11-20T23:07:29Z  00:00:27

更新基底映像

在此您將模擬基底映像中的架構修補程式。 請編輯 Dockerfile-base,並在 NODE_VERSION 中定義的版本號碼後面加上 "a":

ENV NODE_VERSION 15.2.1a

執行快速工作,以建置經過修改的基底映像。 請記下輸出中的回合識別碼

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

當建置完成,且 ACR 工作已將新的基底映像推送至您的登錄後,它會觸發應用程式映像的建置。 您先前建立的工作可能需要一些時間才能觸發應用程式映像建置,因為它必須偵測最新建置並推送的基底映像。

列出更新的組建

現在您已更新基底映像,接下來可以再次列出您的工作回合,將其與先前的清單比較。 若起初輸出並無差異,請定期執行命令,以查看清單中出現的新工作回合。

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

輸出大致如下。 最後執行之建置的 TRIGGER 應為 "Image Update",表示工作是由基底映像的快速工作所起始。

Run ID    TASK            PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
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
cav       example2        linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:55
cau       example1        linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:40
cat       taskhelloworld  linux       Succeeded  Manual        2020-11-20T23:07:29Z  00:00:27

如果您想要執行下列選擇性步驟以執行新建置的容器,並查看更新的版本號碼,請記下映像更新觸發之組建的 RUN ID 值 (在上述輸出中,其值為 "ca11")。

選擇性:執行新建置的映像

如果您在本機工作 (而不是在 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

下一步

在本教學課程中,您已了解如何使用工作,在映像的基底映像有所更新時自動觸發容器映像建置。

如需管理源自公用來源之基礎映像的完整工作流程,請參閱如何使用 Azure Container Registry 工作取用和維護公用內容

現在,請繼續進行下一個教學課程,了解如何根據定義的排程觸發工作。