gpt4 book ai didi

aws-cloudformation - 使用 CloudFormation 将 Docker 镜像推送到 ECR

转载 作者:行者123 更新时间:2023-12-01 09:06:33 24 4
gpt4 key购买 nike

我是 DevOps 新手。

作为 gitci 的一部分,我在 GitLab 中有一个 Docker 文件。我计划创建一个 Docker 镜像并将其推送到 ECR,然后使用该镜像进行批处理。

我已经使用ECR中的现有图像完成了批处理部分。但无法创建 Docker 镜像并使用 CloudFormation 进行推送。

我应该在 init 中使用命令吗?

提前感谢各位老师

最佳答案

我在工作中遇到了同样的问题,并且偶然发现了这个已经提出的问题,但没有正确的答案,所以我将给出我是如何做的说明。

基线:你不能使用cloudformation来做到这一点,cloudformation用于创建基础设施和自动化。不过,您可以使用 codebuild 来完成此操作,并且可以使用 cloudformation 创建 codebuild 项目。这个repository这是一个实际的例子。

您要做的是:创建一个 cloudformation 模板,该模板创建一个 codebuild 项目,并在您的 codebuild 中创建一个 buildspec.yml(指定构建的文件),该文件会将您的镜像推送到 ECR。

代码构建项目如下所示:

CodeBuildProject:
Type: AWS::CodeBuild::Project
Properties:
Artifacts:
Type: CODEPIPELINE
Description: "Codebuild project to push flask api image to ecr"
Environment:
ComputeType:
!FindInMap [CodeBuildComputeTypeMap, !Ref GithubBranch, type]
EnvironmentVariables:
- Name: AWS_DEFAULT_REGION
Value: !Ref AWS::Region
- Name: AWS_ACCOUNT_ID
Value: !Ref "AWS::AccountId"
- Name: AWS_ECR_REPOSITORY_URI
Value: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${EcrRepository}
- Name: IMAGE_REPO_NAME
Value: !Ref GithubRepository
- Name: IMAGE_TAG
Value: "latest"
Image: "aws/codebuild/standard:5.0"
PrivilegedMode: true
Type: "LINUX_CONTAINER"
ServiceRole: !GetAtt CodeBuildRole.Arn
Source:
Type: "CODEPIPELINE"
BuildSpec: buildspec.yml

EcrRepository:
Type: AWS::ECR::Repository
Properties:
RepositoryName: !Ref GithubRepository

CodeBuildRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- codebuild.amazonaws.com
Action:
- "sts:AssumeRole"
Policies:
- PolicyName: "PushImageToEcr"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- ecr:BatchGetImage
- ecr:BatchCheckLayerAvailability
- ecr:CompleteLayerUpload
- ecr:GetDownloadUrlForLayer
- ecr:InitiateLayerUpload
- ecr:PutImage
- ecr:UploadLayerPart
- ecr:GetAuthorizationToken
Resource: "*"
- PolicyName: "CodeBuildLogsRole"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource:
- !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/codebuild/*"
- PolicyName: "GetAndPutArtifacts"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action:
- s3:GetObject
- s3:PutObject
- s3:ListBucket
Resource:
- !GetAtt ArtifactBucket.Arn
- !Sub ${ArtifactBucket.Arn}/*

ArtifactBucket:
Type: AWS::S3::Bucket

这应该位于 cloudformation 的资源部分,并将创建 codebuild 项目、ecr 存储库、codebuild 服务角色和工件的 s3 存储桶。

然后您需要一个 buildspec.yml 模板来推送您的图像,如下所示:

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...
- cd app/
- 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

关于aws-cloudformation - 使用 CloudFormation 将 Docker 镜像推送到 ECR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49664154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com