DEV Community

drake
drake

Posted on

删除K8s部署的Docker镜像仓库的历史镜像

  • 1、进入镜像仓库所在容器,执行下面的命令
mkdir -p /etc/docker/registry

cat <<EOF > /etc/docker/registry/config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
  delete:
    enabled: true
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
EOF

Enter fullscreen mode Exit fullscreen mode
  • 2、在K8s的另外一个容器内执行如下操作:

创建shell脚本,并且执行它;脚本含义:排除两个基础镜像后,其他的全部删除

#!/bin/bash

REGISTRY="http://docker-registry-service.devops-tools.svc.cluster.local:5000"
REPO="spider"
KEEP=("minibase" "dappradar8")

# 获取所有 tags
ALL_TAGS=$(curl -s "${REGISTRY}/v2/${REPO}/tags/list" | jq -r '.tags[]')

for TAG in $ALL_TAGS; do
  # 如果是保留的 tag,则跳过
  if [[ " ${KEEP[*]} " == *" $TAG "* ]]; then
    echo "Skipping tag: $TAG"
    continue
  fi

  # 获取 digest
  DIGEST=$(curl -sI -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
    "${REGISTRY}/v2/${REPO}/manifests/${TAG}" | grep -i Docker-Content-Digest | awk '{print $2}' | tr -d $'\r')

  if [[ -n "$DIGEST" ]]; then
    # 删除 tag(实际上是删除 digest)
    echo "Deleting tag: $TAG -> digest: $DIGEST"
    curl -X DELETE "${REGISTRY}/v2/${REPO}/manifests/${DIGEST}"
  else
    echo "Failed to get digest for tag: $TAG"
  fi
done
Enter fullscreen mode Exit fullscreen mode
  • 3、垃圾回收,进入镜像仓库所在的容器,执行下面的命令

第2步的删除操作,还得需要一个垃圾回收才能真正的释放磁盘空间

registry garbage-collect /etc/docker/registry/config.yml

Enter fullscreen mode Exit fullscreen mode
  • 4、校验磁盘空间是否已经被释放

在镜像仓库的容器内执行下面的命令

du -sh ./*
Enter fullscreen mode Exit fullscreen mode

背景信息:

部署镜像仓库的yaml文件


apiVersion: apps/v1
kind: Deployment
metadata:
  name: docker-registry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: docker-registry
  template:
    metadata:
      labels:
        app: docker-registry
    spec:
      containers:
        - name: registry
          image: registry
          env:
            - name: bitget_logs_spider
              value: "stdout"
            - name: REGISTRY_STORAGE_DELETE_ENABLED
              value: "true"
          resources:
            limits:
              memory: "3000Mi"
            requests:
              memory: "3000Mi"
          volumeMounts:
            - name: registry-storage
              mountPath: /var/lib/registry
      volumes:
        - name: registry-storage
          persistentVolumeClaim:
              claimName: docker-pv-claim
Enter fullscreen mode Exit fullscreen mode

Top comments (0)