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に一致する下位バージョンのリポジトリライブラリをリクエストすることです、上位バージョンを要求しない
具体的には 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バージョンを指定できます。
...
...
...
SDKの場合、
client
オブジェクトのパラメーターとして、プログラムでAPIバージョンを指定することもできます。 Go constructor またはclient
のPython SDKドキュメント を参照してください。
Docsは、おそらく変更されたmaster
ブランチの行番号にハードリンクしますが、上記のコードは理解するのに十分なコンテキストを提供するはずです。
私はまったく同じ問題を抱えており、@ zero298の答えは私にとって完璧に働いた=)
それからclient.WithAPIVersionNegotiation()
を見つけましたが、それもうまくいきました!
バージョンを固定する必要がなく、マシンが実行しているバージョンに関係なくコードを機能させたい場合は、このオプションがニーズに合っていると思います。