从 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 上,我无法对此进行测试。
在我的 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 上,我无法对此进行测试。