从容器镜像仓库中删除容器镜像
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
你可以从容器镜像仓库中删除容器镜像。 要基于特定条件自动删除容器镜像,请使用 垃圾回收。 或者,你可以使用第三方工具 创建 CI/CD 作业 来删除特定项目的容器镜像。
要从项目或组中删除特定的容器镜像,你可以使用 GitLab UI 或 GitLab API。
删除容器镜像是一项破坏性操作,无法撤销。要恢复已删除的容器镜像,你必须重新构建并重新上传它。
垃圾回收
在 GitLab 自托管实例上删除容器镜像并不会释放存储空间,它只会将镜像标记为可删除。要实际删除未引用的容器镜像并回收存储空间,GitLab 自托管实例管理员必须运行 垃圾回收。
GitLab.com 上的容器镜像仓库包含一个自动在线垃圾回收器。 使用自动垃圾回收器,如果以下内容在 24 小时内未被引用,它们将自动安排删除:
- 任何镜像清单未引用的层。
- 没有标签且不被其他清单引用的镜像清单(如多架构镜像)。
在线垃圾回收器是实例级功能,适用于所有命名空间。
使用 GitLab UI
要使用 GitLab UI 删除容器镜像:
-
在左侧边栏,选择 Search or go to 并找到你的项目或组。
-
对于:
- 组,选择 Operate > Container Registry。
- 项目,选择 Deploy > Container Registry。
-
从 Container Registry 页面,你可以选择要删除的内容,通过以下方式:
- 选择红色 Trash 图标,删除整个仓库及其包含的所有标签。
- 导航到仓库,通过选择要删除的标签旁边的红色 Trash 图标,单独或批量删除标签。
-
在对话框中,选择 Remove tag。
删除失败超过 10 次 的容器仓库会自动停止尝试删除镜像。
使用 GitLab API
你可以使用 API 来自动化删除容器镜像的过程。有关更多信息,请参阅以下端点:
使用 GitLab CI/CD
GitLab CI/CD 没有提供内置的方式来删除你的容器镜像。此示例使用了一个名为 regctl 的第三方工具,它与 GitLab Registry API 通信。有关此第三方工具的帮助,请参阅 regclient 的问题跟踪器。
以下示例定义了两个阶段:build 和 clean。build_image 作业为分支构建容器镜像,delete_image 作业删除它。reg 可执行文件被下载并用于删除与 $CI_PROJECT_PATH:$CI_COMMIT_REF_SLUG 预定义 CI/CD 变量 匹配的容器镜像。
要使用此示例,请更改 IMAGE_TAG 变量以匹配你的需求。
stages:
- build
- clean
build_image:
image: docker:20.10.16
stage: build
services:
- docker:20.10.16-dind
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: never
- if: $CI_COMMIT_BRANCH
delete_image:
stage: clean
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
REGCTL_VERSION: v0.6.1
rules:
- if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH
image: alpine:latest
script:
- apk update
- apk add curl
- curl --fail-with-body --location "https://github.com/regclient/regclient/releases/download/${REGCTL_VERSION}/regctl-linux-amd64" > /usr/bin/regctl
- chmod 755 /usr/bin/regctl
- regctl registry login ${CI_REGISTRY} -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD}
- regctl tag rm $IMAGE你可以从 发布页面 下载最新的 regctl 版本,然后通过更改 delete_image 作业中定义的 REGCTL_VERSION 变量来更新代码示例。
使用清理策略
你可以创建每个项目的 清理策略,以确保较旧的标签和镜像会定期从容器镜像仓库中删除。