View a markdown version of this page

建立新的容器配方版本 - EC2 Image Builder

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

建立新的容器配方版本

本節說明如何建立容器配方或現有配方的新版本。容器配方定義三個關鍵元素:基礎映像、建置元件和目標儲存庫。使用此配方來產生映像建置器存放在 Amazon ECR 中的Docker容器映像。

使用主控台建立新的容器配方版本

建立新版本的容器配方幾乎與建立新配方相同。差別在於,在大多數情況下,會預先選取特定詳細資訊以符合基本配方。下列清單說明建立新配方和建立新現有配方版本之間的差異。

配方詳細資訊
  • 名稱無法編輯

  • 版本 – 必要。此詳細資訊不會預先填入目前版本或任何種類的序列。以 major.minor.patch 格式輸入您要建立的版本編號。如果版本已存在,Image Builder 會傳回錯誤。

基礎映像
  • 選取影像選項 – 預先選取,但可編輯。如果您變更基礎映像來源的選擇,可能會遺失其他取決於您選擇的原始選項的詳細資訊。

    對於Docker容器映像,您可以選擇託管在 上的公有映像DockerHub、Amazon ECR 中的現有容器映像,或 Amazon 受管容器映像。若要查看與基礎映像選取項目相關聯的詳細資訊,請選擇符合您選取的標籤。

    Managed images
    • 映像作業系統 (OS)無法編輯

    • 影像名稱 – 根據您對現有配方所做的基礎影像選擇組合預先選取。不過,如果您變更選取映像選項,則會遺失預先選取的映像名稱

    • 自動版本控制選項不符合您的基本配方。自動版本控制選項預設為使用選取的作業系統版本選項。

      重要

      如果您使用語意版本控制來啟動管道建置,請務必將此值變更為使用最新的可用作業系統版本。若要進一步了解 Image Builder 資源的語意版本控制,請參閱 Image Builder 中的語意版本控制

    ECR image
    • 映像作業系統 (OS) – 預先選取,但可編輯。

    • 作業系統版本 – 已預先選取,但可編輯。

    • ECR 映像 ID – 預先填入,但可編輯。

    Docker Hub image
    • 映像作業系統 (OS)無法編輯

    • 作業系統版本 – 已預先選取,但可編輯。

    • Docker 映像 ID – 預先填入,但可編輯。

執行個體組態
  • AMI 來源 (必要) – 識別要用作容器建置和測試執行個體基礎映像的自訂 AMI。這可以是 AMI ID 或包含 AMI ID 的 AWS Systems Manager (SSM) 參數存放區參數。

    • AMI ID – 此設定不會預先填入您的原始項目。輸入基礎映像的 AMI ID。範例:ami-1234567890abcdef1

    • SSM 參數 – 輸入 SSM 參數存放區參數的名稱或 ARN,其中包含基礎映像的 AMI ID。範例:/ib/test/paramarn:aws:ssm:us-east-1:111122223333:parameter/ib/test/param

  • 儲存體 (磁碟區)

    EBS 磁碟區 1 (AMI 根目錄) – 預先填入。您無法編輯根磁碟區 裝置名稱快照IOPS 選擇。不過,您可以變更所有剩餘的設定,例如大小。您也可以新增磁碟區。

    注意

    如果您指定了從另一個帳戶與您共用的基本 AMI,則指定的任何次要磁碟區的快照也必須與您的 帳戶共用。

工作目錄
  • 工作目錄路徑 – 預先填入,但可編輯。

元件
  • 元件 – 已包含在配方中的元件會顯示在每個元件清單結尾的所選元件區段中 (建置和測試)。您可以移除或重新排序選取的元件,以符合您的需求。

    CIS 強化元件未遵循 Image Builder 配方中的標準元件排序規則。CIS 強化元件一律會最後執行,以確保基準測試會針對您的輸出映像執行。

    注意

    組建和測試元件清單會根據元件擁有者類型顯示可用的元件。若要新增元件,請選擇新增建置元件,然後選取適用的擁有權篩選條件。例如,若要新增與 AWS Marketplace 產品相關聯的建置元件,請選取 AWS Marketplace。這會在列出 AWS Marketplace 元件的主控台界面右側開啟選擇面板。

    針對 CIS 元件,選取 Third party managed

    您可以為所選元件設定下列設定:

    • 版本控制選項 – 已預先選取,但您可以進行變更。建議您選擇使用最新的可用元件版本選項,以確保您的映像建置一律取得最新版本的元件。如果您需要在配方中使用特定元件版本,您可以選擇指定元件版本,然後在出現的元件版本方塊中輸入版本

    • 輸入參數 – 顯示元件接受的輸入參數。會預先填入先前版本配方的值。如果您在此配方中第一次使用此元件,且已為輸入參數定義預設值,則預設值會顯示在帶有灰色文字的值方塊中。如果未輸入其他值,Image Builder 會使用預設值。

      如果需要輸入參數,但元件中沒有定義的預設值,您必須提供值。如果缺少任何必要的參數且未定義預設值,Image Builder 將不會建立配方版本。

      重要

      元件參數是純文字值,並會登入 AWS CloudTrail。建議您使用 AWS Secrets Manager 或 AWS Systems Manager 參數存放區來存放秘密。如需 Secrets Manager 的詳細資訊,請參閱什麼是 Secrets Manager? AWS Secrets Manager 《 使用者指南》中的 。如需 AWS Systems Manager 參數存放區的詳細資訊,請參閱AWS Systems Manager 《 使用者指南》中的AWS Systems Manager 參數存放區

    若要展開版本控制選項輸入參數的設定,您可以選擇設定名稱旁的箭頭。若要展開所有所選元件的所有設定,您可以切換關閉和開啟全部展開

Dockerfile 範本
  • Dockerfile 範本 – 預先填入,但可編輯。您可以指定下列任何內容變數,Image Builder 會在執行時間將其取代為組建資訊。

     

    parentImage (必要)

    在建置時,此變數會解析為配方的基本映像。

    範例:

    FROM {{{ imagebuilder:parentImage }}}
    環境 (如果指定元件則為必要)

    在建置時,此變數會解析為在建置內容中暫存元件的 Dockerfile 指令。這些指令會將元件指令碼複製到映像中,並設定這些指令碼使用的環境變數。它會準備環境,但不會執行您指定的元件。將此變數放在components變數之前。

    範例:

    {{{ imagebuilder:environments }}}
    元件 (選用)

    在建置時,此變數會解析為命令,該命令會針對容器配方包含的元件執行建置和測試元件指令碼,然後從映像中移除這些指令碼。這是執行元件的變數。將它放在 environments 變數之後。

    範例:

    {{{ imagebuilder:components }}}
目標儲存庫
  • 目標儲存庫名稱 – 如果管道的分佈組態中沒有為管道執行的區域 (區域 1) 指定其他儲存庫,則儲存輸出映像的 Amazon ECR 儲存庫。

若要建立新的容器配方版本:
  1. 在容器配方詳細資訊頁面上,選擇頁面頂端的新版本。主控台會開啟容器配方的建立配方頁面。

  2. 若要建立新版本,請進行變更,然後選擇建立配方

如需有關在建立映像管道時建立容器配方的詳細資訊,請參閱本指南步驟 2:選擇配方入門一節中的 。

使用 建立容器配方 AWS CLI

若要使用 中的 imagebuilder create-container-recipe命令建立 Image Builder 容器配方 AWS CLI,請遵循下列步驟:

先決條件

執行本節中的映像建置器命令以使用 建立容器配方之前 AWS CLI,您必須建立配方將使用的元件。下列步驟中的容器配方範例是指本指南 從 建立自訂元件 AWS CLI區段中建立的範例元件。

建立元件後,或者如果您使用的是現有的元件,請注意您要包含在配方中的 ARNs。

  1. 建立 CLI 輸入 JSON 文件

    您可以使用內嵌create-container-recipe命令參數來提供命令的所有輸入。不過,產生的命令可能相當長。若要簡化命令,您可以改為提供包含所有容器配方設定的 JSON 檔案

    注意

    JSON 檔案中資料值的命名慣例遵循為映像建置器 API 操作請求參數指定的模式。若要檢閱 API 操作請求參數,請參閱 EC2 Image Builder API 參考中的 CreateContainerRecipe 命令。

    若要提供資料值做為命令列參數,請參閱 AWS CLI 命令參考中指定的參數名稱。

    以下是此範例中參數的摘要:

    • 元件 (物件陣列,選用) – 包含ComponentConfiguration物件陣列。容器配方的元件是選用的。您可以使用 BUILD 元件自訂輸出映像,以及 Dockerfile 範本 (例如 RUNCOPY陳述式) 或兩者的指示。TEST 元件會驗證映像,但不要修改。

      注意

      Image Builder 會依照您在配方中指定的順序安裝元件。不過,CIS 強化元件一律會最後執行,以確保基準測試會針對您的輸出映像執行。

      • componentARN (字串,必要) – 元件 ARN。

        提示

        若要使用範例建立您自己的容器配方,請將範例 ARNs 取代為您用於配方之元件的 ARNs。這些包括每個 的 AWS 區域、名稱和版本編號。

      • 參數 (物件陣列) – 包含ComponentParameter物件陣列。如果需要輸入參數,但元件中沒有定義的預設值,您必須提供值。如果缺少任何必要的參數且未定義預設值,Image Builder 將不會建立配方版本。

        重要

        元件參數是純文字值,並會登入 AWS CloudTrail。建議您使用 AWS Secrets Manager 或 AWS Systems Manager 參數存放區來存放秘密。如需 Secrets Manager 的詳細資訊,請參閱什麼是 Secrets Manager? AWS Secrets Manager 《 使用者指南》中的 。如需 AWS Systems Manager 參數存放區的詳細資訊,請參閱AWS Systems Manager 《 使用者指南》中的AWS Systems Manager 參數存放區

        • name (字串,必要) – 要設定的元件參數名稱。

        • value (字串陣列,必要) – 包含字串陣列,以設定具名元件參數的值。如果為元件定義了預設值,且未提供其他值, AWS TOE 會使用預設值。

    • containerType (字串,必要) – 要建立的容器類型。有效值包括 DOCKER

    • dockerfileTemplateData (字串) – 用於建置映像的內嵌 Dockerfile 範本。內嵌資料限制為 16,000 個字元。您必須指定 dockerfileTemplateDatadockerfileTemplateUri,但不能同時指定兩者。

      您的 Dockerfile 範本可以包含內容變數 (Image Builder 在執行時間以組建資訊取代的預留位置)。至少包含 parentImage變數。如果您的配方包含元件,也請包含 environments變數和 components變數。

      parentImage (必要)

      在建置時,此變數會解析為配方的基本映像。

      範例:

      FROM {{{ imagebuilder:parentImage }}}
      環境 (如果指定元件則為必要)

      在建置時,此變數會解析為在建置內容中暫存元件的 Dockerfile 指令。這些指令會將元件指令碼複製到映像中,並設定這些指令碼使用的環境變數。它會準備環境,但不會執行您指定的元件。將此變數放在components變數之前。

      範例:

      {{{ imagebuilder:environments }}}
      元件 (選用)

      在建置時,此變數會解析為命令,該命令會針對容器配方包含的元件執行建置和測試元件指令碼,然後從映像中移除這些指令碼。這是執行元件的變數。將它放在 environments 變數之後。

      範例:

      {{{ imagebuilder:components }}}

      若要改為將範本存放在 Amazon S3 中,請使用 dockerfileTemplateUri 參數搭配有效的 Amazon S3 URI (例如 s3://my-bucket/templates/Dockerfile)。

    • name (字串,必要) – 容器配方的名稱。

    • description (字串) – 容器配方的描述。

    • parentImage (字串,必要) – 在Docker容器配方中使用的容器映像,做為自訂映像的基準。

      • 託管於 的公有映像 DockerHub

      • Amazon ECR 中的現有容器映像

      • Amazon 受管容器映像

    • platformOverride (字串) – 當您使用自訂基礎映像時,指定作業系統平台。建議您在使用 Docker Hub或 Amazon ECR 映像時設定此值。如果您省略它,Image Builder 會嘗試從容器資訊清單偵測平台,這可能不一定可用。您無法指定父映像是映像建置器映像 ARN platformOverride的時間。有效值為 LinuxWindows。容器配方不支援 macOS 平台。

    • semanticVersion (字串,必要) – 以下列格式指定的容器配方語意版本,每個位置都有數值來表示特定版本:<major>.<minor>.<patch>。例如,即改為 1.0.0。若要進一步了解 Image Builder 資源的語意版本控制,請參閱 Image Builder 中的語意版本控制

    • tags (字串映射) – 連接至容器配方的標籤。

    • instanceConfiguration (物件) – 一組選項,可用來設定執行個體以建置和測試容器映像。

      • image (字串) – 容器建置和測試執行個體的基礎映像。這可以包含 AMI ID,也可以指定 AWS Systems Manager (SSM) 參數存放區參數,字首為 ssm:,後面接著參數名稱或 ARN。如果您使用 SSM 參數,參數值必須包含 AMI ID。如果您未指定基礎映像,映像建置器會使用適當的 Amazon ECS 最佳化 AMI 做為基礎映像。

      • blockDeviceMappings (物件陣列) – 定義要連接的區塊型設備,以便從 image 參數中指定的映像建置器 AMI 建置執行個體。

        • deviceName (字串) – 這些映射適用的裝置。

        • ebs (物件) – 用於管理此映射的 Amazon EBS 特定組態。

          • deleteOnTermination (布林值) – 用於設定關聯裝置終止時的刪除。

          • encrypted (布林值) – 用於設定裝置加密。

          • volumeSize (整數) – 用於覆寫裝置的磁碟區大小。

          • volumeType (字串) – 用於覆寫裝置的磁碟區類型。

    • targetRepository (物件,必要) – 如果您的管道的分佈組態中沒有為管道執行的區域 (區域 1) 指定其他儲存庫,則容器映像的目的地儲存庫。

      • repositoryName (字串,必要) – 儲存輸出容器映像的容器儲存庫名稱。此名稱以儲存庫位置為字首。

      • 服務 (字串、必要) – 指定儲存輸出映像的儲存庫服務。有效值為 ECR。目標儲存庫必須已存在。

    • workingDirectory (字串) – 用於建置和測試工作流程的工作目錄。

    下列範例顯示完整的容器配方輸入檔案,定義具有建置元件的 Linux Docker容器。將其儲存為 create-container-recipe.json,並在 create-container-recipe命令中使用它。

    { "components": [ { "componentArn": "arn:aws:imagebuilder:us-west-2:111122223333:component/helloworldal2/x.x.x" } ], "containerType": "DOCKER", "description": "My Linux Docker container image", "dockerfileTemplateData": "FROM {{{ imagebuilder:parentImage }}}\n{{{ imagebuilder:environments }}}\n{{{ imagebuilder:components }}}", "name": "amazonlinux-container-recipe", "parentImage": "amazonlinux:latest", "platformOverride": "Linux", "semanticVersion": "1.0.2", "tags": { "sometag" : "Tag detail" }, "instanceConfiguration": { "image": "ami-1234567890abcdef1", "blockDeviceMappings": [ { "deviceName": "/dev/xvda", "ebs": { "deleteOnTermination": true, "encrypted": false, "volumeSize": 8, "volumeType": "gp2" } } ] }, "targetRepository": { "repositoryName": "myrepo", "service": "ECR" }, "workingDirectory": "/tmp" }
  2. 建立配方

    使用下列命令來建立配方。在 --cli-input-json 參數中提供您在上一個步驟中建立的 JSON 檔案名稱:

    aws imagebuilder create-container-recipe --cli-input-json file://create-container-recipe.json
    注意
    • 您必須在 JSON 檔案路徑的開頭包括 file:// 標記。

    • JSON 檔案的路徑應遵循執行命令之基礎作業系統的適當慣例。例如,Windows 使用反斜線 (\) 來參考目錄路徑,而 Linux 和 macOS 則使用正斜線 (/)。

    下列範例輸出顯示新建立容器配方的 ARN,以及請求的請求 ID 和用戶端字符。

    { "requestId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111", "clientToken": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222", "containerRecipeArn": "arn:aws:imagebuilder:us-west-2:123456789012:container-recipe/my-container-recipe/1.0.2" }

容器配方限制條件

在建立容器配方之前,請檢閱下列限制條件:

  • 您必須指定已存在的目標 Amazon ECR 儲存庫。

  • AWS Marketplace 容器配方不支援 元件。

  • 元件是選用的。您可以使用 BUILD 元件自訂輸出映像,以及 Dockerfile 範本 (例如 RUNCOPY陳述式) 或兩者的指示。TEST 元件會驗證映像,但不要修改。

  • 容器配方不支援 macOS 平台。

  • 對於 Dockerfile 範本,請提供內嵌資料 (最多 16,000 個字元) 或 Amazon S3 URI。您不能同時指定兩者。

  • 累積配方大小不能超過 25 KB。如果您收到大小錯誤,請減少元件參數的數量或縮短參數值。此限制與 Dockerfile 範本大小限制不同。

  • 當您將 platformOverride設定為 時Windows,您還必須指定 imageOsVersionOverride。這適用於任何非映像建置器父映像,例如 Amazon ECR 映像或Docker Hub映像。

常見錯誤和故障診斷

下表列出您在建立容器配方時可能遇到的常見錯誤,以及如何解決這些錯誤。

錯誤 原因 Resolution
「容器配方不得包含市場元件」 容器配方中的 AWS Marketplace 元件。 僅使用非AWS Marketplace 元件。
「容器配方目前不支援 macOS 平台」 platformOverride 設定為 macOS。 使用 LinuxWindows
「您必須指定 dockerfileTemplateData 或 dockerfileTemplateUri」 您同時指定 或兩者都指定。 提供剛好一個。
「無效的 S3 URI」 中的格式不正確的 Amazon S3 路徑dockerfileTemplateUri 使用 s3://bucket/key 格式。
「使用映像建置器映像做為父映像時,您無法指定平台覆寫」 platformOverride 使用映像建置器映像 ARN。 移除 platformOverride。Image Builder 會從父映像中繼資料偵測平台。
「使用 ECR 儲存庫做為 Windows 平台的父映像時,您必須指定映像 OsVersion 覆寫」 platformOverride 沒有作業系統版本的 Windows。 新增 imageOsVersionOverride 欄位。