Is there a way to pin docker API version using the golang client? (short of using dep for vendoring)
code below fails with
client version 1.38 is too new. Maximum supported API version is 1.37
This code ran fine until recently
go version go1.9.5 linux/amd64
here is : 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
this kicks up the API version mismatch
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") } } }
In English, the above error is because the default client version of the github repo client library is newer than version supported by Docker ... so to address the comment - one approach which works is to request a lower version of the repo library to match Docker, not to request a higher version
Below approach to negotiate also works fine
cli, err := client.NewClientWithOpts(client.WithAPIVersionNegotiation())
You can ask for a version specifically with 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) } }
See Versioned API and SDK. At the tail end it brings up using the Go API and (tries) to link to the relevant code:
You can specify the API version to use, in one of the following ways:
...
...
...
For the SDKs, you can also specify the API version programmatically, as a parameter to the
client
object. See the Go constructor or the Python SDK documentation forclient
.
The docs hard link to a line number on the master
branch which has probably changed, but the code above should provide you with enough context to understand.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With