Могу ли я закрепить версию API докера: клиентская версия 1.38 слишком новая.Максимальная поддерживаемая версия API - 1,37. - PullRequest
0 голосов
/ 25 июня 2018

Есть ли способ закрепить версию API докера с помощью клиента golang?(если не использовать dep для продажи )

приведенный ниже код завершается ошибкой с

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 repo новее, чемверсия, поддерживаемая Docker ... так что для ответа на комментарий - решение состоит в том, чтобы запросить более низкую версию библиотеки репозитория для соответствия Docker, а не запрашивать более высокую версию

Ответы [ 2 ]

0 голосов
/ 29 июля 2019

У меня была точно такая же проблема, и ответ @ zero298 отлично сработал для меня =)

Затем я нашел client.WithAPIVersionNegotiation(), и это тоже сработало!

Если вам не требуется закреплятьверсии и просто хочу, чтобы код работал с любой версией, на которой работает ваша машина, я думаю, что эта опция подойдет вашим потребностям.

0 голосов
/ 25 июня 2018

Вы можете запросить версию специально с 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 . В конце концов он запускается с использованием API Go и (пытается) связать его с соответствующим кодом:

Вы можете указать версию API для использования одним из следующих способов:

  • ...

  • ...

  • ...

  • Для SDK вы также можете программно указать версию API в качестве параметра для объекта client. Смотри Go Конструктор или документацию Python SDK для client.

Жесткая ссылка документации на номер строки в ветви master, которая, возможно, изменилась, но приведенный выше код должен предоставить вам достаточно контекста для понимания.

...