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

How to tag ECR Docker Images as prod and non-prod

我有一个 CI/CD 管道,只有一个 JenkinsBuild.jk 设置,只要拉取请求合并到主分支,就会自动触发。

我在 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. " 删除未标记的图像)。

现在问题出现了,当我不得不部署这些 dockerImages 中的一些而不是全部时。示例 - x.36、x.40 和 x.45 是部署到 prod 和 rest 的映像,所有映像都用于非 prod 环境以测试代码。

当我应用下面的 ECR 生命周期策略时,它会保留前 5 个图像,因此所有未部署到生产的版本也将被存储,而最近部署的将被删除。示例:前 5 个图像,即 x.41、x.42、x.43、x.44、x.45 存储在 ECR 中,最近生产 docker 个图像,即 x.36、x.40 由于以下原因被删除低于政策(x.45 未被删除,因为它是前 5 个图像之一)。

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

谁能帮我看看 ECR 策略如何只能删除非产品 docker 图片?

如何使用 JenkinsDeploy.jk 在产品部署期间将 docker 图像覆盖为 p.36、p.40、p.45?

可以的话请多多指教。感谢您阅读我的 post.

由于没有生产 ECR 图像的模式,因此它们是经过精心挑选的。您需要将一些标识符添加到您的生产映像并从您的 ecr 生命周期策略中保存它们。

一种方法是:

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

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

REPO_NAME=
IMG_TAG=
NEW_TAGE=
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"

重命名后,您将使用 p.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",
            "selection": {
                "tagStatus": "tagged",
                "countType": "imageCountMoreThan",
                "countNumber": 5
            },
            "action": {
                "type": "expire"
            }
        }
    ]
}

如果需要,您可以增加产品的数量,并且您可以 运行 在 JenkinsDeploy.jk 中使用此脚本(基于构建成功可能是),但是由于您说产品促销是手动的,所以它会带来更多感觉手动调用它。