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

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

的 Docker 示例 CodeBuild

自定义镜像示例中的 Docker CodeBuild

此示例通过使用和自定义 Docker 构建映像(在 Docker Hub docker:dind 中)来构建 Amazon CodeBuild 和运行 Docker 镜像。

要了解如何改用由 Docker 支持的构建镜像来 CodeBuild 构建 Docker 镜像,请参阅我们的。将 Docker 镜像发布到亚马逊 ECR 镜像存储库示例

重要

运行此示例可能会导致您的 Amazon 账户被扣款。其中包括与 Amazon S3 和 CloudWatch 日志相关的 Amazon 资源和操作可能产生的费用。 CodeBuild Amazon KMS有关更多信息,请参阅CodeBuild 定价Amazon S3 定价Amazon Key Management Service 定价亚马逊 CloudWatch定价

运行示例

要运行此示例,请执行以下操作:
  1. 按照本主题的 “目录结构” 和 “文件” 部分所述创建文件,然后将其上传到 S3 输入存储桶或 Amazon CodeCommit GitHub、或 Bitbucket 存储库。

    重要

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

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

  2. 创建构建项目,运行构建,并查看相关的构建信息。

    如果您使用创建构建项目,则create-project命令的 JSON 格式输入可能与此类似。 Amazon CLI (请将占位符替换为您自己的值。)

    { "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" }
    注意

    默认情况下,非 VPC 版本启用 Docker 守护程序。如果您想使用 Docker 容器进行 VPC 构建,请参阅 Docker Docs 网站上的运行时权限和 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 镜像发布到亚马逊弹性容器注册表镜像存储库示例 CodeBuild

该示例会生成一个 Docker 映像作为构建输出,然后将该 Docker 映像推送到 Amazon 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 S3、 Amazon KMS、 CloudWatch 日志和 Amazon ECR 相关的 Amazon 资源和操作可能产生的费用。 Amazon CodeBuild 有关更多信息,请参阅CodeBuild 定价Amazon S3 定价Amazon Key Management Service 定价亚马逊 CloudWatch 定价亚马逊弹性容器注册表定价

运行示例

要运行此示例,请执行以下操作:
  1. 如果 Amazon ECR 中已存在要使用的映像存储库,请跳至第 3 步。否则,如果您使用的是用户而不是 Amazon 根账户或管理员用户来使用 Amazon ECR,请向用户(或用户关联的 IAM 群组)添加以下语句(在 ### 开始在此处添加句 ### 和 ### 在此处结束添加语句 ### 之间)。不建议使用 Amazon 根账户。此语句允许创建用于存储 Docker 镜像的 Amazon ECR 存储库。为了简洁起见,也为了帮您查找添加语句的位置,此处使用了省略号 (...)。请勿删除任何语句,也不要将这些省略号键入策略中。有关更多信息,请参阅《用户指南》中的通过 Amazon Web Services 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 中创建映像存储库。请务必在创建构建环境和运行构建版本的同一 Amazon 区域中创建存储库。有关更多信息,请参阅《Amazon ECR 用户指南》中的创建存储库。该存储库的名称必须与您将在此过程的稍后部分指定的存储库名称相匹配,并以 IMAGE_REPO_NAME 环境变量的形式表示。确保 Amazon ECR 存储库策略为您的 CodeBuild 服务 IAM 角色授予图片推送访问权限。

  3. 将此语句(在 ### 开始在此处添加语句 ### 和 ### 在此处结束添加语句 ### 之间)添加到您附加到服务角色的策略中。 Amazon CodeBuild 此声明允许将 Docker 镜像上传 CodeBuild 到亚马逊 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 存储库。有关更多信息,请参阅《Amazon CodePipeline 用户指南》中的映像定义文件参考

    重要

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

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

  5. 创建构建项目,运行构建,并查看构建信息。

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

    1. 对于操作系统,选择 Ubuntu

    2. 对于运行时,选择标准

    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

    如果您使用创建构建项目,则create-project命令的 JSON 格式输入可能与此类似。 Amazon CLI (请将占位符替换为您自己的值。)

    { "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. 选择存储库名称。映像应在映像标签列中列出。

目录结构

此示例采用以下目录结构。

(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 会替换自定义 Docker 镜像的。ENTRYPOINT

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

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

注意

如果您使用的是 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 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. 创建构建环境,运行构建,并查看相关的构建信息。

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

相关资源

带有 Amazon Secrets Manager 示例的私有注册表 CodeBuild

此示例向您展示如何使用存储在私有注册表中的 Docker 镜像作为 Amazon CodeBuild 运行时环境。私有注册表的凭证存储在 Amazon Secrets Manager中。任何私有注册表均可使用 CodeBuild。此示例使用 Docker Hub。

注意

密钥对操作可见,在写入文件时不会被屏蔽。

私有注册表示例要求

要将私有注册表与一起使用 Amazon CodeBuild,您必须具备以下条件:

  • 一个 Secrets Manager 密钥,用于储存您的 Docker Hub 凭证。该凭证可用于访问您的私有存储库。

    注意

    您将需要为您创建的密钥付费。

  • 一个私有存储库或账户。

  • 一项 CodeBuild 服务角色 IAM 策略,用于授予对您的 Secrets Manager 密钥的访问权限。

按照以下步骤创建这些资源,然后使用存储在私有注册表中的 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. 按照《Amazon Secrets Manager 用户指南》创建 Amazon Secrets Manager 密钥中的步骤进行操作。

    1. 在步骤 3 中,在选择密钥类型,选择其他密钥类型

    2. 密钥/值对中,为您的 Docker Hub 用户名创建一个键值对,为您的 Docker Hub 密码创建一个键值对。

    3. 继续按照创建 Amazon Secrets Manager 密钥中的步骤进行操作。

    4. 在步骤 5 中,在配置自动轮换页面上,将其关闭,因为密钥对应于您的 Docker Hub 凭证。

    5. 按照创建 Amazon Secrets Manager 密钥中的步骤完成操作。

    有关更多信息,请参阅什么是 Amazon Secrets Manager?

  3. 在控制台中创建 Amazon CodeBuild 项目时,会 CodeBuild 附上所需的权限。如果您使用的 Amazon KMS 密钥除外DefaultEncryptionKey,则必须将其添加到服务角色中。有关更多信息,请参阅《IAM 用户指南》中的修改角色(控制台)

    要使您的服务角色与 Secrets Manager 配合使用,它必须至少具有 secretsmanager:GetSecretValue 权限。

  4. 要使用控制台创建一个具有在私有注册表中存储的环境的项目,请在创建项目时执行以下操作。有关信息,请参阅 创建构建项目(控制台)

    注意

    如果您的私有注册表位于您的 VPC 中,则它必须具有公共互联网访问权限。 CodeBuild 无法从 VPC 中的私有 IP 地址提取镜像。

    1. 对于环境映像,选择自定义映像

    2. 对于环境类型,选择 LinuxWindows

    3. 对于映像注册表,请选择其他注册表

    4. 外部注册表 URL 中,输入映像位置,在注册表凭证 - 可选中输入您的 Secrets Manager 凭证的 ARN 或名称。

      注意

      如果您的凭证在当前区域中不存在,则必须使用 ARN。如果凭证存在于其他区域中,则无法使用凭证名称。