「將 Docker 映像發佈到 Amazon 圖像存儲庫」ECR 示例 CodeBuild - AWS CodeBuild

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

「將 Docker 映像發佈到 Amazon 圖像存儲庫」ECR 示例 CodeBuild

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

若要了解如何使用自訂 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 彈性容器登錄定價

運行「將 Docker 映像發佈到 AmazonECR」示例

使用下列程序執行將 Docker 映像發佈到 Amazon ECR 的範例。如需有關此範例的更多資訊,請參閱。「將 Docker 映像發佈到 Amazon 圖像存儲庫」ECR 示例 CodeBuild

如何執行此範例
  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

      • AWS_ACCOUNT_ID值為 account-ID

      • IMAGE_ TAG 具有最新值

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

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

    { "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訂泊塢視窗影像的。