web-dev-qa-db-ja.com

Docker APIバージョンを固定できますか?クライアントバージョン1.38は新しすぎます。サポートされる最大APIバージョンは1.37です

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")
        }
    }
}

英語では、上記のエラーはgithubリポジトリクライアントライブラリのデフォルトのクライアントバージョンがDockerでサポートされているバージョンよりも新しいためです...そのため、コメントに対処するために-解決策はDockerに一致する下位バージョンのリポジトリライブラリをリクエストすることです、上位バージョンを要求しない

13
Scott Stensland

具体的には 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)
    }
}

バージョン管理されたAPIおよびSDK を参照してください。最後に、Go APIを使用して(試行)関連するコードにリンクします。

次のいずれかの方法で、使用するAPIバージョンを指定できます。

Docsは、おそらく変更されたmasterブランチの行番号にハードリンクしますが、上記のコードは理解するのに十分なコンテキストを提供するはずです。

24
zero298

私はまったく同じ問題を抱えており、@ zero298の答えは私にとって完璧に働いた=)

それからclient.WithAPIVersionNegotiation()を見つけましたが、それもうまくいきました!

バージョンを固定する必要がなく、マシンが実行しているバージョンに関係なくコードを機能させたい場合は、このオプションがニーズに合っていると思います。

3
Henry Blyth