首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以引脚对接API版本:客户端版本1.38太新了。最大支持API版本为1.37

我可以引脚对接API版本:客户端版本1.38太新了。最大支持API版本为1.37
EN

Stack Overflow用户
提问于 2018-06-25 17:19:03
回答 3查看 10.2K关注 0票数 21

是否有一种方法可以使用golang客户端来插入docker版本?(未使用负责销售的副处长)

下面的代码将失败

代码语言:javascript
复制
client version 1.38 is too new. Maximum supported API version is 1.37

直到最近,这段代码才正常运行。

代码语言:javascript
复制
go version go1.9.5 linux/amd64

这里是:docker version

代码语言:javascript
复制
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版本不匹配。

代码语言:javascript
复制
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")
        }
    }
}

在英语中,上述错误是因为github回购客户端库的默认客户端版本比Docker支持的版本更新。因此,要解决注释,一种可行的方法是请求较低版本的回购库来匹配Docker,而不是请求更高的版本。

下面的谈判方法也很好

client.NewClientWithOpts(client.WithAPIVersionNegotiation()),err :=

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-29 19:29:31

我也有同样的问题,@zero298 298的回答对我来说非常有效

然后我找到了client.WithAPIVersionNegotiation(),这也奏效了!

如果您不需要固定版本,只想让代码与您的机器正在运行的任何版本一起工作,我认为此选项将满足您的需要。

票数 13
EN

Stack Overflow用户

发布于 2018-06-25 17:24:54

您可以使用NewClientWithOpts()专门要求一个版本。

代码语言:javascript
复制
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)
    }
}

版本API和SDK。在尾端,它使用Go API和(尝试)链接到相关代码:

可以通过下列方式之一指定要使用的API版本:

  • ..。
  • ..。
  • ..。
  • 对于SDK,还可以以编程方式指定API版本,作为client对象的参数。请参阅Go构造函数client

docs硬链接到master分支上的行号,这可能已经改变了,但是上面的代码应该为您提供足够的上下文来理解。

票数 32
EN

Stack Overflow用户

发布于 2020-01-25 06:41:04

代码语言:javascript
复制
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版本错配问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51028784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档