碼頭工人樣品 CodeBuild - AWS CodeBuild

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

碼頭工人樣品 CodeBuild

自訂影像範例中的泊塢視窗 CodeBuild

此示例通過使用和自定義 Docker 構建映像(docker:dind在 Docker Hub 中)構建 AWS CodeBuild 和運行 Docker 映像。

要了解如何通過使用 Docker 支持提供的構建映像來 CodeBuild 構建 Docker 映像,請參閱我們的. 將 Docker 映像發佈到 Amazon 映ECR像儲存庫範例

重要

執行此範例可能會導致您的 AWS 帳戶收費。其中包括 CodeBuild 與 Amazon S3 相關的 AWS 資源和動作以及 CloudWatch 日誌可能的費用。 AWS KMS如需詳細資訊,請參閱CodeBuild 定價Amazon S3 定AWS Key Management Service價、定價Amazon CloudWatch 定價

執行範例

如何執行此範例
  1. 按照本主題的「目錄結構」和「檔案」一節中所述建立檔案,然後將它們上傳到 S3 輸入儲存貯體 AWS CodeCommit、 GitHub、或 Bitbucket 存放庫。

    重要

    請勿上傳 (root directory name),僅上傳 (root directory name) 內的檔案即可。

    如果您使用 S3 輸入儲存貯體,請務必建立包含ZIP檔案的檔案,然後將其上傳到輸入儲存貯體。不要添加(root directory name)到文ZIP件中,只添加其中的文件(root directory name)

  2. 建立組建專案、執行組建,以及檢視相關的組建資訊。

    如果您使用 AWS CLI 建立組建專案,則create-project指令的 JSON-format 輸入可能會與此類似。(以您自己的值取代預留位置。)

    { "name": "sample-docker-custom-image-project", "source": { "type": "S3", "location": "codebuild-region-ID-account-ID-input-bucket/DockerCustomImageSample.zip" }, "artifacts": { "type": "NO_ARTIFACTS" }, "environment": { "type": "LINUX_CONTAINER", "image": "docker:dind", "computeType": "BUILD_GENERAL1_SMALL", "privilegedMode": false }, "serviceRole": "arn:aws:iam::account-ID:role/role-name", "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID" }
    注意

    默認情況下,Docker 守護進程為非VPC構建啟用。如果您想使用 Docker 容器進行VPC構建,請參閱 Docker 文檔網站上的運行時特權和 Linux 功能並啟用特權模式。此外,Windows 不支援特殊權限模式。

  3. 若要查看組建結果,請在組建的日誌中尋找 Hello, World! 字串。如需詳細資訊,請參閱 檢視建置的詳細資訊

目錄結構

此範例假設此目錄結構。

(root directory name) ├── buildspec.yml └── Dockerfile

檔案

此範例中使用之作業系統的基本映像是 Ubuntu。此範例使用這些檔案。

buildspec.yml (在 (root directory name) 中)

version: 0.2 phases: pre_build: commands: - docker build -t helloworld . build: commands: - docker images - docker run helloworld echo "Hello, World!"

Dockerfile (在 (root directory name) 中)

FROM maven:3.3.9-jdk-8 RUN echo "Hello World"

相關資源

將 Docker 映像發佈到 Amazon 彈性容器登錄映像儲存庫範例, CodeBuild

此範例會產生 Docker 映像的建置輸出,然後將 Docker 映像推送至 Amazon 彈性容器登錄 (AmazonECR) 映像儲存庫。您可以調整此範例將 Docker 影像推送至 Docker Hub。如需詳細資訊,請參閱 調整範例將映像推送至 Docker Hub

若要了解如何使用自訂 Docker 建置映像 (Docker Hub 中的 docker:dind) 來建置 Docker 映像,請參閱我們的自訂映像中的 Docker 範例

已參考 golang:1.12 來測試過此範例。

此範例使用新的多階段 Docker 組建功能,此功能會產生 Docker 影像作為組建輸出。然後,它將 Docker 映像推送到 Amazon ECR 映像存儲庫。多階段 Docker 影像組建有助於縮小最終 Docker 影像。如需詳細資訊,請參閱對 Docker 使用多階段組建

重要

執行此範例可能會導致您的 AWS 帳戶收費。其中包括與 Amazon S3、 AWS KMS CloudWatch 日誌和 Amazon 相關的 AWS 資源和動作的可能收費和費用ECR。 AWS CodeBuild 如需詳細資訊,請參閱CodeBuild 定價Amazon S3 定AWS Key Management Service價、定價Amazon CloudWatch 定價Amazon 彈性容器登錄定價

執行範例

如何執行此範例
  1. 如果您想要使用的 Amazon ECR 中已有映像儲存庫,請跳至步驟 3。否則,如果您使用的是用戶而不是 AWS root 帳戶或管理員用戶來使用 AmazonECR,請添加此聲明(介於 ### BEGIN ADDING STATEMENT HERE ### 以及 ### END ADDING STATEMENT HERE ###) 給使用者 (或與使用者關聯的IAM群組)。不建議使用 AWS 根帳戶。此聲明允許創建用於存儲 Docker 映像的 Amazon 存儲ECR庫。省略符號 (...) 用於簡化和協助您找到新增陳述式的位置。請不要移除任何陳述式,也不要在政策中輸入這些省略符號。如需詳細資訊,請參閱使用者指南 AWS Management Console中的使用內嵌政策

    { "Statement": [ ### BEGIN ADDING STATEMENT HERE ### { "Action": [ "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" }, ### END ADDING STATEMENT HERE ### ... ], "Version": "2012-10-17" }
    注意

    修改此原則的IAM實體必須具有中的權限IAM才能修改原則。

  2. 在 Amazon 中創建一個映像存儲庫ECR。請務必在建立組建環境並執行組建的相同 AWS 區域中建立存放庫。如需詳細資訊,請參閱 Amazon ECR 使用者指南中的建立儲存庫。此儲存庫的名稱必須符合您稍後於此程序中指定的儲存庫名稱 (以 IMAGE_REPO_NAME 環境變數表示)。確保 Amazon ECR 儲存庫政策授與您的 CodeBuild 服務IAM角色的映像推送存取權。

  3. 添加此語句(之間 ### BEGIN ADDING STATEMENT HERE ### 以及 ### END ADDING STATEMENT HERE ###) 至您附加至 AWS CodeBuild 服務角色的原則。此聲明允許 CodeBuild Docker 圖像上傳到 Amazon ECR 存儲庫。省略符號 (...) 用於簡化和協助您找到新增陳述式的位置。請不要移除任何陳述式,也不要在政策中輸入這些省略符號。

    { "Statement": [ ### BEGIN ADDING STATEMENT HERE ### { "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:CompleteLayerUpload", "ecr:GetAuthorizationToken", "ecr:InitiateLayerUpload", "ecr:PutImage", "ecr:UploadLayerPart" ], "Resource": "*", "Effect": "Allow" }, ### END ADDING STATEMENT HERE ### ... ], "Version": "2012-10-17" }
    注意

    修改此原則的IAM實體必須具有中的權限IAM才能修改原則。

  4. 按照本主題的「目錄結構」和「檔案」一節中所述建立檔案,然後將它們上傳到 S3 輸入儲存貯體 AWS CodeCommit、 GitHub、或 Bitbucket 存放庫。若要取得更多資訊,請參閱AWS CodePipeline 使用指南中的「影像定義檔案參考」。

    重要

    請勿上傳 (root directory name),僅上傳 (root directory name) 內的檔案即可。

    如果您使用 S3 輸入儲存貯體,請務必建立包含ZIP檔案的檔案,然後將其上傳到輸入儲存貯體。不要添加(root directory name)到文ZIP件中,只添加其中的文件(root directory name)

  5. 建立組建專案、執行組建,以及檢視組建資訊。

    如果您使用主控台來建立您的專案:

    1. 針對 Operating system (作業系統),選擇 Ubuntu

    2. 針對 Runtime (執行時間),選擇 Standard (標準)

    3. 針對映像,選擇 aws/codebuild/standard:5.0

    4. 新增下列環境變數:

      • AWS_ DEFAULT _ REGION 具有的值 region-ID

      • AWSACCOUNT_ 具有值的 _ID account-ID

      • IMAGE_ TAG 具有最新值

      • IMAGE_ REPO _ NAME 具有的值 Amazon-ECR-repo-name

    如果您使用 AWS CLI 建立組建專案,則create-project指令的 JSON-format 輸入可能會與此類似。(以您自己的值取代預留位置。)

    { "name": "sample-docker-project", "source": { "type": "S3", "location": "codebuild-region-ID-account-ID-input-bucket/DockerSample.zip" }, "artifacts": { "type": "NO_ARTIFACTS" }, "environment": { "type": "LINUX_CONTAINER", "image": "aws/codebuild/standard:5.0", "computeType": "BUILD_GENERAL1_SMALL", "environmentVariables": [ { "name": "AWS_DEFAULT_REGION", "value": "region-ID" }, { "name": "AWS_ACCOUNT_ID", "value": "account-ID" }, { "name": "IMAGE_REPO_NAME", "value": "Amazon-ECR-repo-name" }, { "name": "IMAGE_TAG", "value": "latest" } ], }, "serviceRole": "arn:aws:iam::account-ID:role/role-name", "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID" }
  6. 確認 CodeBuild 已成功將 Docker 映像檔推送至儲存庫:

    1. 在打開 Amazon ECR 控制台https://console.aws.amazon.com/ecr/

    2. 選擇儲存庫名稱。此映像應列在 Image tag (映像標籤) 欄中。

目錄結構

此範例假設此目錄結構。

(root directory name) ├── buildspec.yml └── Dockerfile

檔案

此範例使用這些檔案。

buildspec.yml (在 (root directory name) 中)

version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

Dockerfile (在 (root directory name) 中)

FROM golang:1.12-alpine AS build #Install git RUN apk add --no-cache git #Get the hello world package from a GitHub repository RUN go get github.com/golang/example/hello WORKDIR /go/src/github.com/golang/example/hello # Build the project and send the output to /bin/HelloWorld RUN go build -o /bin/HelloWorld FROM golang:1.12-alpine #Copy the build's output binary from the previous build container COPY --from=build /bin/HelloWorld /bin/HelloWorld ENTRYPOINT ["/bin/HelloWorld"]
注意

CodeBuild 會覆寫自ENTRYPOINT訂泊塢視窗影像的。

調整範例將映像推送至 Docker Hub

要將 Docker 映像推送到 Docker Hub 而不是 AmazonECR,請編輯此示例的代碼。

注意

如果您使用的是 17.06 之前的 Docker 版本,請移除 --no-include-email 選項。

  1. 替換buildspec.yml文件中的這些 Amazon ECR 特定的代碼行:

    ... pre_build: commands: - echo Logging in to Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG ...

    換成 Docker Hub 專用的這幾行程式碼:

    ... pre_build: commands: - echo Logging in to Docker Hub... # Type the command to log in to your Docker Hub account here. build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - docker push $IMAGE_REPO_NAME:$IMAGE_TAG ...
  2. 將編輯過的程式碼上傳至 S3 輸入儲存貯體或 AWS CodeCommit GitHub、或 Bitbucket 儲存庫。

    重要

    請勿上傳 (root directory name),僅上傳 (root directory name) 內的檔案即可。

    如果您使用 S3 輸入儲存貯體,請務必建立包含ZIP檔案的檔案,然後將其上傳到輸入儲存貯體。不要添加(root directory name)到文ZIP件中,只添加其中的文件(root directory name)

  3. 將這些代碼從 JSON-formatted 輸入替換為命create-project令:

    ... "environmentVariables": [ { "name": "AWS_DEFAULT_REGION", "value": "region-ID" }, { "name": "AWS_ACCOUNT_ID", "value": "account-ID" }, { "name": "IMAGE_REPO_NAME", "value": "Amazon-ECR-repo-name" }, { "name": "IMAGE_TAG", "value": "latest" } ] ...

    換成這幾行程式碼:

    ... "environmentVariables": [ { "name": "IMAGE_REPO_NAME", "value": "your-Docker-Hub-repo-name" }, { "name": "IMAGE_TAG", "value": "latest" } ] ...
  4. 建立組建環境、執行組建,以及檢視相關的組建資訊。

  5. 確認 AWS CodeBuild 已成功將 Docker 映像檔推送至儲存庫。登入 Docker Hub,移至儲存庫,然後選擇 Tags (標籤) 索引標籤。latest 標籤應該包含最近的 Last Updated (上次更新) 值。

相關資源

帶有 AWS Secrets Manager 示例的私人註冊表 CodeBuild

此範例說明如何使用儲存在私人登錄中的 Docker 映像檔做為 AWS CodeBuild 執行階段環境。私有登錄檔的登入資料會存放在 AWS Secrets Manager。任何私人註冊表都可以使用 CodeBuild. 這個範例使用 Docker Hub。

注意

密碼對動作可見,寫入檔案時不會遮罩。

私有登錄檔範例需求

若要搭配使用私人登錄 AWS CodeBuild,您必須具備下列項目:

  • 儲存您的 Docker Hub 認證的秘 Secrets Manager 碼。這些登入資料會用來存取您的私有儲存庫。

    注意

    您將需要為您建立的秘密付費。

  • 私有儲存庫或帳戶。

  • 授與 Secrets Manager 碼存取權的 CodeBuild 服務角色IAM原則。

請依照下列步驟建立這些資源,然後使用儲存在私人登錄中的 Docker 映像檔建立 CodeBuild 建置專案。

使用私人登錄建立 CodeBuild 專案

  1. 如需如何建立免費私有儲存庫的詳細資訊,請參閱儲存庫 Docker Hub。您也可以在終端機上執行以下命令來提取映像、取得其 ID,並將其推送到新的儲存庫。

    docker pull amazonlinux docker images amazonlinux --format {{.ID}} docker tag image-id your-username/repository-name:tag docker login docker push your-username/repository-name
  2. 請遵循《AWS Secrets Manager 使用指南》中的「建立 AWS Secrets Manager 密碼」中的步驟。

    1. 在步驟 3 的 [選擇密碼類型] 中,選擇 [其他密碼類型]。

    2. 鍵/值對中,為您的 Docker Hub 用戶名創建一個鍵值對,為您的 Docker Hub 密碼創建一個鍵值對。

    3. 繼續執行建立 AWS Secrets Manager 密碼中的步驟。

    4. 在步驟 5 中,在 [設定自動輪換] 頁面上,將其關閉,因為金鑰對應於您的 Docker Hub 認證。

    5. 完成依照建立 AWS Secrets Manager 密碼中的步驟操作。

    如需詳細資訊,請參閱什麼是 AWS Secrets Manager?

  3. 當您在控制台中創建 AWS CodeBuild 項目時,為您 CodeBuild 附加所需的權限。如果您使用的 AWS KMS 金鑰不是DefaultEncryptionKey,則必須將其新增至服務角色。如需詳細資訊,請參閱《IAM使用指南》中的〈修改角色 (主控台)

    您的服務角色必須至少具有權限,才能與 Secrets Manager 搭配使secretsmanager:GetSecretValue用。

    服務角色組態。
  4. 若要使用主控台搭配私有登錄檔中所儲存的環境來建立專案,請在建立專案的同時執行下列動作。如需相關資訊,請參閱建立組建專案 (主控台)

    注意

    如果您的私人註冊表位於您的VPC,則必須具有公共互聯網訪問權限。 CodeBuild 無法從中的私人 IP 地址提取圖像VPC。

    1. 環境影像中,選擇 [自訂影像]。

    2. 針對 Environment type (環境類型),選擇 LinuxWindows

    3. 對於映像登錄,請選擇其他登錄

    4. 外部登錄中URL,輸入映像位置,並在登錄憑證中輸入-選擇性輸入 Secrets Manager 認證的ARN或名稱。

      注意

      如果您目前的區域中不存在您的認證,則必須使用ARN. 如果登入資料存在於不同的區域,則無法使用登入資料名稱。