我可以固定docker API版本:客户端版本1.38太新了。支持的最大API版本为1.37

时间:2018-06-25 17:19:03

标签: docker go versioning

是否可以使用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")
        }
    }
}

3 个答案:

答案 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版本:

     

文档硬链接到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版本不匹配的问题。