【问题标题】:Selectively prune docker images by tag通过标签选择性地修剪 docker 镜像
【发布时间】:2023-01-14 09:22:02
【问题描述】:

如果使用的图像有多个图像标签,docker image prune -a 将保留按字母顺序排列的最后一个标签。请参阅底部的可重现示例。

有没有办法影响保留哪些标签?理想情况下,我希望 docker image prune -a 保留所有正在使用的图像标签组合(正在使用的包括停止的容器)。

可重现的示例(小心,因为它会从您的 docker 系统中删除图像):

# docker image prune -a keeps hellow-world:x

docker pull hello-world
docker tag hello-world:latest hello-world:x
docker tag hello-world:latest hello-world:a
docker run hello-world:x
docker run hello-world:a
docker image prune -a
# Reset

docker system prune -a
# docker image prune -a keeps hellow-world:z

docker pull hello-world
docker tag hello-world:latest hello-world:x
docker tag hello-world:latest hello-world:z
docker run hello-world:x
docker run hello-world:z
docker image prune -a

【问题讨论】:

  • 我认为这个问题与 moby 项目中关于“docker image prune/rm removes in-use docker tags”的开放问题有关github.com/moby/moby/issues/36295
  • 是的,图像仍然存在,但即使对于正在运行的容器,图像标签组合也会被删除。

标签: docker


【解决方案1】:

我不知道有什么方法可以使用 docker cli 在本地执行此操作,但是 awk/sed 的组合可以提供帮助。

~# docker pull hello-world
~# docker tag hello-world:latest hello-world:x
~# docker tag hello-world:latest hello-world:z
~# docker run hello-world:x
~# docker run hello-world:z

我们将生成图像列表,然后发送到docker rmi,而不是使用prune

~# docker ps -a --format '{{.Image}}' > ps_images
~# cat ps_images
hello-world:z
hello-world:x

~# docker images --format '{{.Repository}}:{{.Tag}}' | sort -r
hello-world:z
hello-world:x
hello-world:latest

这些是可能被修剪的图像,其中(由于 sort -rhello-world:z 应该保留,因为它是 hello-world 的词典顺序最后一个图像。如果我们过滤掉在前面的docker ps -a命令中找到的图像,我们应该保留:z:x,在这种情况下意味着删除:latest

~# docker images --format '{{.Repository}}:{{.Tag}}' | sort -r 
  | awk -F: '{arr[$1]++;print(arr[$1],$1 ":" $2);}' 
  | sed -nE 's/^([^1] |1[^ ]+ )(.*)//gp' | grep -f ps_images -v
hello-world:latest

我们可以将其直接发送至docker rmi

~# docker images --format '{{.Repository}}:{{.Tag}}' | sort -r 
  | awk -F: '{arr[$1]++;print(arr[$1],$1 ":" $2);}' 
  | sed -nE 's/^([^1] |1[^ ]+ )(.*)//gp' | grep -f ps_images -v 
  | xargs docker rmi
Untagged: hello-world:latest
~# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   x         feb5d9fea6a5   15 months ago   13.3kB
hello-world   z         feb5d9fea6a5   15 months ago   13.3kB

演练:

  • sort -r 以最新优先排序

  • awk ... 按图像名称的第一个组件对它们进行编号,其输出为

    1 hello-world:z
    2 hello-world:x
    3 hello-world:latest
    
  • sed ... 删除了 1

  • grep ... 删除了我们在第一个代码块中从 docker ps -a 中发现的图像(-v 正在反转匹配)

  • xargs ... 将输出行(在本例中为hello-world:latest)作为单独的参数发送给docker rmi

【讨论】:

    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2017-09-10
    • 2015-09-17
    • 1970-01-01
    • 2021-05-05
    • 2020-05-01
    相关资源
    最近更新 更多