在AWS ECS上运行Docker容器将Docker镜像上传到ECR

时间:2020-02-23 14:31:48  来源:igfitidea点击:

本文是在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存储桶之间进行选择。

完成后,单击创建构建项目。创建项目后,我们现在可以单击开始构建。

随着构建项目的运行,我们可以在"构建日志"和"阶段"详细信息下检查进度。请