Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Вы можете запросить версию специально для 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 для использования одним из следующих способов:

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

Ответ 2

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

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

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