Docker 示例 CodeBuild - Amazon CodeBuild
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Docker 示例 CodeBuild

此示例生成一个 Docker 镜像作为构建输出,然后将 Docker 镜像推送到亚马逊Elastic Container Registry (Amazon ECR) 镜像存储库。您可以调整该示例以将 Docker 映像推送到 Docker Hub。有关更多信息,请参阅 调整示例以将映像推送到 Docker Hub

要了解如何使用自定义 Docker 构建映像来构建 Docker 映像(Docker Hub 中的 docker:dind),请参阅我们的自定义映像示例中的 Docker

此示例参考 golang:1.12 进行了测试。

此示例使用新的多阶段 Docker 构建功能,该功能将生成一个 Docker 映像作为构建输出。然后,它将 Docker 镜像推送到 Amazon ECR 镜像存储库。多阶段 Docker 映像构建有助于减小最终 Docker 映像的大小。有关更多信息,请参阅将多阶段构建和 Docker 结合使用

重要

运行该示例可能会导致您的 Amazon 账户产生相关费用。其中包括可能的费用Amazon CodeBuild而且对于Amazon与 Amazon S3 相关的资源和行动Amazon KMS, CloudWatch 日志和亚马逊 ECR。有关更多信息,请参阅 。CodeBuild 定价,Amazon S3,Amazon Key Management Service定价,亚马逊 CloudWatch 定价,以及Amazon Elastic Con.

运行示例

要运行此示例,请执行以下操作:

  1. 如果要使用 Amazon ECR 中已有镜像存储库,请跳到步骤 3。否则,如果您使用的是 IAM 用户而不是Amazon根账户或管理员 IAM 用户要使用 Amazon ECR,请添加此语句(介于### 开始在这里添加语句 ###### 在这里结束添加语句 ###)发送给用户(或与该用户关联的 IAM 群组)。使用Amazon不推荐使用根账户。此语句允许创建用于存储 Docker 镜像的 Amazon ECR 存储库。为了简洁起见,也为了帮您查找添加语句的位置,此处使用了省略号 (...)。请勿删除任何语句,也不要将这些省略号键入策略中。有关更多信息,请参阅 。使用内联策略使用Amazon Web Services Management Console在里面IAM 用户指南.

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

    修改此策略的 IAM 实体必须在 IAM 中拥有修改策略的权限。

  2. 在 Amazon ECR 中创建镜像存储库。请务必在从中创建构建环境并运行构建的同一 Amazon 区域中创建存储库。有关更多信息,请参阅 。创建存储库在里面Amazon ECR 用户指南. 该存储库的名称必须与您将在此过程的稍后部分指定的存储库名称相匹配,并以 IMAGE_REPO_NAME 环境变量的形式表示。

  3. 将此语句(在 ### BEGIN ADDING STATEMENT HERE ###### END ADDING STATEMENT HERE ### 之间)添加到已附加到您的 Amazon CodeBuild 服务角色的策略。此语句允许 CodeBuild 将 Docker 镜像上传到亚马逊 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 输入存储桶或Amazon CodeCommit, GitHub,或 Bitbucket 存储库。

    重要

    请不要上传 (root directory name),而只上传 (root directory name) 中的文件。

    如果您使用的是 S3 输入存储桶,请务必创建一个包含文件的 ZIP 文件,然后将其上传到输入存储桶。请不要将 (root directory name) 添加到 ZIP 文件中,而只添加 (root directory name) 中的文件。

  5. 请按照 运行 CodeBuild 直接地 中的步骤创建构建项目、运行构建并查看构建信息。

    如果您使用控制台创建项目:

    1. 对于 Operating system (操作系统),选择 Ubuntu

    2. 对于 Runtime (运行时),选择 Standard (标准)

    3. 对于 Image (映像),选择 aws/codebuild/standard:4.0

    4. 由于您使用此构建来构建 Docker 权限,因此请选择 Privileged (特权)

      注意

      默认情况下,Docker 容器不允许访问任何设备。特权模式将授予构建项目的 Docker 容器访问所有设备的权限。有关更多信息,请参阅 Docker 文档网站上的运行时权限和 Linux 功能

    5. 添加以下环境变量:

      • AWS_DEFAULT_REGION,值为 region-ID

      • AWS_ACCOUNT_ID,值为 account-ID

      • 具有最新值的 IMAGE_TAG

      • IMAGE_REPO_NAME,值为 Amazon ECR-repo-name

    如果您使用 Amazon 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:4.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" } ], "privilegedMode": true }, "serviceRole": "arn:aws:iam::account-ID:role/role-name", "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID" }
  6. 确认这一点 CodeBuild 成功将 Docker 镜像推送到存储库:

    1. 打开位于 https://console.aws.amazon.com/ecr/ 的 Amazon 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 Amazon --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 overridesENTRYPOINT用于自定义 Docker 镜像。

调整示例以将映像推送到 Docker Hub

要将 Docker 镜像推送到 Docker Hub 而不是 Amazon ECR,请编辑此示例的代码。

注意

如果您使用的是 17.06 版本之前的 Docker 版本,请删除 --no-include-email 选项。

  1. 在以下位置替换这些 Amazon ECR 专用的代码行buildspec.ymlfile:文件

    ... pre_build: commands: - echo Logging in to Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username Amazon --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 输入存储桶或Amazon CodeCommit, GitHub,或 Bitbucket 存储库。

    重要

    请不要上传 (root directory name),而只上传 (root directory name) 中的文件。

    如果您使用的是 S3 输入存储桶,请务必创建一个包含文件的 ZIP 文件,然后将其上传到输入存储桶。请不要将 (root directory name) 添加到 ZIP 文件中,而只添加 (root directory name) 中的文件。

  3. create-project 命令的 JSON 格式输入中的这些代码行替换为:

    ... "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. 请按照 运行 CodeBuild 直接地 中的步骤创建构建环境、运行构建并查看相关构建信息。

  5. 确认 Amazon CodeBuild 已成功将 Docker 映像推送到存储库。登录 Docker Hub,再转至存储库,然后选择 Tags 选项卡。latest 标签应包含最新的 Last Updated 值。

相关资源