在 OpenShift Origin 上删除未使用的 docker 图像的正确方法

Right way to delete unused docker images on OpenShift Origin

我尝试删除 OpenShift origin 上未使用的 docker 图像。 正确的做法是什么?

我试过了:

docker rmi `docker images -aq`

这删除了所有未使用的图像,但我得到了这样的东西:

<none>                                           <none>              28e03c727eab        10 days ago         583.5 MB
172.30.xx.xx:5000/dev-mule/mule             <none>              d059900ab541        4 weeks ago         985.9 MB
172.30.xx.xx:5000/test-dev-mule/test-mule   <none>              d059900ab541        4 weeks ago         985.9 MB
<none>                                           <none>              80ccbf3e9509        8 weeks ago         415.8 MB
<none>                                           <none>              d2d658a63eb2        8 weeks ago         1.59 MB
<none>                                           <none>              eda6efd4df85        10 weeks ago        430 MB
<none>                                           <none>              2f0fc5db512e        10 weeks ago        711.6 MB

我有 7 个 运行 个容器,所以这看起来不错。用过的图片还在。

但是当我执行 oc get images 时,我得到了一个非常大的列表,其中包含很多这种风格的图像:

sha256:830ed5ad3c2deab31836b1d65877c048107d0f6788daa4a36d158386000050a2   172.30.xx.xx:5000/dev-proj/proj@sha256:830ed5ad3c2deab31836b1d65877c048107d0f6788daa4a36d158386000050a2

在 OpenShift Origin 中删除未使用的图像的正确方法是什么? 我的版本是 oc v1.1.6

您应该使用 oc adm prune images 命令删除未使用的图像。请注意,这将是保守的,不会删除最近更改过的图像。

有关更多信息,请参阅 https://docs.openshift.org/latest/admin_guide/pruning_resources.html

我使用的半手动方式是列出图像的属性并进一步处理列表,如下所示:

oc get images -o jsonpath='{range .items[*]}{.dockerImageReference}{.dockerImageMetadata.Created} {.dockerImageMetadata.Size}{"\n"}{end}'

registry.access.redhat.com/jboss-datavirt-6/datavirt63-openshift@sha256:ed82847d159ff9f5e43520b3479a3b15919195c2dc86781cc85b84368d84a7742017-06-26T10:44:21Z 571015080
registry.access.redhat.com/jboss-eap-7/eap70-openshift@sha256:eddcc75d3e7fd5e25b9599a5cb72bd48b403c308e91c501f5dcc9c157ea86c4f2017-06-12T07:37:20Z 572990540
registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift@sha256:ee09a9ae44c338c39783d559367aef63ce548d8de973e09808c4c236c5dcb4852017-08-02T14:53:32Z 190637724
registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift@sha256:ee68b3072bfabacf1272b183c09a43b8116902ac722ff2fca3185235447a453f2017-05-10T10:48:06Z 256713194
...

然后,将“@”替换为图像 'pull name' 和图像 ID 的单独列,并按第一列和第三列应用排序,因此图像名称和日期:

oc get images -o jsonpath='\
  {range .items[*]}{.dockerImageReference} \
  {.dockerImageMetadata.Created} \
  {.dockerImageMetadata.Size}{"\n"}{end}' \
  | sed 's/@/ /' \
  | sort -k1,1 -k3,3

从那里,我可以应用精确过滤器,如 grep -E 'myimage.*2016-' 等。最后,我使用 awk 处理输出并获取 oc 命令:

  ...all the above with filters... | awk '{print "oc delete image "}

结果:

  oc delete image sha256:2cd7c7e0443779e2a090f326d2f0daf0dbdac719e1e254e166fac5c0e107708e
  oc delete image sha256:1d7e028ff3a3439de4a18dad307d5099db64f4e5a12819e7cf2ff72ee21e39d5
  oc delete image sha256:9f31e9f2a18b0ea07f2c0e503e01a784e9365db485f163b6699799a4b53415cf
  oc delete image sha256:dd97c061f076e2c1c8d368896a806056c9bc7d96d1065aca097d86959ce5130c

您显然可以用您选择的语言处理图像列表、解析日期和删除旧的重复项等。

删除不需要的 docker 图片:

sudo docker system prune