Golang Docker SDK ImageSearch 方法改造:无需参数查询所有镜像
要改造 Golang Docker SDK 中的 ImageSearch 方法,使其能够查询出 hub 上的所有镜像信息,可以按照以下步骤进行:
-
打开 Golang Docker SDK 中的 image_search.go 文件,该文件位于路径 docker/client/image_search.go。
-
找到 ImageSearch 方法的定义,该方法定义如下:
func (cli *Client) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]types.ImageSearchResult, error) {
resp, err := cli.get(ctx, "/images/search", nil, map[string]string{
"term": term,
})
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusNotFound {
return nil, ErrNotFound
}
if resp.StatusCode != http.StatusOK {
return nil, NewError(resp)
}
var results []types.ImageSearchResult
err = json.NewDecoder(resp.Body).Decode(&results)
if err != nil {
return nil, err
}
return results, nil
}
- 修改 ImageSearch 方法的定义,将 term 参数改为可选参数,并在方法内部进行判断。修改后的方法定义如下:
func (cli *Client) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]types.ImageSearchResult, error) {
var queryParams map[string]string
if term != "" {
queryParams = map[string]string{
"term": term,
}
} else {
queryParams = nil
}
resp, err := cli.get(ctx, "/images/search", nil, queryParams)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusNotFound {
return nil, ErrNotFound
}
if resp.StatusCode != http.StatusOK {
return nil, NewError(resp)
}
var results []types.ImageSearchResult
err = json.NewDecoder(resp.Body).Decode(&results)
if err != nil {
return nil, err
}
return results, nil
}
-
保存文件并重新编译 Golang Docker SDK。
-
现在可以使用改造后的 ImageSearch 方法查询 hub 上的所有镜像信息,例如:
client, _ := docker.NewClientWithOpts(docker.FromEnv)
results, err := client.ImageSearch(context.Background(), "", types.ImageSearchOptions{})
if err != nil {
log.Fatal(err)
}
for _, result := range results {
fmt.Println(result.Name)
}
注意,改造后的 ImageSearch 方法可以不传递 term 参数,但是如果传递了 term 参数,则按照传递的 term 参数进行查询。
原文地址: https://www.cveoy.top/t/topic/jl8Q 著作权归作者所有。请勿转载和采集!