从 gitlab 注册表中删除 docker 图像标签会删除已删除标签的重新标记

Deleting docker image tags from gitlab registry deletes retags of deleted tag

在我的 gitlab-ci 管道的清理阶段,我删除了测试前生成的临时 docker 标签。图像在发布阶段被重新标记。删除原始标签时,重新标记也被删除。阶段是:

build:
  script:
    - docker build [...] $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG} [...]
    - docker push $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG} [...]
test:
  # do some testing
publish:
  script:
    - docker pull $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG}
    - docker tag $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG} $CI_REGISTRY_IMAGE/<image-name>:${CI_COMMIT_REF_SLUG}
    - docker push $CI_REGISTRY_IMAGE/<image-name>:${CI_COMMIT_REF_SLUG}
cleanup:
  when: always
  script:
    - 'curl --request DELETE --header "PRIVATE-TOKEN: ${GITLAB_PAT}" "<gitlab-url>/api/v4/projects/<project-path>/registry/repositories/<repository-id>/tags/${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG}"'

运行后,标签 ${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG} ${CI_COMMIT_REF_SLUG}both 删除,仅根据我的理解${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG} 应删除。标签按预期创建并在清理阶段取消后保留。通过 ui 删除标签时会发生相同的行为。如果我在清理阶段时遗漏了与此问题相关的任何内容,请告诉我。

好的,我知道问题出在哪里了。看来我 运行 变成了 this issue。 一种可能的解决方法是将任意图像标记为与要删除的图像相同,并将其推到旧图像上。之后你可以删除标签而不删除重新标签:

docker pull alpine:latest
docker tag alpine:latest $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG}
docker push $CI_REGISTRY_IMAGE/<image-name>:${CI_PIPELINE_ID}${CI_COMMIT_REF_SLUG}

从表面上看,这个问题的修复是在 12.8 的 gitlab 里程碑中,但由于我们的内部 gitlab 仍在 11.10 上,我无法对此进行测试。