是否可以使用golang客户端固定Docker API版本? (未使用dep for vendoring)
下面的代码失败
client version 1.38 is too new. Maximum supported API version is 1.37
这段代码一直运行到最近
go version go1.9.5 linux/amd64
这里是:docker version
Client:
Version: 18.05.0-ce
API version: 1.37
Go version: go1.9.5
Git commit: f150324
Built: Wed May 9 22:16:25 2018
OS/Arch: linux/amd64
Experimental: false
Orchestrator: swarm
Server:
Engine:
Version: 18.05.0-ce
API version: 1.37 (minimum version 1.12)
Go version: go1.9.5
Git commit: f150324
Built: Wed May 9 22:14:32 2018
OS/Arch: linux/amd64
Experimental: false
这会引发API版本不匹配
package main
// kill off some containers
import (
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"golang.org/x/net/context"
"strings"
)
func main() {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err) // <--- crashes here due to API mismatch
}
containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
if err != nil {
panic(err)
}
for _, container := range containers {
if strings.Contains(container.Image, "enduser") || strings.Contains(container.Image, "admin") {
fmt.Println("\n we found enduser or admin so lets stop it\n")
fmt.Print("Stopping container ", container.ID[:10], "... ")
if err := cli.ContainerStop(ctx, container.ID, nil); err != nil {
panic(err)
}
fmt.Println("Success")
}
}
}
答案 0 :(得分:20)
您可以要求专门使用NewClientWithOpts()
的版本。
package main
import (
"net/http"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
"golang.org/x/net/context"
)
func main() {
ctx := context.Background()
cli, err := client.NewClientWithOpts(client.WithVersion("1.37"))
if err != nil {
panic(err)
}
}
请参见Versioned API and SDK。在末尾,它使用Go API进行显示,并尝试连接到相关代码:
您可以通过以下方式之一指定要使用的API版本:
...
...
...
对于SDK,您还可以通过编程方式指定API版本,作为
client
对象的参数。参见Go constructor 或Python SDK documentation forclient
。
文档硬链接到master
分支上的行号的链接可能已更改,但是上面的代码应为您提供足够的上下文以供理解。
答案 1 :(得分:5)
我遇到了完全相同的问题,@ zero298的答案对我来说很完美=)
然后我发现了client.WithAPIVersionNegotiation()
,它也起作用了!
如果您不需要固定版本,而只希望代码与计算机正在运行的任何版本一起工作,那么我认为此选项将满足您的需求。
答案 2 :(得分:2)
ctx := context.Background()
cli, err := client.NewClientWithOpts(client.FromEnv)
if err != nil {
panic(err)
}
cli.NegotiateAPIVersion(ctx) // this line can negotiate API version
客户端方法的NegotiateAPIVersion可以解决此API版本不匹配的问题。