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

Sco*_*and 14 versioning go docker

有没有办法使用golang客户端固定docker API版本?(没有使用dep进行销售)

下面的代码失败了

client version 1.38 is too new. Maximum supported API version is 1.37
Run Code Online (Sandbox Code Playgroud)

这段代码直到最近还运行良好

go version go1.9.5 linux/amd64
Run Code Online (Sandbox Code Playgroud)

这是 : 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
Run Code Online (Sandbox Code Playgroud)

这会导致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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

zer*_*298 26

你可以要求专门的版本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)
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅Versioned API和SDK.在尾端,它使用Go API和(尝试)链接到相关代码:

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

文档硬链接到master分支上可能已更改的行号,但上面的代码应该为您提供足够的上下文来理解.


Hen*_*yth 5

我遇到了完全相同的问题,@ zero298的答案对我来说很完美=)

然后我发现了client.WithAPIVersionNegotiation(),那也行得通!

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