web-dev-qa-db-fra.com

Puis-je épingler la version de l'API Docker: la version 1.38 du client est trop nouvelle. La version d'API maximale prise en charge est 1,37

Existe-t-il un moyen d'épingler la version de l'API Docker à l'aide du client Golang? (à court d'utiliser dep pour la vente )

le code ci-dessous échoue avec

client version 1.38 is too new. Maximum supported API version is 1.37

Ce code fonctionnait bien jusqu'à récemment

go version go1.9.5 linux/AMD64

voici : 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

cela relance le décalage de version d'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")
        }
    }
}

En anglais, l'erreur ci-dessus est due au fait que la version cliente par défaut de la bibliothèque cliente github repo est plus récente que la version prise en charge par Docker ... donc pour répondre au commentaire - la solution est de demander une version inférieure de la bibliothèque repo pour correspondre à Docker, ne pas demander une version supérieure

13
Scott Stensland

Vous pouvez demander une version spécifiquement avec 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)
    }
}

Voir API et SDK versionnés . À la fin, il affiche l'utilisation de l'API Go et (essaie) de se lier au code correspondant:

Vous pouvez spécifier la version d'API à utiliser, de l'une des manières suivantes:

Le lien dur de la documentation vers un numéro de ligne sur la branche master a probablement changé, mais le code ci-dessus devrait vous fournir suffisamment de contexte pour comprendre.

24
zero298

J'ai eu exactement le même problème et la réponse de @ zero298 a parfaitement fonctionné pour moi =)

Ensuite, j'ai trouvé client.WithAPIVersionNegotiation() et cela a aussi fonctionné!

Si vous n'avez pas besoin d'épingler la version et que vous souhaitez simplement que le code fonctionne avec la version de votre machine, je pense que cette option répondra à vos besoins.

3
Henry Blyth