在AWS ECS上运行Docker容器将Docker镜像上传到ECR
本文是在AWS ECS上运行Docker容器的3部分教程的第2部分。 ECS代表弹性容器服务。它是可以运行docker容器的托管容器服务。尽管AWS还使用Kubernetes(EKS)提供了容器管理,但它也具有其专有解决方案(ECS)。
我们将使用一个简单的hello world图像。我们将从docker提取镜像并将其推送到我们的容器注册表(ECR)。
设置要求/准备工作
在继续阅读本教程之前,用户/阅读器应确保满足以下要求。其中包括:一个AWS账户。在该账户上创建了一个用户,该用户具有配置账户资源的权限;一个S3存储桶来存储我们的CodeBuild工件;一个CloudWatch日志组或者S3存储桶来存储构建项目日志。
创建AWS ECR(弹性容器注册表)
弹性容器注册表(ECR)是一个AWS托管的容器注册表,用于存储Docker镜像。我们将使用下面的CloudFormation模板创建注册表。
AWSTemplateFormatVersion: "2010-09-09"
Description: 'Template to create an ECR repository'
Parameters:
ECR:
Type: String
Description: "The Name of your ECR registry"
Resources:
ECRRepository1:
Type: "AWS::ECR::Repository"
Properties:
RepositoryName: test-ecr
ImageScanningConfiguration:
scanOnPush: "true"
Tags:
- Key: Name
Value: !Ref ECR
- Key: createdBy
Value: Maureen Barasa
- Key: Project
Value: test-ecs
Outputs:
RegistryName:
Value: !Ref ECR
Description: Name of the ECR Registry
读者/用户应自定义模板以反映其特定要求。要定制的模板的特定方面是:Tags.Repository属性。
要在ECR控制台上手动创建注册表,请执行以下操作:单击创建存储库。创建存储库
然后配置存储库设置。配置存储库设置
完成后,单击创建。现在,我们将创建ECR存储库。
使用AWS CodeBuild将图像上传到AWS ECR
有了图像存储库后,就该将图像上传到存储库了。我们将使用CodeBuild从Docker集线器中提取镜像并将其推送到ECR注册表。
在CodeBuild控制台上,单击创建构建项目。
接下来,在项目和源配置中,输入项目名称和描述。另外,我们可以为构建项目添加标签。
对于来源,请选择无来源。如果docker文件位于存储库或者s3存储桶中,请选择源作为该存储库。来源选项包括:GitHubBitBucketCodeCommitGitHub EnterpriseS3存储桶
项目和源配置
然后,在该环境下,选择要执行构建项目的环境。由于我们的镜像是Linux镜像,因此我们选择了Linux环境。选择Build Environment
对于角色,选择新的服务角色。 N/B:确保该角色具有添加的AmazonEC2ContainerRegistryFullAccess策略。否则,CodeBuild将无法正常工作。
接下来,在buildspec下,选择insert build命令并粘贴以下两个模板之一:
version: 0.2
phases:
install:
runtime-versions:
docker: 19
commands:
- curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
- unzip awscliv2.zip
- ./aws/install
pre_build:
commands:
- echo logging to ecr
- $(aws ecr get-login --no-include-email --region eu-central-1)
build:
commands:
- docker pull hello-world
- docker tag hello-world:latest 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest
post_build:
commands:
- echo build completed on 'date'
- echo pushing to repo
- docker push 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest
- echo Writing definitions file...
- printf '[{"name":"Hello_World","imageUri":"%s"}]' 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest > HelloWorldtaskdefinition.json
artifacts:
files: HelloWorldtaskdefinition.json
万一我们想从docker文件构建镜像,并且我们有代码提交代码。使用以下buildspec。
version: 0.2
phases:
install:
runtime-versions:
docker: 19
commands:
- curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
- unzip awscliv2.zip
- ./aws/install
pre_build:
commands:
- echo logging to ecr
- $(aws ecr get-login --no-include-email --region eu-central-1)
build:
commands:
- echo starting build on 'date'
- cd ./
- docker build -t hello-world .
- docker tag hello-world:latest 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest
post_build:
commands:
- echo build completed on 'date'
- echo pushing to repo
- docker push 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest
- echo Writing definitions file...
- printf '[{"name":"Hello_World","imageUri":"%s"}]' 429758582529.dkr.ecr.eu-central-1.amazonaws.com/hello-world:latest > HelloWorldtaskdefinition.json
artifacts:
files: HelloWorldtaskdefinition.json
然后,在构件下,根据需求列表选择之前创建的s3存储桶。
建立文物
最后,在Logs下,我们可以在CloudWatch Log Group或者S3存储桶之间进行选择。
完成后,单击创建构建项目。创建项目后,我们现在可以单击开始构建。
随着构建项目的运行,我们可以在"构建日志"和"阶段"详细信息下检查进度。请

