docker image ls filter

不新鮮、好像有用又好像還好的小知識

Azole (小賴)
Apr 18, 2024

問題

之前在 Mac Docker Desktop 上把 Kubernetes 啟用起來後,在用 docker image ls 時,都會蠻困擾的,會有一堆關於 k8s cluster 需要的 image:

docker image ls

docker container ls 時其實也是,不過在某個 Docker Desktop 的版本後,就多了個選項控制是否要出現 k8s 內部的 containers(如下圖),只需要把 Show system containers 反勾選,這樣在執行 docker container ls 時,就不會看到 k8s 內部的 containers 了,清爽很多。

Docker Desktop 設定畫面

其實看到就看到,要說困擾好像也還好,但如果是在教學或做教材時,就會有影響。

解法

其實 docker image ls 有一個參數是 --filter 可以用,先來看看用起來是怎麼樣:

透過 filter 參數過濾顯示的 image

應該可以很直覺地觀察到,這次只顯示了 image 名稱是以 golang 開頭的。

根據官網的說明,支援以下幾種 filters:

  • dangling: 例如 docker image ls -f "dangling=true" 或是 docker image ls -f=dangling=true ,這樣就可以列出 dangling image 了,也就是那些目前沒有任何標籤、無法識別的 image。這些 image 可以用 docker image prune 來刪除,刪除前就可以先用 filter 查看一下。
  • label: 如果你在 Dockerfile 或是 build image 時,有幫 image 打上 label,那就可以用 filter 來過濾這些 label。
  • before & since: 列出某個 image 之前或之後的 image,由下圖可以觀察到,分別列出了 image 名稱是 golang,且在 golang:v5 之前與之後的 images。除了用 image:tag 之外,也可以用 image id
before & since
  • reference: 透過指定的 pattern 去比對 reference 來過濾。Docker image 的 reference 是一個用來唯一標識和引用 Docker image 的字串,白話一點的說法就是 image 的名稱、tag,格式是 IMAGE[:TAG][@DIGEST] ,在上面的範例中,我們就是用 golang:* 來比對 image 名稱是 golang,但 tag 不拘的 image。

有時候會發現一些好用的指令,但好像就是一個指令或是一個參數,可能也不是新鮮事、別人應該也都知道了?但也許還有人不知道?所以就記錄一下。

參考資料

--

--

Azole (小賴)

As a passionate software engineer and dedicated technical instructor, I have a particular fondness for container technologies and AWS.