Help us learn about your current experience with the documentation. Take the survey.

从容器镜像仓库中删除容器镜像

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

你可以从容器镜像仓库中删除容器镜像。 要基于特定条件自动删除容器镜像,请使用 垃圾回收。 或者,你可以使用第三方工具 创建 CI/CD 作业 来删除特定项目的容器镜像。

要从项目或组中删除特定的容器镜像,你可以使用 GitLab UIGitLab API

删除容器镜像是一项破坏性操作,无法撤销。要恢复已删除的容器镜像,你必须重新构建并重新上传它。

垃圾回收

在 GitLab 自托管实例上删除容器镜像并不会释放存储空间,它只会将镜像标记为可删除。要实际删除未引用的容器镜像并回收存储空间,GitLab 自托管实例管理员必须运行 垃圾回收

GitLab.com 上的容器镜像仓库包含一个自动在线垃圾回收器。 使用自动垃圾回收器,如果以下内容在 24 小时内未被引用,它们将自动安排删除:

  • 任何镜像清单未引用的层。
  • 没有标签且不被其他清单引用的镜像清单(如多架构镜像)。

在线垃圾回收器是实例级功能,适用于所有命名空间。

使用 GitLab UI

要使用 GitLab UI 删除容器镜像:

  1. 在左侧边栏,选择 Search or go to 并找到你的项目或组。

  2. 对于:

    • 组,选择 Operate > Container Registry
    • 项目,选择 Deploy > Container Registry
  3. Container Registry 页面,你可以选择要删除的内容,通过以下方式:

    • 选择红色 remove Trash 图标,删除整个仓库及其包含的所有标签。
    • 导航到仓库,通过选择要删除的标签旁边的红色 remove Trash 图标,单独或批量删除标签。
  4. 在对话框中,选择 Remove tag

删除失败超过 10 次 的容器仓库会自动停止尝试删除镜像。

使用 GitLab API

你可以使用 API 来自动化删除容器镜像的过程。有关更多信息,请参阅以下端点:

使用 GitLab CI/CD

GitLab CI/CD 没有提供内置的方式来删除你的容器镜像。此示例使用了一个名为 regctl 的第三方工具,它与 GitLab Registry API 通信。有关此第三方工具的帮助,请参阅 regclient 的问题跟踪器

以下示例定义了两个阶段:buildcleanbuild_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 变量来更新代码示例。

使用清理策略

你可以创建每个项目的 清理策略,以确保较旧的标签和镜像会定期从容器镜像仓库中删除。