如何将ECR Docker映像标记为产品和非产品

问题描述

我有一个带有单个JenkinsBuild.jk设置的CI / CD管道,只要将pull Request合并到master分支,该设置就会自动触发。

我在JenkinsBuild中有一堆命令,例如'docker build'和'docker push',它们创建了类似docker-images的版本:

x.36,x.37,x.38,x.39,x.40,x.41,x.42,x.43,x.44,x.45(将前缀“ x。”添加删除未加标签的图像。

现在,当我不得不将少量dockerImage部署到生产而不是全部部署时,就会出现问题。示例-x.36,x.40和x.45是部署到产品的映像,其余所有映像都用于非产品环境以测试代码

当我应用下面的ECR生命周期策略时,它将保留前5个映像,因此所有未部署到prod的版本也将被存储,而最近部署的那些版本将被删除。示例:前5个图像(即x.41,x.42,x.43,x.44,x.45)存储在ECR中,并且由于以下策略(x。 45张未删除,因为它是前5张图片之一。

{
      "rulePriority": 1,"description": "Keep last 5 images","selection": {
        "tagStatus": "tagged","tagPrefixList": ["x."],"countType": "imageCountMoreThan","countNumber": 5
      },"action": {
        "type": "expire"
      }
    }

有人可以帮我ECR策略如何仅删除非生产dockerImages吗?

我如何使用JenkinsDeploy.jk在产品部署期间以p.36,p.40,p.45覆盖dockerImages?

请提出您的建议。感谢您阅读我的帖子。

解决方法

由于没有生产ECR图像的图案,因此是手工挑选的。您需要在生产图像中添加一些标识符,并将其从您的ecr生命周期策略中保存。

一种方法是:

  • 为每个要升级为产品的ECR图像重命名标签,即在升级之前手动运行此bash脚本:

./rename_tag.sh <repo_name> "x.36" "p.36"

REPO_NAME=$1
IMG_TAG=$2
NEW_TAGE=$3
MANIFEST=$(aws ecr batch-get-image --repository-name "$REPO_NAME" --image-ids imageTag="$IMG_TAG" --query 'images[].imageManifest' --output text)

aws ecr put-image --repository-name "$REPO_NAME" --image-tag "$NEW_TAG" --image-manifest "$MANIFEST"

aws ecr batch-delete-image --repository-name "$REPO_NAME" --image-ids imageTag="$IMG_TAG"

重命名后,您将使用第36页作为生产图像。

别忘了将您的ECR生命周期策略更新为:

{
    "rules": [
        {
            "rulePriority": 1,"description": "Keep 10 production images","selection": {
                "tagStatus": "tagged","tagPrefixList": ["p"],"countType": "imageCountMoreThan","countNumber": 10
            },"action": {
                "type": "expire"
            }
        },{
            "rulePriority": 2,"description": "Keep 5 nonprod images","countNumber": 5
            },"action": {
                "type": "expire"
            }
        }
    ]
}

如果需要,您可以增加prod的数量,并且可以在JenkinsDeploy.jk中运行此脚本(可能基于构建成功),但是由于您说prod促销是手动的,因此手动调用它更有意义。