【问题标题】:How to tag ECR Docker Images as prod and non-prod如何将 ECR Docker 映像标记为产品和非产品
【发布时间】:2020-10-09 06:45:47
【问题描述】:

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

我在 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 中的一部分部署到 prod 而不是全部部署时。示例 - x.36 、 x.40 和 x.45 是部署到 prod 和 rest 的图像,所有图像都用于非 prod 环境以测试代码。

当我应用以下 ECR 生命周期策略时,它会保留前 5 个图像,因此所有未部署到 prod 的版本也会被存储,而最近部署的版本将被删除。示例:前 5 个图像,即 x.41,x.42,x.43,x.44,x.45 存储在 ECR 中,最近的产品 dockerImages,即 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 策略如何只能删除非产品 dockerImages 吗?

如何在 prod 部署期间使用 JenkinsDeploy.jk 覆盖 dockerImages 作为 p.36、p.40、p.45?

如果可以,请提出建议。感谢您阅读我的帖子。

【问题讨论】:

  • 将图片推广到产品的标准是什么?还是手动过程?
  • 36....41 , 42 ,43 ...,45 是内部版本号,基本上是 java jar 。因此,它的提升取决于构建是否通过且没有错误,是否具有完整的代码覆盖率等。它是手动升级的,因为需要部署的功能将在特定的构建版本中。

标签: docker lifecycle amazon-ecr


【解决方案1】:

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

一种方法是:

  • 为每个要升级为 prod 的 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"

重命名后,您将使用 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"
            }
        }
    ]
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多