Golang Docker SDK ImageList All参数为true却无法显示所有镜像?
Golang Docker SDK ImageList All参数失效?
在使用Golang Docker SDK的ImageList方法获取镜像列表时,即使将All参数设置为true,仍然只会显示不同镜像ID的镜像,而无法像docker images命令那样显示所有镜像,包括那些具有相同镜像ID的镜像。
原因:
docker images命令直接查询Docker引擎的镜像存储库,获取所有镜像信息,包括中间层镜像和被标记为删除的镜像。*ImageList方法默认情况下(All=false)只返回未被标记为删除的顶层镜像,即使将All设置为true,也只是返回所有未被删除的镜像,包括中间层镜像。 * Docker引擎为了优化存储空间,会共享相同的镜像层,导致多个镜像可能拥有相同的镜像ID。
解决方案:
为了获取所有镜像信息,包括相同镜像ID的镜像,可以结合使用All参数和Filters参数:goimport ( 'context' 'fmt' 'github.com/docker/docker/api/types' 'github.com/docker/docker/api/types/filters' 'github.com/docker/docker/client')
func main() { cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { panic(err) }
// 设置过滤器,不过滤任何镜像 imageFilters := filters.NewArgs()
options := types.ImageListOptions{ All: true, Filters: imageFilters, }
images, err := cli.ImageList(context.Background(), options) if err != nil { panic(err) }
for _, image := range images { fmt.Println(image.ID) }}
注意:
- 使用
ImageList方法获取的镜像列表中可能包含大量镜像,包括中间层镜像,这会消耗更多内存和网络资源。* 如果只想获取特定类型的镜像,可以使用Filters参数进行过滤,例如:filters.Add('dangling', 'true')获取悬空镜像。
希望本文能帮助你理解ImageList方法与docker images命令的区别,并在使用Golang Docker SDK时获取所需的镜像信息。
原文地址: https://www.cveoy.top/t/topic/fwu5 著作权归作者所有。请勿转载和采集!