适用于 的 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 结合使用
运行该示例可能会导致您的 AWS 账户产生相关费用。这些费用包括可能针对 AWS CodeBuild 和 AWS 资源以及与 Amazon S3、AWS KMS、CloudWatch
Logs 和 Amazon ECR. 相关的操作收取的费用。有关更多信息,请参阅 CodeBuild 定价
运行示例
要运行此示例,请执行以下操作:
-
如果 Amazon ECR 中已存在要使用的映像存储库,请跳至第 3 步。否则,如果您使用 IAM 用户而不是 AWS 根账户或管理员IAM用户来处理 Amazon ECR,请添加此语句(介于
### BEGIN ADDING STATEMENT HERE ###
和### END ADDING STATEMENT HERE ###
) 发送到用户 (或与用户关联的IAM组)。建议不要使用 AWS 根账户。此语句允许创建用于存储 Docker 映像的 Amazon ECR 存储库。为了简洁起见,也为了帮您查找添加语句的位置,此处使用了省略号 (...
请勿删除任何语句,也不要将这些省略号键入策略中。有关更多信息,请参阅 AWS 管理控制台 用户指南 IAM 中的使用内联策略。{ "Statement": [
### BEGIN ADDING STATEMENT HERE ###
{ "Action": [ "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" },### END ADDING STATEMENT HERE ###
... ], "Version": "2012-10-17" }注意 修改该策略的 IAM 实体必须拥有在 IAM 中修改策略的权限。
-
在 中创建映像存储库。Amazon ECR. 请务必在从中创建构建环境并运行构建的同一 AWS 区域中创建存储库。有关更多信息,请参阅 https://docs.amazonaws.cn/AmazonECR/latest/userguide/repository-create.html 用户指南中的Amazon ECR创建存储库。该存储库的名称必须与您将在此过程的稍后部分指定的存储库名称相匹配,并以
IMAGE_REPO_NAME
环境变量的形式表示。 -
添加此语句 (介于
### 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 中修改策略的权限。
-
按照本主题的“目录结构”和“文件”部分中的说明创建文件,然后将其上传到 S3 输入存储桶或 AWS CodeCommit、 GitHub或 Bitbucket 存储库。
重要 请不要上传
,而只上传(root directory name)
. 中的文件。(root directory name)
如果您使用的是 S3 输入存储桶,请务必创建一个包含文件的 ZIP 文件,然后将其上传到输入存储桶。请不要将
添加到 ZIP 文件中,而只添加(root directory name)
. 中的文件。(root directory name)
-
请按照 直接运行 CodeBuild 中的步骤创建构建项目、运行构建并查看构建信息。
如果您使用控制台创建项目:
-
对于 Operating system (操作系统),选择 Ubuntu.
-
对于 Runtime (运行时),选择 Standard (标准).
-
对于 Image (映像),选择 aws/codebuild/standard:4.0.
-
由于您使用此构建来构建 Docker 权限,因此请选择 Privileged (特权).
注意 By default, Docker containers do not allow access to any devices. Privileged mode grants a build project's Docker container access to all devices. For more information, see Runtime Privilege and Linux Capabilities
on the Docker Docs website. -
添加以下环境变量:
-
值为 的 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: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
" } -
-
确认 CodeBuild 已成功将 Docker 映像推送到存储库:
-
通过以下网址打开 Amazon ECR 控制台:https://console.amazonaws.cn/ecr/
。 -
选择存储库名称。映像应在 Image tag (映像标签) 列中列出。
-
目录结构
此示例假定有这样一个目录结构。
(root directory name)
├── buildspec.yml
└── Dockerfile
Files
此示例将使用这些文件。
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 覆盖自定义 Docker 映像ENTRYPOINT
的 。
调整示例以将映像推送到 Docker Hub
要将 Docker 映像推送到 Docker Hub 而非 Amazon ECR,请编辑此示例的代码。
如果您使用的是 17.06 版本之前的 Docker 版本,请删除 --no-include-email
选项。
-
替换 Amazon ECR 文件中的这些特定于
buildspec.yml
的代码行:... 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 ...
-
将编辑后的代码上传到 S3 输入存储桶或者上传到 AWS CodeCommit、 GitHub或 Bitbucket 存储库。
重要 请不要上传
,而只上传(root directory name)
. 中的文件。(root directory name)
如果您使用的是 S3 输入存储桶,请务必创建一个包含文件的 ZIP 文件,然后将其上传到输入存储桶。请不要将
添加到 ZIP 文件中,而只添加(root directory name)
. 中的文件。(root directory name)
-
将
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" } ] ... -
请按照 直接运行 CodeBuild 中的步骤创建构建环境、运行构建并查看相关构建信息。
-
确认 AWS CodeBuild 已成功将 Docker 映像推送到存储库。登录 Docker Hub,转到存储库,然后选择 Tags (标签) 选项卡。
latest
标签应包含最新的 Last Updated 值。
相关资源
-
有关 AWS CodeBuild 入门的信息,请参阅通过控制台开始使用 AWS CodeBuild。
-
有关解决 CodeBuild 中的问题的信息,请参阅 故障排除AWS CodeBuild。
-
有关 CodeBuild 中的配额的信息,请参阅AWS CodeBuild 的配额。