Repository: moby/buildkit

Issue:
WCOW: trailing `/` ignored during `COPY` if destination dir not present
The trailing `/` is ignored and the destination directory is instead taken as a file. For example `COPY file.txt dir/`, instead copies `file.txt` into `dir` (file), when it should be `dir/file.txt`

Minimal repro dockerfile:

```powershell
echo hello > test1.txt
```

```dockerfile
FROM mcr.microsoft.com/windows/nanoserver:ltsc2022
COPY test1.txt /sample/
RUN type \sample\test1.txt
```

Run with `buildctl`:
```
...
#6 [2/3] COPY test1.txt /sample/
#6 DONE 0.3s

#7 [3/3] RUN type sampletest1.txt
#7 1.813 The directory name is invalid.
#7 ERROR: process "cmd /S /C type \\sample\\test1.txt" did not complete successfully: exit code: 1
------
 > [3/3] RUN type sampletest1.txt:
1.813 The directory name is invalid.
------
Dockerfile:3
--------------------
   1 |     FROM mcr.microsoft.com/windows/nanoserver:ltsc2022
   2 |     COPY test1.txt /sample/
   3 | >>> RUN type \sample\test1.txt
   4 |
--------------------
error: failed to solve: process "cmd /S /C type \\sample\\test1.txt" did not complete successfully: exit code: 1
```

The file is copied to `C:\sample` instead, which was to be a directory.

While it builds successfully with Docker (on Windows) or with equivalent dockerfile on Linux (with buildctl):

```
Step 3/3 : RUN type \sample\test1.txt
 ---> Running in d197cfe7b42d
hello
 ---> Removed intermediate container d197cfe7b42d
 ---> 14acdf8e60d2
```


If you add a step to create the destination directory, it runs successfully:

```Dockerfile
FROM mcr.microsoft.com/windows/nanoserver:ltsc2022
RUN mkdir sample # <-- added
COPY test1.txt /sample/
RUN type \sample\test1.txt
```

```
#8 [4/4] RUN type sampletest1.txt
#8 1.230 hello
#8 DONE 1.5s
```

Also this fails:

```dockerfile
FROM mcr.microsoft.com/windows/nanoserver:ltsc2022
COPY test1.txt /another/sample/
RUN type \another\sample\test1.txt
```

The file is copied to `C:\another\sample` instead.

Discussion:
@profnandaa: Found the place `/` is being stripped off, at `filepath.Clean()`.

```go
// ok, already dest has `/` stripped off.
b buildkit\frontend\dockerfile\dockerfile2llb\convert.go:1344

  1343: func dispatchCopy(d *dispatchState, cfg copyConfig) error {
=>1344:         dest, err := pathRelativeToWorkingDir(d.state, cfg.params.DestPath, *d.platform)
  1345:         if err != nil {

// step
=>1787:         p, err = system.CheckSystemDriveAndRemoveDriveLetter(p, platform.OS)
  1788:         if err != nil {
  1789:                 return "", errors.Wrap(err, "removing drive letter")
  1790:         }
  1791:
  1792:         if system.IsAbs(p, platform.OS) {
(dlv) p p
"/sample/"

// `/` being stripped out at L1787
  1787:         p, err = system.CheckSystemDriveAndRemoveDriveLetter(p, platform.OS)
=>1788:         if err != nil {
  1789:                 return "", errors.Wrap(err, "removing drive letter")
  1790:         }
  1791:
  1792:         if system.IsAbs(p, platform.OS) {
  1793:                 return system.NormalizePath("/", p, platform.OS, true)
(dlv) p p
"/sample"

// specifically:
// step at 1787
   197:         if len(parts) < 2 {
=> 198:                 return ToSlash(filepath.Clean(path), inputOS), nil
   199:         }
(dlv) p parts
[]string len: 1, cap: 2, [
        "/sample/",
]
// step at 198
    88: func ToSlash(inputPath, inputOS string) string {
=>  89:         if inputOS != "windows" {
    90:                 return inputPath
    91:         }
    92:         return strings.ReplaceAll(inputPath, "\\", "/")
    93: }
    94:
(dlv) p inputPath
"\\sample"
// `\` stripped out in filepath.Clean(path)
```

 Worked on a fix to restore it afterwards, PR following. /cc. @tonistiigi @thaJeztah: Ah, yes, I recall the classic builder has some special handling for these;
https://github.com/moby/moby/blob/34182f6202507a1974e19b5140e2e36dc99892ff/builder/dockerfile/copy_unix.go#L46-L60

And the windows implementation for the above;
https://github.com/moby/moby/blob/34182f6202507a1974e19b5140e2e36dc99892ff/builder/dockerfile/copy_windows.go#L82-L126

```go
// normalizeDest normalises the destination of a COPY/ADD command in a
// platform semantically consistent way.
func normalizeDest(workingDir, requested string) (string, error) {
	dest := filepath.FromSlash(requested)
	endsInSlash := strings.HasSuffix(dest, string(os.PathSeparator))

	// We are guaranteed that the working directory is already consistent,
	// However, Windows also has, for now, the limitation that ADD/COPY can
	// only be done to the system drive, not any drives that might be present
	// as a result of a bind mount.
	//
	// So... if the path requested is Linux-style absolute (/foo or \\foo),
	// we assume it is the system drive. If it is a Windows-style absolute
	// (DRIVE:\\foo), error if DRIVE is not C. And finally, ensure we
	// strip any configured working directories drive letter so that it
	// can be subsequently legitimately converted to a Windows volume-style
	// pathname.

	// Not a typo - filepath.IsAbs, not system.IsAbs on this next check as
	// we only want to validate where the DriveColon part has been supplied.
	if filepath.IsAbs(dest) {
		if strings.ToUpper(string(dest[0])) != "C" {
			return "", fmt.Errorf("Windows does not support destinations not on the system drive (C:)")
		}
		dest = dest[2:] // Strip the drive letter
	}

	// Cannot handle relative where WorkingDir is not the system drive.
	if len(workingDir) > 0 {
		if ((len(workingDir) > 1) && !system.IsAbs(workingDir[2:])) || (len(workingDir) == 1) {
			return "", fmt.Errorf("Current WorkingDir %s is not platform consistent", workingDir)
		}
		if !system.IsAbs(dest) {
			if string(workingDir[0]) != "C" {
				return "", fmt.Errorf("Windows does not support relative paths when WORKDIR is not the system drive")
			}
			dest = filepath.Join(string(os.PathSeparator), workingDir[2:], dest)
			// Make sure we preserve any trailing slash
			if endsInSlash {
				dest += string(os.PathSeparator)
			}
		}
	}
	return dest, nil
}
```


@profnandaa: @thaJeztah -- this is really helpful, been wanting to know how the classic builder handles this. Thanks for sharing!
Will appreciate your review on my fix #5317 

Solution patch:
diff --git a/cache/contenthash/checksum.go b/cache/contenthash/checksum.go
index 8a976fbff..e401b731a 100644
--- a/cache/contenthash/checksum.go
+++ b/cache/contenthash/checksum.go
@@ -110,6 +110,9 @@ func (cm *cacheManager) Checksum(ctx context.Context, ref cache.ImmutableRef, p
 	if err != nil {
 		return "", nil
 	}
+	// only applies for Windows, it's a no-op on non-Windows.
+	enableProcessPrivileges()
+	defer disableProcessPrivileges()
 	return cc.Checksum(ctx, ref, p, opts, s)
 }
 
diff --git a/cache/contenthash/checksum_unix.go b/cache/contenthash/checksum_unix.go
index 3918918d8..96e64d18f 100644
--- a/cache/contenthash/checksum_unix.go
+++ b/cache/contenthash/checksum_unix.go
@@ -7,3 +7,9 @@ import "path/filepath"
 func (cc *cacheContext) walk(scanPath string, walkFunc filepath.WalkFunc) error {
 	return filepath.Walk(scanPath, walkFunc)
 }
+
+// This is a no-op on non-Windows
+func enableProcessPrivileges() {}
+
+// This is a no-op on non-Windows
+func disableProcessPrivileges() {}
diff --git a/cache/contenthash/checksum_windows.go b/cache/contenthash/checksum_windows.go
index 9e0c02023..be0b539b3 100644
--- a/cache/contenthash/checksum_windows.go
+++ b/cache/contenthash/checksum_windows.go
@@ -6,11 +6,24 @@ import (
 	"github.com/Microsoft/go-winio"
 )
 
+var privileges = []string{winio.SeBackupPrivilege}
+
 func (cc *cacheContext) walk(scanPath string, walkFunc filepath.WalkFunc) error {
 	// elevating the admin privileges to walk special files/directory
 	// like `System Volume Information`, etc. See similar in #4994
-	privileges := []string{winio.SeBackupPrivilege}
 	return winio.RunWithPrivileges(privileges, func() error {
 		return filepath.Walk(scanPath, walkFunc)
 	})
 }
+
+// Adds the SeBackupPrivilege to the process
+// to be able to access some special files and directories.
+func enableProcessPrivileges() {
+	_ = winio.EnableProcessPrivileges(privileges)
+}
+
+// Disables the SeBackupPrivilege on the process
+// once the group of functions that needed it is complete.
+func disableProcessPrivileges() {
+	_ = winio.DisableProcessPrivileges(privileges)
+}
diff --git a/client/llb/source.go b/client/llb/source.go
index b08027e1d..e4290b463 100644
--- a/client/llb/source.go
+++ b/client/llb/source.go
@@ -360,13 +360,6 @@ func AuthTokenSecret(v string) GitOption {
 	})
 }
 
-func AuthHeaderSecret(v string) GitOption {
-	return gitOptionFunc(func(gi *GitInfo) {
-		gi.AuthHeaderSecret = v
-		gi.addAuthCap = true
-	})
-}
-
 func KnownSSHHosts(key string) GitOption {
 	key = strings.TrimSuffix(key, "\n")
 	return gitOptionFunc(func(gi *GitInfo) {
@@ -380,6 +373,29 @@ func MountSSHSock(sshID string) GitOption {
 	})
 }
 
+// AuthOption can be used with either HTTP or Git sources.
+type AuthOption interface {
+	GitOption
+	HTTPOption
+}
+
+// AuthHeaderSecret returns an AuthOption that defines the name of a
+// secret to use for HTTP based authentication.
+func AuthHeaderSecret(secretName string) AuthOption {
+	return struct {
+		GitOption
+		HTTPOption
+	}{
+		GitOption: gitOptionFunc(func(gi *GitInfo) {
+			gi.AuthHeaderSecret = secretName
+			gi.addAuthCap = true
+		}),
+		HTTPOption: httpOptionFunc(func(hi *HTTPInfo) {
+			hi.AuthHeaderSecret = secretName
+		}),
+	}
+}
+
 // Scratch returns a state that represents an empty filesystem.
 func Scratch() State {
 	return NewState(nil)
@@ -595,6 +611,14 @@ func HTTP(url string, opts ...HTTPOption) State {
 		attrs[pb.AttrHTTPGID] = strconv.Itoa(hi.GID)
 		addCap(&hi.Constraints, pb.CapSourceHTTPUIDGID)
 	}
+	if hi.AuthHeaderSecret != "" {
+		attrs[pb.AttrHTTPAuthHeaderSecret] = hi.AuthHeaderSecret
+		addCap(&hi.Constraints, pb.CapSourceHTTPAuth)
+	}
+	if hi.Header != nil {
+		hi.Header.setAttrs(attrs)
+		addCap(&hi.Constraints, pb.CapSourceHTTPHeader)
+	}
 
 	addCap(&hi.Constraints, pb.CapSourceHTTP)
 	source := NewSource(url, attrs, hi.Constraints)
@@ -603,11 +627,13 @@ func HTTP(url string, opts ...HTTPOption) State {
 
 type HTTPInfo struct {
 	constraintsWrapper
-	Checksum digest.Digest
-	Filename string
-	Perm     int
-	UID      int
-	GID      int
+	Checksum         digest.Digest
+	Filename         string
+	Perm             int
+	UID              int
+	GID              int
+	AuthHeaderSecret string
+	Header           *HTTPHeader
 }
 
 type HTTPOption interface {
@@ -645,6 +671,33 @@ func Chown(uid, gid int) HTTPOption {
 	})
 }
 
+// Header returns an [HTTPOption] that ensures additional request headers will
+// be sent when retrieving the HTTP source.
+func Header(header HTTPHeader) HTTPOption {
+	return httpOptionFunc(func(hi *HTTPInfo) {
+		hi.Header = &header
+	})
+}
+
+type HTTPHeader struct {
+	Accept    string
+	UserAgent string
+}
+
+func (hh *HTTPHeader) setAttrs(attrs map[string]string) {
+	if hh.Accept != "" {
+		attrs[hh.attr("accept")] = hh.Accept
+	}
+
+	if hh.UserAgent != "" {
+		attrs[hh.attr("user-agent")] = hh.UserAgent
+	}
+}
+
+func (hh *HTTPHeader) attr(name string) string {
+	return pb.AttrHTTPHeaderPrefix + name
+}
+
 func platformSpecificSource(id string) bool {
 	return strings.HasPrefix(id, "docker-image://") || strings.HasPrefix(id, "oci-layout://")
 }
diff --git a/cmd/buildkitd/main.go b/cmd/buildkitd/main.go
index 364252a59..8b6e0b365 100644
--- a/cmd/buildkitd/main.go
+++ b/cmd/buildkitd/main.go
@@ -1067,6 +1067,13 @@ func getCDIManager(cfg config.CDIConfig) (*cdidevices.Manager, error) {
 		if err := cdiCache.Refresh(); err != nil {
 			return nil, err
 		}
+		if errs := cdiCache.GetErrors(); len(errs) > 0 {
+			for dir, errs := range errs {
+				for _, err := range errs {
+					bklog.L.Warnf("CDI setup error %v: %+v", dir, err)
+				}
+			}
+		}
 		return cdiCache, nil
 	}()
 	if err != nil {
diff --git a/control/control.go b/control/control.go
index a54425168..dd03c7567 100644
--- a/control/control.go
+++ b/control/control.go
@@ -311,6 +311,7 @@ func (c *Controller) ListenBuildHistory(req *controlapi.BuildHistoryRequest, srv
 
 func (c *Controller) UpdateBuildHistory(ctx context.Context, req *controlapi.UpdateBuildHistoryRequest) (*controlapi.UpdateBuildHistoryResponse, error) {
 	if req.Delete {
+		c.history.Finalize(ctx, req.Ref) // ignore error
 		err := c.history.Delete(ctx, req.Ref)
 		return &controlapi.UpdateBuildHistoryResponse{}, err
 	}
diff --git a/executor/oci/spec.go b/executor/oci/spec.go
index a6034e6ed..e3887d9c4 100644
--- a/executor/oci/spec.go
+++ b/executor/oci/spec.go
@@ -20,6 +20,7 @@ import (
 	"github.com/moby/buildkit/solver/llbsolver/cdidevices"
 	"github.com/moby/buildkit/util/network"
 	rootlessmountopts "github.com/moby/buildkit/util/rootless/mountopts"
+	"github.com/moby/buildkit/util/system"
 	traceexec "github.com/moby/buildkit/util/tracing/exec"
 	"github.com/moby/sys/userns"
 	specs "github.com/opencontainers/runtime-spec/specs-go"
@@ -210,8 +211,8 @@ func GenerateSpec(ctx context.Context, meta executor.Meta, mounts []executor.Mou
 				return nil, nil, err
 			}
 			s.Mounts = append(s.Mounts, specs.Mount{
-				Destination: m.Dest,
-				Type:        mount.Type,
+				Destination: system.GetAbsolutePath(m.Dest),
+				Type:        normalizeMountType(mount.Type),
 				Source:      mount.Source,
 				Options:     mount.Options,
 			})
@@ -251,7 +252,8 @@ type submounts struct {
 }
 
 func (s *submounts) subMount(m mount.Mount, subPath string) (mount.Mount, error) {
-	if path.Join("/", subPath) == "/" {
+	// for Windows, always go through the sub-mounting process
+	if path.Join("/", subPath) == "/" && runtime.GOOS != "windows" {
 		return m, nil
 	}
 	if s.m == nil {
diff --git a/executor/oci/spec_unix.go b/executor/oci/spec_unix.go
new file mode 100644
index 000000000..629b2df77
--- /dev/null
+++ b/executor/oci/spec_unix.go
@@ -0,0 +1,8 @@
+//go:build !windows
+
+package oci
+
+// no effect for non-Windows
+func normalizeMountType(mType string) string {
+	return mType
+}
diff --git a/executor/oci/spec_windows.go b/executor/oci/spec_windows.go
index f21b28ed8..bdd8757fb 100644
--- a/executor/oci/spec_windows.go
+++ b/executor/oci/spec_windows.go
@@ -119,3 +119,9 @@ func generateCDIOpts(_ *cdidevices.Manager, devices []*pb.CDIDevice) ([]oci.Spec
 	// https://github.com/cncf-tags/container-device-interface/issues/28
 	return nil, errors.New("no support for CDI on Windows")
 }
+
+func normalizeMountType(_ string) string {
+	// HCS shim doesn't expect a named type
+	// for the mount.
+	return ""
+}
diff --git a/frontend/dockerfile/dockerfile2llb/convert.go b/frontend/dockerfile/dockerfile2llb/convert.go
index f44866839..fe98b708b 100644
--- a/frontend/dockerfile/dockerfile2llb/convert.go
+++ b/frontend/dockerfile/dockerfile2llb/convert.go
@@ -815,6 +815,7 @@ func toDispatchState(ctx context.Context, dt []byte, opt ConvertOpt) (*dispatchS
 			target.image.OSFeatures = append([]string{}, platformOpt.targetPlatform.OSFeatures...)
 		}
 	}
+	target.image.Platform = platforms.Normalize(target.image.Platform)
 
 	return target, nil
 }
@@ -1599,7 +1600,7 @@ func dispatchCopy(d *dispatchState, cfg copyConfig) error {
 		commitMessage.WriteString(" <<" + src.Path)
 
 		data := src.Data
-		f, err := system.CheckSystemDriveAndRemoveDriveLetter(src.Path, d.platform.OS)
+		f, err := system.CheckSystemDriveAndRemoveDriveLetter(src.Path, d.platform.OS, false)
 		if err != nil {
 			return errors.Wrap(err, "removing drive letter")
 		}
@@ -1867,7 +1868,7 @@ func pathRelativeToWorkingDir(s llb.State, p string, platform ocispecs.Platform)
 		return "", err
 	}
 
-	p, err = system.CheckSystemDriveAndRemoveDriveLetter(p, platform.OS)
+	p, err = system.CheckSystemDriveAndRemoveDriveLetter(p, platform.OS, true)
 	if err != nil {
 		return "", errors.Wrap(err, "removing drive letter")
 	}
diff --git a/frontend/dockerfile/dockerfile2llb/convert_runmount.go b/frontend/dockerfile/dockerfile2llb/convert_runmount.go
index 1044ec360..964fb4b3e 100644
--- a/frontend/dockerfile/dockerfile2llb/convert_runmount.go
+++ b/frontend/dockerfile/dockerfile2llb/convert_runmount.go
@@ -9,6 +9,7 @@ import (
 	"github.com/moby/buildkit/client/llb"
 	"github.com/moby/buildkit/frontend/dockerfile/instructions"
 	"github.com/moby/buildkit/solver/pb"
+	"github.com/moby/buildkit/util/system"
 	"github.com/pkg/errors"
 )
 
@@ -118,7 +119,7 @@ func dispatchRunMounts(d *dispatchState, c *instructions.RunCommand, sources []*
 			mountOpts = append(mountOpts, llb.AsPersistentCacheDir(opt.cacheIDNamespace+"/"+mount.CacheID, sharing))
 		}
 		target := mount.Target
-		if !filepath.IsAbs(filepath.Clean(mount.Target)) {
+		if !system.IsAbsolutePath(filepath.Clean(mount.Target)) {
 			dir, err := d.state.GetDir(context.TODO())
 			if err != nil {
 				return nil, err
diff --git a/frontend/dockerfile/parser/parser.go b/frontend/dockerfile/parser/parser.go
index 1b0a96228..f1667a108 100644
--- a/frontend/dockerfile/parser/parser.go
+++ b/frontend/dockerfile/parser/parser.go
@@ -220,7 +220,7 @@ func init() {
 // based on the command and command arguments. A Node is created from the
 // result of the dispatch.
 func newNodeFromLine(line string, d *directives, comments []string) (*Node, error) {
-	cmd, flags, args, err := splitCommand(line)
+	cmd, flags, args, err := splitCommand(line, d)
 	if err != nil {
 		return nil, err
 	}
diff --git a/frontend/dockerfile/parser/split_command.go b/frontend/dockerfile/parser/split_command.go
index d1c87522e..87b73f24f 100644
--- a/frontend/dockerfile/parser/split_command.go
+++ b/frontend/dockerfile/parser/split_command.go
@@ -7,7 +7,7 @@ import (
 
 // splitCommand takes a single line of text and parses out the cmd and args,
 // which are used for dispatching to more exact parsing functions.
-func splitCommand(line string) (string, []string, string, error) {
+func splitCommand(line string, d *directives) (string, []string, string, error) {
 	var args string
 	var flags []string
 
@@ -16,7 +16,7 @@ func splitCommand(line string) (string, []string, string, error) {
 
 	if len(cmdline) == 2 {
 		var err error
-		args, flags, err = extractBuilderFlags(cmdline[1])
+		args, flags, err = extractBuilderFlags(cmdline[1], d)
 		if err != nil {
 			return "", nil, "", err
 		}
@@ -25,7 +25,7 @@ func splitCommand(line string) (string, []string, string, error) {
 	return cmdline[0], flags, strings.TrimSpace(args), nil
 }
 
-func extractBuilderFlags(line string) (string, []string, error) {
+func extractBuilderFlags(line string, d *directives) (string, []string, error) {
 	// Parses the BuilderFlags and returns the remaining part of the line
 
 	const (
@@ -87,7 +87,7 @@ func extractBuilderFlags(line string) (string, []string, error) {
 				phase = inQuote
 				continue
 			}
-			if ch == '\\' {
+			if ch == d.escapeToken {
 				if pos+1 == len(line) {
 					continue // just skip \ at end
 				}
@@ -104,7 +104,7 @@ func extractBuilderFlags(line string) (string, []string, error) {
 				phase = inWord
 				continue
 			}
-			if ch == '\\' {
+			if ch == d.escapeToken {
 				if pos+1 == len(line) {
 					phase = inWord
 					continue // just skip \ at end
diff --git a/go.mod b/go.mod
index fe5a805c6..ec74228ee 100644
--- a/go.mod
+++ b/go.mod
@@ -72,8 +72,8 @@ require (
 	github.com/spdx/tools-golang v0.5.3
 	github.com/stretchr/testify v1.10.0
 	github.com/tonistiigi/dchapes-mode v0.0.0-20241001053921-ca0759fec205
-	github.com/tonistiigi/fsutil v0.0.0-20250113203817-b14e27f4135a
-	github.com/tonistiigi/go-actions-cache v0.0.0-20250219102945-1a5174abd055
+	github.com/tonistiigi/fsutil v0.0.0-20250227023350-13604323a291
+	github.com/tonistiigi/go-actions-cache v0.0.0-20250228231703-3e9a6642607f
 	github.com/tonistiigi/go-archvariant v1.0.0
 	github.com/tonistiigi/go-csvvalue v0.0.0-20240710180619-ddb21b71c0b4
 	github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea
@@ -108,7 +108,7 @@ require (
 	google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1
 	google.golang.org/protobuf v1.35.2
 	kernel.org/pub/linux/libs/security/libcap/cap v1.2.73
-	tags.cncf.io/container-device-interface v0.8.0
+	tags.cncf.io/container-device-interface v0.8.1
 )
 
 require (
@@ -162,7 +162,6 @@ require (
 	github.com/kylelemons/godebug v1.1.0 // indirect
 	github.com/moby/sys/mount v0.3.4 // indirect
 	github.com/moby/sys/sequential v0.6.0 // indirect
-	github.com/moby/term v0.5.2 // indirect
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626 // indirect
 	github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect
diff --git a/go.sum b/go.sum
index ce10e2f75..92b28ec1c 100644
--- a/go.sum
+++ b/go.sum
@@ -15,8 +15,6 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0
 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc=
 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0 h1:mlmW46Q0B79I+Aj4azKC6xDMFN9a9SyZWESlGWYXbFs=
 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0/go.mod h1:PXe2h+LKcWTX9afWdZoHyODqR4fBa5boUM/8uJfZ0Jo=
-github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=
-github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
 github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM=
 github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
 github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 h1:kYRSnvJju5gYVyhkij+RTJ/VR6QIUaCfWeaFm2ycsjQ=
@@ -294,8 +292,6 @@ github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo=
 github.com/moby/sys/user v0.3.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs=
 github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
 github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
-github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
-github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
@@ -399,10 +395,10 @@ github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtse
 github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 github.com/tonistiigi/dchapes-mode v0.0.0-20241001053921-ca0759fec205 h1:eUk79E1w8yMtXeHSzjKorxuC8qJOnyXQnLaJehxpJaI=
 github.com/tonistiigi/dchapes-mode v0.0.0-20241001053921-ca0759fec205/go.mod h1:3Iuxbr0P7D3zUzBMAZB+ois3h/et0shEz0qApgHYGpY=
-github.com/tonistiigi/fsutil v0.0.0-20250113203817-b14e27f4135a h1:EfGw4G0x/8qXWgtcZ6KVaPS+wpWOQMaypczzP8ojkMY=
-github.com/tonistiigi/fsutil v0.0.0-20250113203817-b14e27f4135a/go.mod h1:Dl/9oEjK7IqnjAm21Okx/XIxUCFJzvh+XdVHUlBwXTw=
-github.com/tonistiigi/go-actions-cache v0.0.0-20250219102945-1a5174abd055 h1:ocuqZe/ImPTYgDocnHTDOTBachfQ9m0JxvP4uGeDtBE=
-github.com/tonistiigi/go-actions-cache v0.0.0-20250219102945-1a5174abd055/go.mod h1:h0oRlVs3NoFIHysRQ4rU1+RG4QmU0M2JVSwTYrB4igk=
+github.com/tonistiigi/fsutil v0.0.0-20250227023350-13604323a291 h1:1WRvmYdTkwjgFIlnOwo6Y15BMwQBUQT423y1zHad4Eo=
+github.com/tonistiigi/fsutil v0.0.0-20250227023350-13604323a291/go.mod h1:Dl/9oEjK7IqnjAm21Okx/XIxUCFJzvh+XdVHUlBwXTw=
+github.com/tonistiigi/go-actions-cache v0.0.0-20250228231703-3e9a6642607f h1:q/SWz3Bz0KtAsqaBo73CHVXjaz5O8PDnmD2JHVhgYnE=
+github.com/tonistiigi/go-actions-cache v0.0.0-20250228231703-3e9a6642607f/go.mod h1:h0oRlVs3NoFIHysRQ4rU1+RG4QmU0M2JVSwTYrB4igk=
 github.com/tonistiigi/go-archvariant v1.0.0 h1:5LC1eDWiBNflnTF1prCiX09yfNHIxDC/aukdhCdTyb0=
 github.com/tonistiigi/go-archvariant v1.0.0/go.mod h1:TxFmO5VS6vMq2kvs3ht04iPXtu2rUT/erOnGFYfk5Ho=
 github.com/tonistiigi/go-csvvalue v0.0.0-20240710180619-ddb21b71c0b4 h1:7I5c2Ig/5FgqkYOh/N87NzoyI9U15qUPXhDD8uCupv8=
@@ -594,7 +590,7 @@ kernel.org/pub/linux/libs/security/libcap/psx v1.2.73/go.mod h1:+l6Ee2F59XiJ2I6W
 sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
 sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
-tags.cncf.io/container-device-interface v0.8.0 h1:8bCFo/g9WODjWx3m6EYl3GfUG31eKJbaggyBDxEldRc=
-tags.cncf.io/container-device-interface v0.8.0/go.mod h1:Apb7N4VdILW0EVdEMRYXIDVRZfNJZ+kmEUss2kRRQ6Y=
+tags.cncf.io/container-device-interface v0.8.1 h1:c0jN4Mt6781jD67NdPajmZlD1qrqQyov/Xfoab37lj0=
+tags.cncf.io/container-device-interface v0.8.1/go.mod h1:Apb7N4VdILW0EVdEMRYXIDVRZfNJZ+kmEUss2kRRQ6Y=
 tags.cncf.io/container-device-interface/specs-go v0.8.0 h1:QYGFzGxvYK/ZLMrjhvY0RjpUavIn4KcmRmVP/JjdBTA=
 tags.cncf.io/container-device-interface/specs-go v0.8.0/go.mod h1:BhJIkjjPh4qpys+qm4DAYtUyryaTDg9zris+AczXyws=
diff --git a/hack/images b/hack/images
index ce35ee226..68341e050 100755
--- a/hack/images
+++ b/hack/images
@@ -10,7 +10,6 @@ set -eu -o pipefail
 : "${RELEASE=false}"
 : "${PLATFORMS=}"
 : "${TARGET=}"
-: "${BUILDKIT_DEBUG=}"
 
 versionTag=$(git describe --always --tags --match "v[0-9]*")
 
@@ -112,5 +111,5 @@ if [[ "$RELEASE" = "true" ]] && [[ "$GITHUB_ACTIONS" = "true" ]]; then
   nocacheFilterFlag="--no-cache-filter=buildkit-export,gobuild-base,rootless"
 fi
 
-buildxCmd build --build-arg "BUILDKIT_CONTEXT_KEEP_GIT_DIR=1" --build-arg BUILDKIT_DEBUG $platformFlag $targetFlag $importCacheFlags $exportCacheFlags $tagFlags $outputFlag $nocacheFilterFlag $attestFlags \
+buildxCmd build --build-arg "BUILDKIT_CONTEXT_KEEP_GIT_DIR=1" --build-arg BUILDKITD_TAGS --build-arg BUILDKIT_DEBUG --build-arg EXPORT_BASE $platformFlag $targetFlag $importCacheFlags $exportCacheFlags $tagFlags $outputFlag $nocacheFilterFlag $attestFlags \
   $currentcontext
diff --git a/session/upload/uploadprovider/provider.go b/session/upload/uploadprovider/provider.go
index 2af434d80..96815302b 100644
--- a/session/upload/uploadprovider/provider.go
+++ b/session/upload/uploadprovider/provider.go
@@ -63,23 +63,20 @@ type writer struct {
 	grpc.ServerStream
 }
 
-func (w *writer) Write(dt []byte) (int, error) {
-	// avoid sending too big messages on grpc stream
+func (w *writer) Write(dt []byte) (n int, err error) {
 	const maxChunkSize = 3 * 1024 * 1024
-	if len(dt) > maxChunkSize {
-		n1, err := w.Write(dt[:maxChunkSize])
-		if err != nil {
-			return n1, err
+	for len(dt) > 0 {
+		data := dt
+		if len(data) > maxChunkSize {
+			data = data[:maxChunkSize]
 		}
-		dt = dt[maxChunkSize:]
-		var n2 int
-		if n2, err := w.Write(dt); err != nil {
-			return n1 + n2, err
+
+		msg := &upload.BytesMessage{Data: data}
+		if err := w.SendMsg(msg); err != nil {
+			return n, err
 		}
-		return n1 + n2, nil
-	}
-	if err := w.SendMsg(&upload.BytesMessage{Data: dt}); err != nil {
-		return 0, err
+		n += len(data)
+		dt = dt[len(data):]
 	}
-	return len(dt), nil
+	return n, nil
 }
diff --git a/snapshot/containerd/content.go b/snapshot/containerd/content.go
index c50cc99ac..efbd9db6d 100644
--- a/snapshot/containerd/content.go
+++ b/snapshot/containerd/content.go
@@ -115,7 +115,20 @@ func (c *nsFallbackStore) Update(ctx context.Context, info content.Info, fieldpa
 }
 
 func (c *nsFallbackStore) Walk(ctx context.Context, fn content.WalkFunc, filters ...string) error {
-	return c.main.Walk(ctx, fn, filters...)
+	seen := make(map[digest.Digest]struct{})
+	err := c.main.Walk(ctx, func(i content.Info) error {
+		seen[i.Digest] = struct{}{}
+		return fn(i)
+	}, filters...)
+	if err != nil {
+		return err
+	}
+	return c.fb.Walk(ctx, func(i content.Info) error {
+		if _, ok := seen[i.Digest]; ok {
+			return nil
+		}
+		return fn(i)
+	}, filters...)
 }
 
 func (c *nsFallbackStore) Delete(ctx context.Context, dgst digest.Digest) error {
diff --git a/solver/llbsolver/file/backend.go b/solver/llbsolver/file/backend.go
index 465cfe67a..ad7ac8fd5 100644
--- a/solver/llbsolver/file/backend.go
+++ b/solver/llbsolver/file/backend.go
@@ -5,7 +5,6 @@ import (
 	"log"
 	"os"
 	"path/filepath"
-	"runtime"
 	"strings"
 	"time"
 
@@ -14,7 +13,6 @@ import (
 	"github.com/moby/buildkit/snapshot"
 	"github.com/moby/buildkit/solver/llbsolver/ops/fileoptypes"
 	"github.com/moby/buildkit/solver/pb"
-	"github.com/moby/buildkit/util/system"
 	"github.com/pkg/errors"
 	copy "github.com/tonistiigi/fsutil/copy"
 )
@@ -145,10 +143,7 @@ func rm(d string, action *pb.FileActionRm) (err error) {
 	}()
 
 	if action.AllowWildcard {
-		src, err := cleanPath(action.Path)
-		if err != nil {
-			return errors.Wrap(err, "cleaning path")
-		}
+		src := cleanPath(action.Path)
 		m, err := copy.ResolveWildcards(d, src, false)
 		if err != nil {
 			return errors.WithStack(err)
@@ -190,14 +185,9 @@ func rmPath(root, src string, allowNotFound bool) error {
 }
 
 func docopy(ctx context.Context, src, dest string, action *pb.FileActionCopy, u *copy.User, idmap *idtools.IdentityMapping) (err error) {
-	srcPath, err := cleanPath(action.Src)
-	if err != nil {
-		return errors.Wrap(err, "cleaning source path")
-	}
-	destPath, err := cleanPath(action.Dest)
-	if err != nil {
-		return errors.Wrap(err, "cleaning destination path")
-	}
+	srcPath := cleanPath(action.Src)
+	destPath := cleanPath(action.Dest)
+
 	if !action.CreateDestPath {
 		p, err := fs.RootPath(dest, filepath.Join("/", action.Dest))
 		if err != nil {
@@ -434,11 +424,7 @@ func (fb *Backend) readUserWrapper(owner *pb.ChownOpt, user, group fileoptypes.M
 	return u, nil
 }
 
-func cleanPath(s string) (string, error) {
-	s, err := system.CheckSystemDriveAndRemoveDriveLetter(s, runtime.GOOS)
-	if err != nil {
-		return "", errors.Wrap(err, "removing drive letter")
-	}
+func cleanPath(s string) string {
 	s = filepath.FromSlash(s)
 	s2 := filepath.Join("/", s)
 	if strings.HasSuffix(s, string(filepath.Separator)+".") {
@@ -449,5 +435,5 @@ func cleanPath(s string) (string, error) {
 	} else if strings.HasSuffix(s, string(filepath.Separator)) && s2 != string(filepath.Separator) {
 		s2 += string(filepath.Separator)
 	}
-	return s2, nil
+	return s2
 }
diff --git a/solver/pb/attr.go b/solver/pb/attr.go
index 85e7cce60..473ac05ef 100644
--- a/solver/pb/attr.go
+++ b/solver/pb/attr.go
@@ -20,6 +20,8 @@ const AttrHTTPFilename = "http.filename"
 const AttrHTTPPerm = "http.perm"
 const AttrHTTPUID = "http.uid"
 const AttrHTTPGID = "http.gid"
+const AttrHTTPAuthHeaderSecret = "http.authheadersecret"
+const AttrHTTPHeaderPrefix = "http.header."
 
 const AttrImageResolveMode = "image.resolvemode"
 const AttrImageResolveModeDefault = "default"
diff --git a/solver/pb/caps.go b/solver/pb/caps.go
index 173791e4d..16b546d78 100644
--- a/solver/pb/caps.go
+++ b/solver/pb/caps.go
@@ -31,9 +31,12 @@ const (
 	CapSourceGitSubdir        apicaps.CapID = "source.git.subdir"
 
 	CapSourceHTTP         apicaps.CapID = "source.http"
+	CapSourceHTTPAuth     apicaps.CapID = "source.http.auth"
 	CapSourceHTTPChecksum apicaps.CapID = "source.http.checksum"
 	CapSourceHTTPPerm     apicaps.CapID = "source.http.perm"
-	CapSourceHTTPUIDGID   apicaps.CapID = "soruce.http.uidgid"
+	// NOTE the historical typo
+	CapSourceHTTPUIDGID apicaps.CapID = "soruce.http.uidgid"
+	CapSourceHTTPHeader apicaps.CapID = "source.http.header"
 
 	CapSourceOCILayout apicaps.CapID = "source.ocilayout"
 
@@ -230,7 +233,7 @@ func init() {
 	})
 
 	Caps.Init(apicaps.Cap{
-		ID:      CapSourceOCILayout,
+		ID:      CapSourceHTTPAuth,
 		Enabled: true,
 		Status:  apicaps.CapStatusExperimental,
 	})
@@ -241,6 +244,18 @@ func init() {
 		Status:  apicaps.CapStatusExperimental,
 	})
 
+	Caps.Init(apicaps.Cap{
+		ID:      CapSourceHTTPHeader,
+		Enabled: true,
+		Status:  apicaps.CapStatusExperimental,
+	})
+
+	Caps.Init(apicaps.Cap{
+		ID:      CapSourceOCILayout,
+		Enabled: true,
+		Status:  apicaps.CapStatusExperimental,
+	})
+
 	Caps.Init(apicaps.Cap{
 		ID:      CapBuildOpLLBFileName,
 		Enabled: true,
diff --git a/source/http/identifier.go b/source/http/identifier.go
index 7e79a1812..e56c3fd30 100644
--- a/source/http/identifier.go
+++ b/source/http/identifier.go
@@ -18,13 +18,20 @@ func NewHTTPIdentifier(str string, tls bool) (*HTTPIdentifier, error) {
 }
 
 type HTTPIdentifier struct {
-	TLS      bool
-	URL      string
-	Checksum digest.Digest
-	Filename string
-	Perm     int
-	UID      int
-	GID      int
+	TLS              bool
+	URL              string
+	Checksum         digest.Digest
+	Filename         string
+	Perm             int
+	UID              int
+	GID              int
+	AuthHeaderSecret string
+	Header           []HeaderField
+}
+
+type HeaderField struct {
+	Name  string
+	Value string
 }
 
 var _ source.Identifier = (*HTTPIdentifier)(nil)
diff --git a/source/http/source.go b/source/http/source.go
index 8b4a417f4..130339fcc 100644
--- a/source/http/source.go
+++ b/source/http/source.go
@@ -2,6 +2,7 @@ package http
 
 import (
 	"bytes"
+	"cmp"
 	"context"
 	"crypto/sha256"
 	"encoding/json"
@@ -13,6 +14,7 @@ import (
 	"os"
 	"path"
 	"path/filepath"
+	"slices"
 	"strconv"
 	"strings"
 	"time"
@@ -20,6 +22,7 @@ import (
 	"github.com/docker/docker/pkg/idtools"
 	"github.com/moby/buildkit/cache"
 	"github.com/moby/buildkit/session"
+	"github.com/moby/buildkit/session/secrets"
 	"github.com/moby/buildkit/snapshot"
 	"github.com/moby/buildkit/solver"
 	"github.com/moby/buildkit/solver/pb"
@@ -32,6 +35,13 @@ import (
 	"github.com/pkg/errors"
 )
 
+// supportedUserHeaders defines supported user-defined header fields. Fields
+// not included here will be silently dropped.
+var supportedUserDefinedHeaders = map[string]bool{
+	http.CanonicalHeaderKey("accept"):     true,
+	http.CanonicalHeaderKey("user-agent"): true,
+}
+
 type Opt struct {
 	CacheAccessor cache.Accessor
 	Transport     http.RoundTripper
@@ -92,9 +102,24 @@ func (hs *httpSource) Identifier(scheme, ref string, attrs map[string]string, pl
 				return nil, err
 			}
 			id.GID = int(i)
+		case pb.AttrHTTPAuthHeaderSecret:
+			id.AuthHeaderSecret = v
+		default:
+			if name, found := strings.CutPrefix(k, pb.AttrHTTPHeaderPrefix); found {
+				name = http.CanonicalHeaderKey(name)
+				if supportedUserDefinedHeaders[name] {
+					id.Header = append(id.Header, HeaderField{Name: name, Value: v})
+				}
+			}
 		}
 	}
 
+	// Sort header fields to ensure consistent hashing (see urlHash() and
+	// formatCacheKey())
+	slices.SortFunc(id.Header, func(a, b HeaderField) int {
+		return cmp.Compare(a.Name, b.Name)
+	})
+
 	return id, nil
 }
 
@@ -127,16 +152,20 @@ func (hs *httpSourceHandler) client(g session.Group) *http.Client {
 // this package.
 func (hs *httpSourceHandler) urlHash() (digest.Digest, error) {
 	dt, err := json.Marshal(struct {
-		Filename       []byte
-		Perm, UID, GID int
+		Filename         []byte
+		Perm, UID, GID   int
+		AuthHeaderSecret string `json:",omitempty"`
+		Header           []HeaderField
 	}{
 		Filename: bytes.Join([][]byte{
 			[]byte(hs.src.URL),
 			[]byte(hs.src.Filename),
 		}, []byte{0}),
-		Perm: hs.src.Perm,
-		UID:  hs.src.UID,
-		GID:  hs.src.GID,
+		Perm:             hs.src.Perm,
+		UID:              hs.src.UID,
+		GID:              hs.src.GID,
+		AuthHeaderSecret: hs.src.AuthHeaderSecret,
+		Header:           hs.src.Header,
 	})
 	if err != nil {
 		return "", err
@@ -146,17 +175,21 @@ func (hs *httpSourceHandler) urlHash() (digest.Digest, error) {
 
 func (hs *httpSourceHandler) formatCacheKey(filename string, dgst digest.Digest, lastModTime string) digest.Digest {
 	dt, err := json.Marshal(struct {
-		Filename       string
-		Perm, UID, GID int
-		Checksum       digest.Digest
-		LastModTime    string `json:",omitempty"`
+		Filename         string
+		Perm, UID, GID   int
+		Checksum         digest.Digest
+		LastModTime      string        `json:",omitempty"`
+		AuthHeaderSecret string        `json:",omitempty"`
+		Header           []HeaderField `json:",omitempty"`
 	}{
-		Filename:    filename,
-		Perm:        hs.src.Perm,
-		UID:         hs.src.UID,
-		GID:         hs.src.GID,
-		Checksum:    dgst,
-		LastModTime: lastModTime,
+		Filename:         filename,
+		Perm:             hs.src.Perm,
+		UID:              hs.src.UID,
+		GID:              hs.src.GID,
+		Checksum:         dgst,
+		LastModTime:      lastModTime,
+		AuthHeaderSecret: hs.src.AuthHeaderSecret,
+		Header:           hs.src.Header,
 	})
 	if err != nil {
 		return dgst
@@ -181,12 +214,10 @@ func (hs *httpSourceHandler) CacheKey(ctx context.Context, g session.Group, inde
 		return "", "", nil, false, errors.Wrapf(err, "failed to search metadata for %s", uh)
 	}
 
-	req, err := http.NewRequest("GET", hs.src.URL, nil)
+	req, err := hs.newHTTPRequest(ctx, g)
 	if err != nil {
 		return "", "", nil, false, err
 	}
-	req = req.WithContext(ctx)
-	req.Header.Add("User-Agent", version.UserAgent())
 	m := map[string]cacheRefMetadata{}
 
 	// If we request a single ETag in 'If-None-Match', some servers omit the
@@ -214,7 +245,7 @@ func (hs *httpSourceHandler) CacheKey(ctx context.Context, g session.Group, inde
 			for t := range m {
 				etags = append(etags, t)
 			}
-			req.Header.Add("If-None-Match", strings.Join(etags, ", "))
+			req.Header.Set("If-None-Match", strings.Join(etags, ", "))
 
 			if len(etags) == 1 {
 				onlyETag = etags[0]
@@ -231,7 +262,7 @@ func (hs *httpSourceHandler) CacheKey(ctx context.Context, g session.Group, inde
 		req.Method = "HEAD"
 		// we need to add accept-encoding header manually because stdlib only adds it to GET requests
 		// some servers will return different etags if Accept-Encoding header is different
-		req.Header.Add("Accept-Encoding", "gzip")
+		req.Header.Set("Accept-Encoding", "gzip")
 		resp, err := client.Do(req)
 		if err == nil {
 			if resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusNotModified {
@@ -443,11 +474,10 @@ func (hs *httpSourceHandler) Snapshot(ctx context.Context, g session.Group) (cac
 		}
 	}
 
-	req, err := http.NewRequest("GET", hs.src.URL, nil)
+	req, err := hs.newHTTPRequest(ctx, g)
 	if err != nil {
 		return nil, err
 	}
-	req = req.WithContext(ctx)
 
 	client := hs.client(g)
 
@@ -471,6 +501,37 @@ func (hs *httpSourceHandler) Snapshot(ctx context.Context, g session.Group) (cac
 	return ref, nil
 }
 
+func (hs *httpSourceHandler) newHTTPRequest(ctx context.Context, g session.Group) (*http.Request, error) {
+	req, err := http.NewRequest("GET", hs.src.URL, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	req.Header.Set("User-Agent", version.UserAgent())
+	for _, field := range hs.src.Header {
+		req.Header.Set(field.Name, field.Value)
+	}
+
+	if hs.src.AuthHeaderSecret != "" {
+		err := hs.sm.Any(ctx, g, func(ctx context.Context, _ string, caller session.Caller) error {
+			dt, err := secrets.GetSecret(ctx, caller, hs.src.AuthHeaderSecret)
+			if err != nil {
+				return err
+			}
+
+			req.Header.Set("Authorization", string(dt))
+
+			return nil
+		})
+
+		if err != nil {
+			return nil, errors.Wrapf(err, "failed to retrieve HTTP auth secret %s", hs.src.AuthHeaderSecret)
+		}
+	}
+
+	return req.WithContext(ctx), nil
+}
+
 func getFileName(urlStr, manualFilename string, resp *http.Response) string {
 	if manualFilename != "" {
 		return manualFilename
diff --git a/util/system/path.go b/util/system/path.go
index 14f02b495..fdd410386 100644
--- a/util/system/path.go
+++ b/util/system/path.go
@@ -2,7 +2,6 @@ package system
 
 import (
 	"path"
-	"path/filepath"
 	"strings"
 
 	"github.com/pkg/errors"
@@ -46,7 +45,7 @@ func NormalizePath(parent, newPath, inputOS string, keepSlash bool) (string, err
 	}
 
 	var err error
-	parent, err = CheckSystemDriveAndRemoveDriveLetter(parent, inputOS)
+	parent, err = CheckSystemDriveAndRemoveDriveLetter(parent, inputOS, keepSlash)
 	if err != nil {
 		return "", errors.Wrap(err, "removing drive letter")
 	}
@@ -61,7 +60,7 @@ func NormalizePath(parent, newPath, inputOS string, keepSlash bool) (string, err
 		newPath = parent
 	}
 
-	newPath, err = CheckSystemDriveAndRemoveDriveLetter(newPath, inputOS)
+	newPath, err = CheckSystemDriveAndRemoveDriveLetter(newPath, inputOS, keepSlash)
 	if err != nil {
 		return "", errors.Wrap(err, "removing drive letter")
 	}
@@ -137,7 +136,7 @@ func IsAbs(pth, inputOS string) bool {
 	if inputOS == "" {
 		inputOS = "linux"
 	}
-	cleanedPath, err := CheckSystemDriveAndRemoveDriveLetter(pth, inputOS)
+	cleanedPath, err := CheckSystemDriveAndRemoveDriveLetter(pth, inputOS, false)
 	if err != nil {
 		return false
 	}
@@ -174,7 +173,7 @@ func IsAbs(pth, inputOS string) bool {
 // There is no sane way to support this without adding a lot of complexity
 // which I am not sure is worth it.
 // \\.\C$\a     --> Fail
-func CheckSystemDriveAndRemoveDriveLetter(path string, inputOS string) (string, error) {
+func CheckSystemDriveAndRemoveDriveLetter(path string, inputOS string, keepSlash bool) (string, error) {
 	if inputOS == "" {
 		inputOS = "linux"
 	}
@@ -193,9 +192,10 @@ func CheckSystemDriveAndRemoveDriveLetter(path string, inputOS string) (string,
 	}
 
 	parts := strings.SplitN(path, ":", 2)
+
 	// Path does not have a drive letter. Just return it.
 	if len(parts) < 2 {
-		return ToSlash(filepath.Clean(path), inputOS), nil
+		return ToSlash(cleanPath(path, inputOS, keepSlash), inputOS), nil
 	}
 
 	// We expect all paths to be in C:
@@ -220,5 +220,30 @@ func CheckSystemDriveAndRemoveDriveLetter(path string, inputOS string) (string,
 	//
 	// We must return the second element of the split path, as is, without attempting to convert
 	// it to an absolute path. We have no knowledge of the CWD; that is treated elsewhere.
-	return ToSlash(filepath.Clean(parts[1]), inputOS), nil
+	return ToSlash(cleanPath(parts[1], inputOS, keepSlash), inputOS), nil
+}
+
+// An adaptation of filepath.Clean to allow an option to
+// retain the trailing slash, on either of the platforms.
+// See https://github.com/moby/buildkit/issues/5249
+func cleanPath(origPath, inputOS string, keepSlash bool) string {
+	// so as to handle cases like \\a\\b\\..\\c\\
+	// on Linux, when inputOS is Windows
+	origPath = ToSlash(origPath, inputOS)
+
+	if !keepSlash {
+		return path.Clean(origPath)
+	}
+
+	cleanedPath := path.Clean(origPath)
+	// Windows supports both \\ and / as path separator.
+	hasTrailingSlash := strings.HasSuffix(origPath, "/")
+	if inputOS == "windows" {
+		hasTrailingSlash = hasTrailingSlash || strings.HasSuffix(origPath, "\\")
+	}
+
+	if len(cleanedPath) > 1 && hasTrailingSlash {
+		return cleanedPath + "/"
+	}
+	return cleanedPath
 }
diff --git a/util/system/path_unix.go b/util/system/path_unix.go
new file mode 100644
index 000000000..55391783f
--- /dev/null
+++ b/util/system/path_unix.go
@@ -0,0 +1,17 @@
+//go:build !windows
+
+package system
+
+import "path/filepath"
+
+// IsAbsolutePath is just a wrapper that calls filepath.IsAbs.
+// Has been added here just for symmetry with Windows.
+func IsAbsolutePath(path string) bool {
+	return filepath.IsAbs(path)
+}
+
+// GetAbsolutePath does nothing on non-Windows, just returns
+// the same path.
+func GetAbsolutePath(path string) string {
+	return path
+}
diff --git a/util/system/path_windows.go b/util/system/path_windows.go
new file mode 100644
index 000000000..726d1f2dd
--- /dev/null
+++ b/util/system/path_windows.go
@@ -0,0 +1,29 @@
+package system
+
+import (
+	"path/filepath"
+	"strings"
+)
+
+// DefaultSystemVolumeName is the default system volume label on Windows
+const DefaultSystemVolumeName = "C:"
+
+// IsAbsolutePath prepends the default system volume label
+// to the path that is presumed absolute, and then calls filepath.IsAbs
+func IsAbsolutePath(path string) bool {
+	path = filepath.Clean(path)
+	if strings.HasPrefix(path, "\\") {
+		path = DefaultSystemVolumeName + path
+	}
+	return filepath.IsAbs(path)
+}
+
+// GetAbsolutePath returns an absolute path rooted
+// to C:\\ on Windows.
+func GetAbsolutePath(path string) string {
+	path = filepath.Clean(path)
+	if len(path) >= 2 && strings.EqualFold(path[:2], DefaultSystemVolumeName) {
+		return path
+	}
+	return DefaultSystemVolumeName + path
+}
diff --git a/vendor/github.com/docker/docker/client/client_unix.go b/util/testutil/dockerd/client/client_unix.go
similarity index 78%
rename from vendor/github.com/docker/docker/client/client_unix.go
rename to util/testutil/dockerd/client/client_unix.go
index 9fe78ea43..e5b921b40 100644
--- a/vendor/github.com/docker/docker/client/client_unix.go
+++ b/util/testutil/dockerd/client/client_unix.go
@@ -1,6 +1,6 @@
 //go:build !windows
 
-package client // import "github.com/docker/docker/client"
+package client
 
 // DefaultDockerHost defines OS-specific default host if the DOCKER_HOST
 // (EnvOverrideHost) environment variable is unset or empty.
diff --git a/vendor/github.com/docker/docker/client/client_windows.go b/util/testutil/dockerd/client/client_windows.go
similarity index 76%
rename from vendor/github.com/docker/docker/client/client_windows.go
rename to util/testutil/dockerd/client/client_windows.go
index 56572d1a2..19b954b2f 100644
--- a/vendor/github.com/docker/docker/client/client_windows.go
+++ b/util/testutil/dockerd/client/client_windows.go
@@ -1,4 +1,4 @@
-package client // import "github.com/docker/docker/client"
+package client
 
 // DefaultDockerHost defines OS-specific default host if the DOCKER_HOST
 // (EnvOverrideHost) environment variable is unset or empty.
diff --git a/vendor/github.com/docker/docker/client/hijack.go b/util/testutil/dockerd/client/hijack.go
similarity index 67%
rename from vendor/github.com/docker/docker/client/hijack.go
rename to util/testutil/dockerd/client/hijack.go
index 839d4c5cd..36e5e4732 100644
--- a/vendor/github.com/docker/docker/client/hijack.go
+++ b/util/testutil/dockerd/client/hijack.go
@@ -1,45 +1,21 @@
-package client // import "github.com/docker/docker/client"
+package client
 
 import (
 	"bufio"
 	"context"
-	"fmt"
 	"net"
 	"net/http"
-	"net/url"
 	"time"
 
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/versions"
 	"github.com/pkg/errors"
-	"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
 )
 
-// postHijacked sends a POST request and hijacks the connection.
-func (cli *Client) postHijacked(ctx context.Context, path string, query url.Values, body interface{}, headers map[string][]string) (types.HijackedResponse, error) {
-	bodyEncoded, err := encodeData(body)
-	if err != nil {
-		return types.HijackedResponse{}, err
-	}
-	req, err := cli.buildRequest(ctx, http.MethodPost, cli.getAPIPath(ctx, path, query), bodyEncoded, headers)
-	if err != nil {
-		return types.HijackedResponse{}, err
-	}
-	conn, mediaType, err := cli.setupHijackConn(req, "tcp")
-	if err != nil {
-		return types.HijackedResponse{}, err
-	}
-
-	return types.NewHijackedResponse(conn, mediaType), err
-}
-
 // DialHijack returns a hijacked connection with negotiated protocol proto.
 func (cli *Client) DialHijack(ctx context.Context, url, proto string, meta map[string][]string) (net.Conn, error) {
 	req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, nil)
 	if err != nil {
 		return nil, err
 	}
-	req = cli.addHeaders(req, meta)
 
 	conn, _, err := cli.setupHijackConn(req, proto)
 	return conn, err
@@ -74,20 +50,20 @@ func (cli *Client) setupHijackConn(req *http.Request, proto string) (_ net.Conn,
 	hc := &hijackedConn{conn, bufio.NewReader(conn)}
 
 	// Server hijacks the connection, error 'connection closed' expected
-	resp, err := otelhttp.NewTransport(hc).RoundTrip(req)
+	resp, err := hc.RoundTrip(req)
 	if err != nil {
 		return nil, "", err
 	}
 	if resp.StatusCode != http.StatusSwitchingProtocols {
 		_ = resp.Body.Close()
-		return nil, "", fmt.Errorf("unable to upgrade to %s, received %d", proto, resp.StatusCode)
+		return nil, "", errors.Errorf("unable to upgrade to %s, received %d", proto, resp.StatusCode)
 	}
 
 	if hc.r.Buffered() > 0 {
 		// If there is buffered content, wrap the connection.  We return an
 		// object that implements CloseWrite if the underlying connection
 		// implements it.
-		if _, ok := hc.Conn.(types.CloseWriter); ok {
+		if _, ok := hc.Conn.(CloseWriter); ok {
 			conn = &hijackedConnCloseWriter{hc}
 		} else {
 			conn = hc
@@ -96,15 +72,16 @@ func (cli *Client) setupHijackConn(req *http.Request, proto string) (_ net.Conn,
 		hc.r.Reset(nil)
 	}
 
-	var mediaType string
-	if versions.GreaterThanOrEqualTo(cli.ClientVersion(), "1.42") {
-		// Prior to 1.42, Content-Type is always set to raw-stream and not relevant
-		mediaType = resp.Header.Get("Content-Type")
-	}
-
+	mediaType := resp.Header.Get("Content-Type")
 	return conn, mediaType, nil
 }
 
+// CloseWriter is an interface that implements structs
+// that close input streams to prevent from writing.
+type CloseWriter interface {
+	CloseWrite() error
+}
+
 // hijackedConn wraps a net.Conn and is returned by setupHijackConn in the case
 // that a) there was already buffered data in the http layer when Hijack() was
 // called, and b) the underlying net.Conn does *not* implement CloseWrite().
@@ -133,9 +110,9 @@ type hijackedConnCloseWriter struct {
 	*hijackedConn
 }
 
-var _ types.CloseWriter = &hijackedConnCloseWriter{}
+var _ CloseWriter = &hijackedConnCloseWriter{}
 
 func (c *hijackedConnCloseWriter) CloseWrite() error {
-	conn := c.Conn.(types.CloseWriter)
+	conn := c.Conn.(CloseWriter)
 	return conn.CloseWrite()
 }
diff --git a/vendor/github.com/docker/go-connections/sockets/sockets.go b/util/testutil/dockerd/client/sockets.go
similarity index 64%
rename from vendor/github.com/docker/go-connections/sockets/sockets.go
rename to util/testutil/dockerd/client/sockets.go
index b0eae239d..d3aeb5bfc 100644
--- a/vendor/github.com/docker/go-connections/sockets/sockets.go
+++ b/util/testutil/dockerd/client/sockets.go
@@ -1,8 +1,6 @@
-// Package sockets provides helper functions to create and configure Unix or TCP sockets.
-package sockets
+package client
 
 import (
-	"errors"
 	"net"
 	"net/http"
 	"time"
@@ -10,17 +8,14 @@ import (
 
 const defaultTimeout = 10 * time.Second
 
-// ErrProtocolNotAvailable is returned when a given transport protocol is not provided by the operating system.
-var ErrProtocolNotAvailable = errors.New("protocol not available")
-
-// ConfigureTransport configures the specified [http.Transport] according to the specified proto
+// configureTransport configures the specified [http.Transport] according to the specified proto
 // and addr.
 //
 // If the proto is unix (using a unix socket to communicate) or npipe the compression is disabled.
 // For other protos, compression is enabled. If you want to manually enable/disable compression,
 // make sure you do it _after_ any subsequent calls to ConfigureTransport is made against the same
 // [http.Transport].
-func ConfigureTransport(tr *http.Transport, proto, addr string) error {
+func configureTransport(tr *http.Transport, proto, addr string) error {
 	switch proto {
 	case "unix":
 		return configureUnixTransport(tr, proto, addr)
diff --git a/vendor/github.com/docker/go-connections/sockets/sockets_unix.go b/util/testutil/dockerd/client/sockets_unix.go
similarity index 76%
rename from vendor/github.com/docker/go-connections/sockets/sockets_unix.go
rename to util/testutil/dockerd/client/sockets_unix.go
index 78a34a980..04cd0022e 100644
--- a/vendor/github.com/docker/go-connections/sockets/sockets_unix.go
+++ b/util/testutil/dockerd/client/sockets_unix.go
@@ -1,21 +1,22 @@
 //go:build !windows
 
-package sockets
+package client
 
 import (
 	"context"
-	"fmt"
 	"net"
 	"net/http"
 	"syscall"
 	"time"
+
+	"github.com/pkg/errors"
 )
 
 const maxUnixSocketPathSize = len(syscall.RawSockaddrUnix{}.Path)
 
 func configureUnixTransport(tr *http.Transport, proto, addr string) error {
 	if len(addr) > maxUnixSocketPathSize {
-		return fmt.Errorf("unix socket path %q is too long", addr)
+		return errors.Errorf("unix socket path %q is too long", addr)
 	}
 	// No need for compression in local communications.
 	tr.DisableCompression = true
@@ -28,8 +29,8 @@ func configureUnixTransport(tr *http.Transport, proto, addr string) error {
 	return nil
 }
 
-func configureNpipeTransport(tr *http.Transport, proto, addr string) error {
-	return ErrProtocolNotAvailable
+func configureNpipeTransport(_ *http.Transport, _, _ string) error {
+	return errors.New("protocol not available")
 }
 
 // DialPipe connects to a Windows named pipe.
diff --git a/vendor/github.com/docker/go-connections/sockets/sockets_windows.go b/util/testutil/dockerd/client/sockets_windows.go
similarity index 67%
rename from vendor/github.com/docker/go-connections/sockets/sockets_windows.go
rename to util/testutil/dockerd/client/sockets_windows.go
index 7acafc5a2..111e3e23f 100644
--- a/vendor/github.com/docker/go-connections/sockets/sockets_windows.go
+++ b/util/testutil/dockerd/client/sockets_windows.go
@@ -1,4 +1,4 @@
-package sockets
+package client
 
 import (
 	"context"
@@ -7,13 +7,14 @@ import (
 	"time"
 
 	"github.com/Microsoft/go-winio"
+	"github.com/pkg/errors"
 )
 
-func configureUnixTransport(tr *http.Transport, proto, addr string) error {
-	return ErrProtocolNotAvailable
+func configureUnixTransport(_ *http.Transport, _, _ string) error {
+	return errors.New("protocol not available")
 }
 
-func configureNpipeTransport(tr *http.Transport, proto, addr string) error {
+func configureNpipeTransport(tr *http.Transport, _, addr string) error {
 	// No need for compression in local communications.
 	tr.DisableCompression = true
 	tr.DialContext = func(ctx context.Context, _, _ string) (net.Conn, error) {
diff --git a/vendor/github.com/docker/docker/api/README.md b/vendor/github.com/docker/docker/api/README.md
deleted file mode 100644
index 381f19881..000000000
--- a/vendor/github.com/docker/docker/api/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Working on the Engine API
-
-The Engine API is an HTTP API used by the command-line client to communicate with the daemon. It can also be used by third-party software to control the daemon.
-
-It consists of various components in this repository:
-
-- `api/swagger.yaml` A Swagger definition of the API.
-- `api/types/` Types shared by both the client and server, representing various objects, options, responses, etc. Most are written manually, but some are automatically generated from the Swagger definition. See [#27919](https://github.com/docker/docker/issues/27919) for progress on this.
-- `cli/` The command-line client.
-- `client/` The Go client used by the command-line client. It can also be used by third-party Go programs.
-- `daemon/` The daemon, which serves the API.
-
-## Swagger definition
-
-The API is defined by the [Swagger](http://swagger.io/specification/) definition in `api/swagger.yaml`. This definition can be used to:
-
-1. Automatically generate documentation.
-2. Automatically generate the Go server and client. (A work-in-progress.)
-3. Provide a machine readable version of the API for introspecting what it can do, automatically generating clients for other languages, etc.
-
-## Updating the API documentation
-
-The API documentation is generated entirely from `api/swagger.yaml`. If you make updates to the API, edit this file to represent the change in the documentation.
-
-The file is split into two main sections:
-
-- `definitions`, which defines re-usable objects used in requests and responses
-- `paths`, which defines the API endpoints (and some inline objects which don't need to be reusable)
-
-To make an edit, first look for the endpoint you want to edit under `paths`, then make the required edits. Endpoints may reference reusable objects with `$ref`, which can be found in the `definitions` section.
-
-There is hopefully enough example material in the file for you to copy a similar pattern from elsewhere in the file (e.g. adding new fields or endpoints), but for the full reference, see the [Swagger specification](https://github.com/docker/docker/issues/27919).
-
-`swagger.yaml` is validated by `hack/validate/swagger` to ensure it is a valid Swagger definition. This is useful when making edits to ensure you are doing the right thing.
-
-## Viewing the API documentation
-
-When you make edits to `swagger.yaml`, you may want to check the generated API documentation to ensure it renders correctly.
-
-Run `make swagger-docs` and a preview will be running at `http://localhost:9000`. Some of the styling may be incorrect, but you'll be able to ensure that it is generating the correct documentation.
-
-The production documentation is generated by vendoring `swagger.yaml` into [docker/docker.github.io](https://github.com/docker/docker.github.io).
diff --git a/vendor/github.com/docker/docker/api/common.go b/vendor/github.com/docker/docker/api/common.go
deleted file mode 100644
index 93d64cd8d..000000000
--- a/vendor/github.com/docker/docker/api/common.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package api // import "github.com/docker/docker/api"
-
-// Common constants for daemon and client.
-const (
-	// DefaultVersion of the current REST API.
-	DefaultVersion = "1.47"
-
-	// MinSupportedAPIVersion is the minimum API version that can be supported
-	// by the API server, specified as "major.minor". Note that the daemon
-	// may be configured with a different minimum API version, as returned
-	// in [github.com/docker/docker/api/types.Version.MinAPIVersion].
-	//
-	// API requests for API versions lower than the configured version produce
-	// an error.
-	MinSupportedAPIVersion = "1.24"
-
-	// NoBaseImageSpecifier is the symbol used by the FROM
-	// command to specify that no base image is to be used.
-	NoBaseImageSpecifier = "scratch"
-)
diff --git a/vendor/github.com/docker/docker/api/swagger-gen.yaml b/vendor/github.com/docker/docker/api/swagger-gen.yaml
deleted file mode 100644
index f07a02737..000000000
--- a/vendor/github.com/docker/docker/api/swagger-gen.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-layout:
-  models:
-    - name: definition
-      source: asset:model
-      target: "{{ joinFilePath .Target .ModelPackage }}"
-      file_name: "{{ (snakize (pascalize .Name)) }}.go"
-  operations:
-    - name: handler
-      source: asset:serverOperation
-      target: "{{ joinFilePath .Target .APIPackage .Package }}"
-      file_name: "{{ (snakize (pascalize .Name)) }}.go"
diff --git a/vendor/github.com/docker/docker/api/swagger.yaml b/vendor/github.com/docker/docker/api/swagger.yaml
deleted file mode 100644
index 142bb038a..000000000
--- a/vendor/github.com/docker/docker/api/swagger.yaml
+++ /dev/null
@@ -1,12927 +0,0 @@
-# A Swagger 2.0 (a.k.a. OpenAPI) definition of the Engine API.
-#
-# This is used for generating API documentation and the types used by the
-# client/server. See api/README.md for more information.
-#
-# Some style notes:
-# - This file is used by ReDoc, which allows GitHub Flavored Markdown in
-#   descriptions.
-# - There is no maximum line length, for ease of editing and pretty diffs.
-# - operationIds are in the format "NounVerb", with a singular noun.
-
-swagger: "2.0"
-schemes:
-  - "http"
-  - "https"
-produces:
-  - "application/json"
-  - "text/plain"
-consumes:
-  - "application/json"
-  - "text/plain"
-basePath: "/v1.47"
-info:
-  title: "Docker Engine API"
-  version: "1.47"
-  x-logo:
-    url: "https://docs.docker.com/assets/images/logo-docker-main.png"
-  description: |
-    The Engine API is an HTTP API served by Docker Engine. It is the API the
-    Docker client uses to communicate with the Engine, so everything the Docker
-    client can do can be done with the API.
-
-    Most of the client's commands map directly to API endpoints (e.g. `docker ps`
-    is `GET /containers/json`). The notable exception is running containers,
-    which consists of several API calls.
-
-    # Errors
-
-    The API uses standard HTTP status codes to indicate the success or failure
-    of the API call. The body of the response will be JSON in the following
-    format:
-
-    ```
-    {
-      "message": "page not found"
-    }
-    ```
-
-    # Versioning
-
-    The API is usually changed in each release, so API calls are versioned to
-    ensure that clients don't break. To lock to a specific version of the API,
-    you prefix the URL with its version, for example, call `/v1.30/info` to use
-    the v1.30 version of the `/info` endpoint. If the API version specified in
-    the URL is not supported by the daemon, a HTTP `400 Bad Request` error message
-    is returned.
-
-    If you omit the version-prefix, the current version of the API (v1.47) is used.
-    For example, calling `/info` is the same as calling `/v1.47/info`. Using the
-    API without a version-prefix is deprecated and will be removed in a future release.
-
-    Engine releases in the near future should support this version of the API,
-    so your client will continue to work even if it is talking to a newer Engine.
-
-    The API uses an open schema model, which means server may add extra properties
-    to responses. Likewise, the server will ignore any extra query parameters and
-    request body properties. When you write clients, you need to ignore additional
-    properties in responses to ensure they do not break when talking to newer
-    daemons.
-
-
-    # Authentication
-
-    Authentication for registries is handled client side. The client has to send
-    authentication details to various endpoints that need to communicate with
-    registries, such as `POST /images/(name)/push`. These are sent as
-    `X-Registry-Auth` header as a [base64url encoded](https://tools.ietf.org/html/rfc4648#section-5)
-    (JSON) string with the following structure:
-
-    ```
-    {
-      "username": "string",
-      "password": "string",
-      "email": "string",
-      "serveraddress": "string"
-    }
-    ```
-
-    The `serveraddress` is a domain/IP without a protocol. Throughout this
-    structure, double quotes are required.
-
-    If you have already got an identity token from the [`/auth` endpoint](#operation/SystemAuth),
-    you can just pass this instead of credentials:
-
-    ```
-    {
-      "identitytoken": "9cbaf023786cd7..."
-    }
-    ```
-
-# The tags on paths define the menu sections in the ReDoc documentation, so
-# the usage of tags must make sense for that:
-# - They should be singular, not plural.
-# - There should not be too many tags, or the menu becomes unwieldy. For
-#   example, it is preferable to add a path to the "System" tag instead of
-#   creating a tag with a single path in it.
-# - The order of tags in this list defines the order in the menu.
-tags:
-  # Primary objects
-  - name: "Container"
-    x-displayName: "Containers"
-    description: |
-      Create and manage containers.
-  - name: "Image"
-    x-displayName: "Images"
-  - name: "Network"
-    x-displayName: "Networks"
-    description: |
-      Networks are user-defined networks that containers can be attached to.
-      See the [networking documentation](https://docs.docker.com/network/)
-      for more information.
-  - name: "Volume"
-    x-displayName: "Volumes"
-    description: |
-      Create and manage persistent storage that can be attached to containers.
-  - name: "Exec"
-    x-displayName: "Exec"
-    description: |
-      Run new commands inside running containers. Refer to the
-      [command-line reference](https://docs.docker.com/engine/reference/commandline/exec/)
-      for more information.
-
-      To exec a command in a container, you first need to create an exec instance,
-      then start it. These two API endpoints are wrapped up in a single command-line
-      command, `docker exec`.
-
-  # Swarm things
-  - name: "Swarm"
-    x-displayName: "Swarm"
-    description: |
-      Engines can be clustered together in a swarm. Refer to the
-      [swarm mode documentation](https://docs.docker.com/engine/swarm/)
-      for more information.
-  - name: "Node"
-    x-displayName: "Nodes"
-    description: |
-      Nodes are instances of the Engine participating in a swarm. Swarm mode
-      must be enabled for these endpoints to work.
-  - name: "Service"
-    x-displayName: "Services"
-    description: |
-      Services are the definitions of tasks to run on a swarm. Swarm mode must
-      be enabled for these endpoints to work.
-  - name: "Task"
-    x-displayName: "Tasks"
-    description: |
-      A task is a container running on a swarm. It is the atomic scheduling unit
-      of swarm. Swarm mode must be enabled for these endpoints to work.
-  - name: "Secret"
-    x-displayName: "Secrets"
-    description: |
-      Secrets are sensitive data that can be used by services. Swarm mode must
-      be enabled for these endpoints to work.
-  - name: "Config"
-    x-displayName: "Configs"
-    description: |
-      Configs are application configurations that can be used by services. Swarm
-      mode must be enabled for these endpoints to work.
-  # System things
-  - name: "Plugin"
-    x-displayName: "Plugins"
-  - name: "System"
-    x-displayName: "System"
-
-definitions:
-  Port:
-    type: "object"
-    description: "An open port on a container"
-    required: [PrivatePort, Type]
-    properties:
-      IP:
-        type: "string"
-        format: "ip-address"
-        description: "Host IP address that the container's port is mapped to"
-      PrivatePort:
-        type: "integer"
-        format: "uint16"
-        x-nullable: false
-        description: "Port on the container"
-      PublicPort:
-        type: "integer"
-        format: "uint16"
-        description: "Port exposed on the host"
-      Type:
-        type: "string"
-        x-nullable: false
-        enum: ["tcp", "udp", "sctp"]
-    example:
-      PrivatePort: 8080
-      PublicPort: 80
-      Type: "tcp"
-
-  MountPoint:
-    type: "object"
-    description: |
-      MountPoint represents a mount point configuration inside the container.
-      This is used for reporting the mountpoints in use by a container.
-    properties:
-      Type:
-        description: |
-          The mount type:
-
-          - `bind` a mount of a file or directory from the host into the container.
-          - `volume` a docker volume with the given `Name`.
-          - `tmpfs` a `tmpfs`.
-          - `npipe` a named pipe from the host into the container.
-          - `cluster` a Swarm cluster volume
-        type: "string"
-        enum:
-          - "bind"
-          - "volume"
-          - "tmpfs"
-          - "npipe"
-          - "cluster"
-        example: "volume"
-      Name:
-        description: |
-          Name is the name reference to the underlying data defined by `Source`
-          e.g., the volume name.
-        type: "string"
-        example: "myvolume"
-      Source:
-        description: |
-          Source location of the mount.
-
-          For volumes, this contains the storage location of the volume (within
-          `/var/lib/docker/volumes/`). For bind-mounts, and `npipe`, this contains
-          the source (host) part of the bind-mount. For `tmpfs` mount points, this
-          field is empty.
-        type: "string"
-        example: "/var/lib/docker/volumes/myvolume/_data"
-      Destination:
-        description: |
-          Destination is the path relative to the container root (`/`) where
-          the `Source` is mounted inside the container.
-        type: "string"
-        example: "/usr/share/nginx/html/"
-      Driver:
-        description: |
-          Driver is the volume driver used to create the volume (if it is a volume).
-        type: "string"
-        example: "local"
-      Mode:
-        description: |
-          Mode is a comma separated list of options supplied by the user when
-          creating the bind/volume mount.
-
-          The default is platform-specific (`"z"` on Linux, empty on Windows).
-        type: "string"
-        example: "z"
-      RW:
-        description: |
-          Whether the mount is mounted writable (read-write).
-        type: "boolean"
-        example: true
-      Propagation:
-        description: |
-          Propagation describes how mounts are propagated from the host into the
-          mount point, and vice-versa. Refer to the [Linux kernel documentation](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt)
-          for details. This field is not used on Windows.
-        type: "string"
-        example: ""
-
-  DeviceMapping:
-    type: "object"
-    description: "A device mapping between the host and container"
-    properties:
-      PathOnHost:
-        type: "string"
-      PathInContainer:
-        type: "string"
-      CgroupPermissions:
-        type: "string"
-    example:
-      PathOnHost: "/dev/deviceName"
-      PathInContainer: "/dev/deviceName"
-      CgroupPermissions: "mrw"
-
-  DeviceRequest:
-    type: "object"
-    description: "A request for devices to be sent to device drivers"
-    properties:
-      Driver:
-        type: "string"
-        example: "nvidia"
-      Count:
-        type: "integer"
-        example: -1
-      DeviceIDs:
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "0"
-          - "1"
-          - "GPU-fef8089b-4820-abfc-e83e-94318197576e"
-      Capabilities:
-        description: |
-          A list of capabilities; an OR list of AND lists of capabilities.
-        type: "array"
-        items:
-          type: "array"
-          items:
-            type: "string"
-        example:
-          # gpu AND nvidia AND compute
-          - ["gpu", "nvidia", "compute"]
-      Options:
-        description: |
-          Driver-specific options, specified as a key/value pairs. These options
-          are passed directly to the driver.
-        type: "object"
-        additionalProperties:
-          type: "string"
-
-  ThrottleDevice:
-    type: "object"
-    properties:
-      Path:
-        description: "Device path"
-        type: "string"
-      Rate:
-        description: "Rate"
-        type: "integer"
-        format: "int64"
-        minimum: 0
-
-  Mount:
-    type: "object"
-    properties:
-      Target:
-        description: "Container path."
-        type: "string"
-      Source:
-        description: "Mount source (e.g. a volume name, a host path)."
-        type: "string"
-      Type:
-        description: |
-          The mount type. Available types:
-
-          - `bind` Mounts a file or directory from the host into the container. Must exist prior to creating the container.
-          - `volume` Creates a volume with the given name and options (or uses a pre-existing volume with the same name and options). These are **not** removed when the container is removed.
-          - `tmpfs` Create a tmpfs with the given options. The mount source cannot be specified for tmpfs.
-          - `npipe` Mounts a named pipe from the host into the container. Must exist prior to creating the container.
-          - `cluster` a Swarm cluster volume
-        type: "string"
-        enum:
-          - "bind"
-          - "volume"
-          - "tmpfs"
-          - "npipe"
-          - "cluster"
-      ReadOnly:
-        description: "Whether the mount should be read-only."
-        type: "boolean"
-      Consistency:
-        description: "The consistency requirement for the mount: `default`, `consistent`, `cached`, or `delegated`."
-        type: "string"
-      BindOptions:
-        description: "Optional configuration for the `bind` type."
-        type: "object"
-        properties:
-          Propagation:
-            description: "A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`."
-            type: "string"
-            enum:
-              - "private"
-              - "rprivate"
-              - "shared"
-              - "rshared"
-              - "slave"
-              - "rslave"
-          NonRecursive:
-            description: "Disable recursive bind mount."
-            type: "boolean"
-            default: false
-          CreateMountpoint:
-            description: "Create mount point on host if missing"
-            type: "boolean"
-            default: false
-          ReadOnlyNonRecursive:
-            description: |
-               Make the mount non-recursively read-only, but still leave the mount recursive
-               (unless NonRecursive is set to `true` in conjunction).
-
-               Added in v1.44, before that version all read-only mounts were
-               non-recursive by default. To match the previous behaviour this
-               will default to `true` for clients on versions prior to v1.44.
-            type: "boolean"
-            default: false
-          ReadOnlyForceRecursive:
-            description: "Raise an error if the mount cannot be made recursively read-only."
-            type: "boolean"
-            default: false
-      VolumeOptions:
-        description: "Optional configuration for the `volume` type."
-        type: "object"
-        properties:
-          NoCopy:
-            description: "Populate volume with data from the target."
-            type: "boolean"
-            default: false
-          Labels:
-            description: "User-defined key/value metadata."
-            type: "object"
-            additionalProperties:
-              type: "string"
-          DriverConfig:
-            description: "Map of driver specific options"
-            type: "object"
-            properties:
-              Name:
-                description: "Name of the driver to use to create the volume."
-                type: "string"
-              Options:
-                description: "key/value map of driver specific options."
-                type: "object"
-                additionalProperties:
-                  type: "string"
-          Subpath:
-            description: "Source path inside the volume. Must be relative without any back traversals."
-            type: "string"
-            example: "dir-inside-volume/subdirectory"
-      TmpfsOptions:
-        description: "Optional configuration for the `tmpfs` type."
-        type: "object"
-        properties:
-          SizeBytes:
-            description: "The size for the tmpfs mount in bytes."
-            type: "integer"
-            format: "int64"
-          Mode:
-            description: "The permission mode for the tmpfs mount in an integer."
-            type: "integer"
-          Options:
-            description: |
-              The options to be passed to the tmpfs mount. An array of arrays.
-              Flag options should be provided as 1-length arrays. Other types
-              should be provided as as 2-length arrays, where the first item is
-              the key and the second the value.
-            type: "array"
-            items:
-              type: "array"
-              minItems: 1
-              maxItems: 2
-              items:
-                type: "string"
-            example:
-              [["noexec"]]
-
-  RestartPolicy:
-    description: |
-      The behavior to apply when the container exits. The default is not to
-      restart.
-
-      An ever increasing delay (double the previous delay, starting at 100ms) is
-      added before each restart to prevent flooding the server.
-    type: "object"
-    properties:
-      Name:
-        type: "string"
-        description: |
-          - Empty string means not to restart
-          - `no` Do not automatically restart
-          - `always` Always restart
-          - `unless-stopped` Restart always except when the user has manually stopped the container
-          - `on-failure` Restart only when the container exit code is non-zero
-        enum:
-          - ""
-          - "no"
-          - "always"
-          - "unless-stopped"
-          - "on-failure"
-      MaximumRetryCount:
-        type: "integer"
-        description: |
-          If `on-failure` is used, the number of times to retry before giving up.
-
-  Resources:
-    description: "A container's resources (cgroups config, ulimits, etc)"
-    type: "object"
-    properties:
-      # Applicable to all platforms
-      CpuShares:
-        description: |
-          An integer value representing this container's relative CPU weight
-          versus other containers.
-        type: "integer"
-      Memory:
-        description: "Memory limit in bytes."
-        type: "integer"
-        format: "int64"
-        default: 0
-      # Applicable to UNIX platforms
-      CgroupParent:
-        description: |
-          Path to `cgroups` under which the container's `cgroup` is created. If
-          the path is not absolute, the path is considered to be relative to the
-          `cgroups` path of the init process. Cgroups are created if they do not
-          already exist.
-        type: "string"
-      BlkioWeight:
-        description: "Block IO weight (relative weight)."
-        type: "integer"
-        minimum: 0
-        maximum: 1000
-      BlkioWeightDevice:
-        description: |
-          Block IO weight (relative device weight) in the form:
-
-          ```
-          [{"Path": "device_path", "Weight": weight}]
-          ```
-        type: "array"
-        items:
-          type: "object"
-          properties:
-            Path:
-              type: "string"
-            Weight:
-              type: "integer"
-              minimum: 0
-      BlkioDeviceReadBps:
-        description: |
-          Limit read rate (bytes per second) from a device, in the form:
-
-          ```
-          [{"Path": "device_path", "Rate": rate}]
-          ```
-        type: "array"
-        items:
-          $ref: "#/definitions/ThrottleDevice"
-      BlkioDeviceWriteBps:
-        description: |
-          Limit write rate (bytes per second) to a device, in the form:
-
-          ```
-          [{"Path": "device_path", "Rate": rate}]
-          ```
-        type: "array"
-        items:
-          $ref: "#/definitions/ThrottleDevice"
-      BlkioDeviceReadIOps:
-        description: |
-          Limit read rate (IO per second) from a device, in the form:
-
-          ```
-          [{"Path": "device_path", "Rate": rate}]
-          ```
-        type: "array"
-        items:
-          $ref: "#/definitions/ThrottleDevice"
-      BlkioDeviceWriteIOps:
-        description: |
-          Limit write rate (IO per second) to a device, in the form:
-
-          ```
-          [{"Path": "device_path", "Rate": rate}]
-          ```
-        type: "array"
-        items:
-          $ref: "#/definitions/ThrottleDevice"
-      CpuPeriod:
-        description: "The length of a CPU period in microseconds."
-        type: "integer"
-        format: "int64"
-      CpuQuota:
-        description: |
-          Microseconds of CPU time that the container can get in a CPU period.
-        type: "integer"
-        format: "int64"
-      CpuRealtimePeriod:
-        description: |
-          The length of a CPU real-time period in microseconds. Set to 0 to
-          allocate no time allocated to real-time tasks.
-        type: "integer"
-        format: "int64"
-      CpuRealtimeRuntime:
-        description: |
-          The length of a CPU real-time runtime in microseconds. Set to 0 to
-          allocate no time allocated to real-time tasks.
-        type: "integer"
-        format: "int64"
-      CpusetCpus:
-        description: |
-          CPUs in which to allow execution (e.g., `0-3`, `0,1`).
-        type: "string"
-        example: "0-3"
-      CpusetMems:
-        description: |
-          Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only
-          effective on NUMA systems.
-        type: "string"
-      Devices:
-        description: "A list of devices to add to the container."
-        type: "array"
-        items:
-          $ref: "#/definitions/DeviceMapping"
-      DeviceCgroupRules:
-        description: "a list of cgroup rules to apply to the container"
-        type: "array"
-        items:
-          type: "string"
-          example: "c 13:* rwm"
-      DeviceRequests:
-        description: |
-          A list of requests for devices to be sent to device drivers.
-        type: "array"
-        items:
-          $ref: "#/definitions/DeviceRequest"
-      KernelMemoryTCP:
-        description: |
-          Hard limit for kernel TCP buffer memory (in bytes). Depending on the
-          OCI runtime in use, this option may be ignored. It is no longer supported
-          by the default (runc) runtime.
-
-          This field is omitted when empty.
-        type: "integer"
-        format: "int64"
-      MemoryReservation:
-        description: "Memory soft limit in bytes."
-        type: "integer"
-        format: "int64"
-      MemorySwap:
-        description: |
-          Total memory limit (memory + swap). Set as `-1` to enable unlimited
-          swap.
-        type: "integer"
-        format: "int64"
-      MemorySwappiness:
-        description: |
-          Tune a container's memory swappiness behavior. Accepts an integer
-          between 0 and 100.
-        type: "integer"
-        format: "int64"
-        minimum: 0
-        maximum: 100
-      NanoCpus:
-        description: "CPU quota in units of 10<sup>-9</sup> CPUs."
-        type: "integer"
-        format: "int64"
-      OomKillDisable:
-        description: "Disable OOM Killer for the container."
-        type: "boolean"
-      Init:
-        description: |
-          Run an init inside the container that forwards signals and reaps
-          processes. This field is omitted if empty, and the default (as
-          configured on the daemon) is used.
-        type: "boolean"
-        x-nullable: true
-      PidsLimit:
-        description: |
-          Tune a container's PIDs limit. Set `0` or `-1` for unlimited, or `null`
-          to not change.
-        type: "integer"
-        format: "int64"
-        x-nullable: true
-      Ulimits:
-        description: |
-          A list of resource limits to set in the container. For example:
-
-          ```
-          {"Name": "nofile", "Soft": 1024, "Hard": 2048}
-          ```
-        type: "array"
-        items:
-          type: "object"
-          properties:
-            Name:
-              description: "Name of ulimit"
-              type: "string"
-            Soft:
-              description: "Soft limit"
-              type: "integer"
-            Hard:
-              description: "Hard limit"
-              type: "integer"
-      # Applicable to Windows
-      CpuCount:
-        description: |
-          The number of usable CPUs (Windows only).
-
-          On Windows Server containers, the processor resource controls are
-          mutually exclusive. The order of precedence is `CPUCount` first, then
-          `CPUShares`, and `CPUPercent` last.
-        type: "integer"
-        format: "int64"
-      CpuPercent:
-        description: |
-          The usable percentage of the available CPUs (Windows only).
-
-          On Windows Server containers, the processor resource controls are
-          mutually exclusive. The order of precedence is `CPUCount` first, then
-          `CPUShares`, and `CPUPercent` last.
-        type: "integer"
-        format: "int64"
-      IOMaximumIOps:
-        description: "Maximum IOps for the container system drive (Windows only)"
-        type: "integer"
-        format: "int64"
-      IOMaximumBandwidth:
-        description: |
-          Maximum IO in bytes per second for the container system drive
-          (Windows only).
-        type: "integer"
-        format: "int64"
-
-  Limit:
-    description: |
-      An object describing a limit on resources which can be requested by a task.
-    type: "object"
-    properties:
-      NanoCPUs:
-        type: "integer"
-        format: "int64"
-        example: 4000000000
-      MemoryBytes:
-        type: "integer"
-        format: "int64"
-        example: 8272408576
-      Pids:
-        description: |
-          Limits the maximum number of PIDs in the container. Set `0` for unlimited.
-        type: "integer"
-        format: "int64"
-        default: 0
-        example: 100
-
-  ResourceObject:
-    description: |
-      An object describing the resources which can be advertised by a node and
-      requested by a task.
-    type: "object"
-    properties:
-      NanoCPUs:
-        type: "integer"
-        format: "int64"
-        example: 4000000000
-      MemoryBytes:
-        type: "integer"
-        format: "int64"
-        example: 8272408576
-      GenericResources:
-        $ref: "#/definitions/GenericResources"
-
-  GenericResources:
-    description: |
-      User-defined resources can be either Integer resources (e.g, `SSD=3`) or
-      String resources (e.g, `GPU=UUID1`).
-    type: "array"
-    items:
-      type: "object"
-      properties:
-        NamedResourceSpec:
-          type: "object"
-          properties:
-            Kind:
-              type: "string"
-            Value:
-              type: "string"
-        DiscreteResourceSpec:
-          type: "object"
-          properties:
-            Kind:
-              type: "string"
-            Value:
-              type: "integer"
-              format: "int64"
-    example:
-      - DiscreteResourceSpec:
-          Kind: "SSD"
-          Value: 3
-      - NamedResourceSpec:
-          Kind: "GPU"
-          Value: "UUID1"
-      - NamedResourceSpec:
-          Kind: "GPU"
-          Value: "UUID2"
-
-  HealthConfig:
-    description: "A test to perform to check that the container is healthy."
-    type: "object"
-    properties:
-      Test:
-        description: |
-          The test to perform. Possible values are:
-
-          - `[]` inherit healthcheck from image or parent image
-          - `["NONE"]` disable healthcheck
-          - `["CMD", args...]` exec arguments directly
-          - `["CMD-SHELL", command]` run command with system's default shell
-        type: "array"
-        items:
-          type: "string"
-      Interval:
-        description: |
-          The time to wait between checks in nanoseconds. It should be 0 or at
-          least 1000000 (1 ms). 0 means inherit.
-        type: "integer"
-        format: "int64"
-      Timeout:
-        description: |
-          The time to wait before considering the check to have hung. It should
-          be 0 or at least 1000000 (1 ms). 0 means inherit.
-        type: "integer"
-        format: "int64"
-      Retries:
-        description: |
-          The number of consecutive failures needed to consider a container as
-          unhealthy. 0 means inherit.
-        type: "integer"
-      StartPeriod:
-        description: |
-          Start period for the container to initialize before starting
-          health-retries countdown in nanoseconds. It should be 0 or at least
-          1000000 (1 ms). 0 means inherit.
-        type: "integer"
-        format: "int64"
-      StartInterval:
-        description: |
-          The time to wait between checks in nanoseconds during the start period.
-          It should be 0 or at least 1000000 (1 ms). 0 means inherit.
-        type: "integer"
-        format: "int64"
-
-  Health:
-    description: |
-      Health stores information about the container's healthcheck results.
-    type: "object"
-    x-nullable: true
-    properties:
-      Status:
-        description: |
-          Status is one of `none`, `starting`, `healthy` or `unhealthy`
-
-          - "none"      Indicates there is no healthcheck
-          - "starting"  Starting indicates that the container is not yet ready
-          - "healthy"   Healthy indicates that the container is running correctly
-          - "unhealthy" Unhealthy indicates that the container has a problem
-        type: "string"
-        enum:
-          - "none"
-          - "starting"
-          - "healthy"
-          - "unhealthy"
-        example: "healthy"
-      FailingStreak:
-        description: "FailingStreak is the number of consecutive failures"
-        type: "integer"
-        example: 0
-      Log:
-        type: "array"
-        description: |
-          Log contains the last few results (oldest first)
-        items:
-          $ref: "#/definitions/HealthcheckResult"
-
-  HealthcheckResult:
-    description: |
-      HealthcheckResult stores information about a single run of a healthcheck probe
-    type: "object"
-    x-nullable: true
-    properties:
-      Start:
-        description: |
-          Date and time at which this check started in
-          [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
-        type: "string"
-        format: "date-time"
-        example: "2020-01-04T10:44:24.496525531Z"
-      End:
-        description: |
-          Date and time at which this check ended in
-          [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
-        type: "string"
-        format: "dateTime"
-        example: "2020-01-04T10:45:21.364524523Z"
-      ExitCode:
-        description: |
-          ExitCode meanings:
-
-          - `0` healthy
-          - `1` unhealthy
-          - `2` reserved (considered unhealthy)
-          - other values: error running probe
-        type: "integer"
-        example: 0
-      Output:
-        description: "Output from last check"
-        type: "string"
-
-  HostConfig:
-    description: "Container configuration that depends on the host we are running on"
-    allOf:
-      - $ref: "#/definitions/Resources"
-      - type: "object"
-        properties:
-          # Applicable to all platforms
-          Binds:
-            type: "array"
-            description: |
-              A list of volume bindings for this container. Each volume binding
-              is a string in one of these forms:
-
-              - `host-src:container-dest[:options]` to bind-mount a host path
-                into the container. Both `host-src`, and `container-dest` must
-                be an _absolute_ path.
-              - `volume-name:container-dest[:options]` to bind-mount a volume
-                managed by a volume driver into the container. `container-dest`
-                must be an _absolute_ path.
-
-              `options` is an optional, comma-delimited list of:
-
-              - `nocopy` disables automatic copying of data from the container
-                path to the volume. The `nocopy` flag only applies to named volumes.
-              - `[ro|rw]` mounts a volume read-only or read-write, respectively.
-                If omitted or set to `rw`, volumes are mounted read-write.
-              - `[z|Z]` applies SELinux labels to allow or deny multiple containers
-                to read and write to the same volume.
-                  - `z`: a _shared_ content label is applied to the content. This
-                    label indicates that multiple containers can share the volume
-                    content, for both reading and writing.
-                  - `Z`: a _private unshared_ label is applied to the content.
-                    This label indicates that only the current container can use
-                    a private volume. Labeling systems such as SELinux require
-                    proper labels to be placed on volume content that is mounted
-                    into a container. Without a label, the security system can
-                    prevent a container's processes from using the content. By
-                    default, the labels set by the host operating system are not
-                    modified.
-              - `[[r]shared|[r]slave|[r]private]` specifies mount
-                [propagation behavior](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt).
-                This only applies to bind-mounted volumes, not internal volumes
-                or named volumes. Mount propagation requires the source mount
-                point (the location where the source directory is mounted in the
-                host operating system) to have the correct propagation properties.
-                For shared volumes, the source mount point must be set to `shared`.
-                For slave volumes, the mount must be set to either `shared` or
-                `slave`.
-            items:
-              type: "string"
-          ContainerIDFile:
-            type: "string"
-            description: "Path to a file where the container ID is written"
-          LogConfig:
-            type: "object"
-            description: "The logging configuration for this container"
-            properties:
-              Type:
-                type: "string"
-                enum:
-                  - "json-file"
-                  - "syslog"
-                  - "journald"
-                  - "gelf"
-                  - "fluentd"
-                  - "awslogs"
-                  - "splunk"
-                  - "etwlogs"
-                  - "none"
-              Config:
-                type: "object"
-                additionalProperties:
-                  type: "string"
-          NetworkMode:
-            type: "string"
-            description: |
-              Network mode to use for this container. Supported standard values
-              are: `bridge`, `host`, `none`, and `container:<name|id>`. Any
-              other value is taken as a custom network's name to which this
-              container should connect to.
-          PortBindings:
-            $ref: "#/definitions/PortMap"
-          RestartPolicy:
-            $ref: "#/definitions/RestartPolicy"
-          AutoRemove:
-            type: "boolean"
-            description: |
-              Automatically remove the container when the container's process
-              exits. This has no effect if `RestartPolicy` is set.
-          VolumeDriver:
-            type: "string"
-            description: "Driver that this container uses to mount volumes."
-          VolumesFrom:
-            type: "array"
-            description: |
-              A list of volumes to inherit from another container, specified in
-              the form `<container name>[:<ro|rw>]`.
-            items:
-              type: "string"
-          Mounts:
-            description: |
-              Specification for mounts to be added to the container.
-            type: "array"
-            items:
-              $ref: "#/definitions/Mount"
-          ConsoleSize:
-            type: "array"
-            description: |
-              Initial console size, as an `[height, width]` array.
-            x-nullable: true
-            minItems: 2
-            maxItems: 2
-            items:
-              type: "integer"
-              minimum: 0
-          Annotations:
-            type: "object"
-            description: |
-              Arbitrary non-identifying metadata attached to container and
-              provided to the runtime when the container is started.
-            additionalProperties:
-              type: "string"
-
-          # Applicable to UNIX platforms
-          CapAdd:
-            type: "array"
-            description: |
-              A list of kernel capabilities to add to the container. Conflicts
-              with option 'Capabilities'.
-            items:
-              type: "string"
-          CapDrop:
-            type: "array"
-            description: |
-              A list of kernel capabilities to drop from the container. Conflicts
-              with option 'Capabilities'.
-            items:
-              type: "string"
-          CgroupnsMode:
-            type: "string"
-            enum:
-              - "private"
-              - "host"
-            description: |
-              cgroup namespace mode for the container. Possible values are:
-
-              - `"private"`: the container runs in its own private cgroup namespace
-              - `"host"`: use the host system's cgroup namespace
-
-              If not specified, the daemon default is used, which can either be `"private"`
-              or `"host"`, depending on daemon version, kernel support and configuration.
-          Dns:
-            type: "array"
-            description: "A list of DNS servers for the container to use."
-            items:
-              type: "string"
-          DnsOptions:
-            type: "array"
-            description: "A list of DNS options."
-            items:
-              type: "string"
-          DnsSearch:
-            type: "array"
-            description: "A list of DNS search domains."
-            items:
-              type: "string"
-          ExtraHosts:
-            type: "array"
-            description: |
-              A list of hostnames/IP mappings to add to the container's `/etc/hosts`
-              file. Specified in the form `["hostname:IP"]`.
-            items:
-              type: "string"
-          GroupAdd:
-            type: "array"
-            description: |
-              A list of additional groups that the container process will run as.
-            items:
-              type: "string"
-          IpcMode:
-            type: "string"
-            description: |
-              IPC sharing mode for the container. Possible values are:
-
-              - `"none"`: own private IPC namespace, with /dev/shm not mounted
-              - `"private"`: own private IPC namespace
-              - `"shareable"`: own private IPC namespace, with a possibility to share it with other containers
-              - `"container:<name|id>"`: join another (shareable) container's IPC namespace
-              - `"host"`: use the host system's IPC namespace
-
-              If not specified, daemon default is used, which can either be `"private"`
-              or `"shareable"`, depending on daemon version and configuration.
-          Cgroup:
-            type: "string"
-            description: "Cgroup to use for the container."
-          Links:
-            type: "array"
-            description: |
-              A list of links for the container in the form `container_name:alias`.
-            items:
-              type: "string"
-          OomScoreAdj:
-            type: "integer"
-            description: |
-              An integer value containing the score given to the container in
-              order to tune OOM killer preferences.
-            example: 500
-          PidMode:
-            type: "string"
-            description: |
-              Set the PID (Process) Namespace mode for the container. It can be
-              either:
-
-              - `"container:<name|id>"`: joins another container's PID namespace
-              - `"host"`: use the host's PID namespace inside the container
-          Privileged:
-            type: "boolean"
-            description: "Gives the container full access to the host."
-          PublishAllPorts:
-            type: "boolean"
-            description: |
-              Allocates an ephemeral host port for all of a container's
-              exposed ports.
-
-              Ports are de-allocated when the container stops and allocated when
-              the container starts. The allocated port might be changed when
-              restarting the container.
-
-              The port is selected from the ephemeral port range that depends on
-              the kernel. For example, on Linux the range is defined by
-              `/proc/sys/net/ipv4/ip_local_port_range`.
-          ReadonlyRootfs:
-            type: "boolean"
-            description: "Mount the container's root filesystem as read only."
-          SecurityOpt:
-            type: "array"
-            description: |
-              A list of string values to customize labels for MLS systems, such
-              as SELinux.
-            items:
-              type: "string"
-          StorageOpt:
-            type: "object"
-            description: |
-              Storage driver options for this container, in the form `{"size": "120G"}`.
-            additionalProperties:
-              type: "string"
-          Tmpfs:
-            type: "object"
-            description: |
-              A map of container directories which should be replaced by tmpfs
-              mounts, and their corresponding mount options. For example:
-
-              ```
-              { "/run": "rw,noexec,nosuid,size=65536k" }
-              ```
-            additionalProperties:
-              type: "string"
-          UTSMode:
-            type: "string"
-            description: "UTS namespace to use for the container."
-          UsernsMode:
-            type: "string"
-            description: |
-              Sets the usernamespace mode for the container when usernamespace
-              remapping option is enabled.
-          ShmSize:
-            type: "integer"
-            format: "int64"
-            description: |
-              Size of `/dev/shm` in bytes. If omitted, the system uses 64MB.
-            minimum: 0
-          Sysctls:
-            type: "object"
-            description: |
-              A list of kernel parameters (sysctls) to set in the container.
-              For example:
-
-              ```
-              {"net.ipv4.ip_forward": "1"}
-              ```
-            additionalProperties:
-              type: "string"
-          Runtime:
-            type: "string"
-            description: "Runtime to use with this container."
-          # Applicable to Windows
-          Isolation:
-            type: "string"
-            description: |
-              Isolation technology of the container. (Windows only)
-            enum:
-              - "default"
-              - "process"
-              - "hyperv"
-              - ""
-          MaskedPaths:
-            type: "array"
-            description: |
-              The list of paths to be masked inside the container (this overrides
-              the default set of paths).
-            items:
-              type: "string"
-          ReadonlyPaths:
-            type: "array"
-            description: |
-              The list of paths to be set as read-only inside the container
-              (this overrides the default set of paths).
-            items:
-              type: "string"
-
-  ContainerConfig:
-    description: |
-      Configuration for a container that is portable between hosts.
-    type: "object"
-    properties:
-      Hostname:
-        description: |
-          The hostname to use for the container, as a valid RFC 1123 hostname.
-        type: "string"
-        example: "439f4e91bd1d"
-      Domainname:
-        description: |
-          The domain name to use for the container.
-        type: "string"
-      User:
-        description: "The user that commands are run as inside the container."
-        type: "string"
-      AttachStdin:
-        description: "Whether to attach to `stdin`."
-        type: "boolean"
-        default: false
-      AttachStdout:
-        description: "Whether to attach to `stdout`."
-        type: "boolean"
-        default: true
-      AttachStderr:
-        description: "Whether to attach to `stderr`."
-        type: "boolean"
-        default: true
-      ExposedPorts:
-        description: |
-          An object mapping ports to an empty object in the form:
-
-          `{"<port>/<tcp|udp|sctp>": {}}`
-        type: "object"
-        x-nullable: true
-        additionalProperties:
-          type: "object"
-          enum:
-            - {}
-          default: {}
-        example: {
-          "80/tcp": {},
-          "443/tcp": {}
-        }
-      Tty:
-        description: |
-          Attach standard streams to a TTY, including `stdin` if it is not closed.
-        type: "boolean"
-        default: false
-      OpenStdin:
-        description: "Open `stdin`"
-        type: "boolean"
-        default: false
-      StdinOnce:
-        description: "Close `stdin` after one attached client disconnects"
-        type: "boolean"
-        default: false
-      Env:
-        description: |
-          A list of environment variables to set inside the container in the
-          form `["VAR=value", ...]`. A variable without `=` is removed from the
-          environment, rather than to have an empty value.
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
-      Cmd:
-        description: |
-          Command to run specified as a string or an array of strings.
-        type: "array"
-        items:
-          type: "string"
-        example: ["/bin/sh"]
-      Healthcheck:
-        $ref: "#/definitions/HealthConfig"
-      ArgsEscaped:
-        description: "Command is already escaped (Windows only)"
-        type: "boolean"
-        default: false
-        example: false
-        x-nullable: true
-      Image:
-        description: |
-          The name (or reference) of the image to use when creating the container,
-          or which was used when the container was created.
-        type: "string"
-        example: "example-image:1.0"
-      Volumes:
-        description: |
-          An object mapping mount point paths inside the container to empty
-          objects.
-        type: "object"
-        additionalProperties:
-          type: "object"
-          enum:
-            - {}
-          default: {}
-      WorkingDir:
-        description: "The working directory for commands to run in."
-        type: "string"
-        example: "/public/"
-      Entrypoint:
-        description: |
-          The entry point for the container as a string or an array of strings.
-
-          If the array consists of exactly one empty string (`[""]`) then the
-          entry point is reset to system default (i.e., the entry point used by
-          docker when there is no `ENTRYPOINT` instruction in the `Dockerfile`).
-        type: "array"
-        items:
-          type: "string"
-        example: []
-      NetworkDisabled:
-        description: "Disable networking for the container."
-        type: "boolean"
-        x-nullable: true
-      MacAddress:
-        description: |
-          MAC address of the container.
-
-          Deprecated: this field is deprecated in API v1.44 and up. Use EndpointSettings.MacAddress instead.
-        type: "string"
-        x-nullable: true
-      OnBuild:
-        description: |
-          `ONBUILD` metadata that were defined in the image's `Dockerfile`.
-        type: "array"
-        x-nullable: true
-        items:
-          type: "string"
-        example: []
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        additionalProperties:
-          type: "string"
-        example:
-          com.example.some-label: "some-value"
-          com.example.some-other-label: "some-other-value"
-      StopSignal:
-        description: |
-          Signal to stop a container as a string or unsigned integer.
-        type: "string"
-        example: "SIGTERM"
-        x-nullable: true
-      StopTimeout:
-        description: "Timeout to stop a container in seconds."
-        type: "integer"
-        default: 10
-        x-nullable: true
-      Shell:
-        description: |
-          Shell for when `RUN`, `CMD`, and `ENTRYPOINT` uses a shell.
-        type: "array"
-        x-nullable: true
-        items:
-          type: "string"
-        example: ["/bin/sh", "-c"]
-
-  ImageConfig:
-    description: |
-      Configuration of the image. These fields are used as defaults
-      when starting a container from the image.
-    type: "object"
-    properties:
-      Hostname:
-        description: |
-          The hostname to use for the container, as a valid RFC 1123 hostname.
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always empty. It must not be used, and will be removed in API v1.48.
-        type: "string"
-        example: ""
-      Domainname:
-        description: |
-          The domain name to use for the container.
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always empty. It must not be used, and will be removed in API v1.48.
-        type: "string"
-        example: ""
-      User:
-        description: "The user that commands are run as inside the container."
-        type: "string"
-        example: "web:web"
-      AttachStdin:
-        description: |
-          Whether to attach to `stdin`.
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always false. It must not be used, and will be removed in API v1.48.
-        type: "boolean"
-        default: false
-        example: false
-      AttachStdout:
-        description: |
-          Whether to attach to `stdout`.
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always false. It must not be used, and will be removed in API v1.48.
-        type: "boolean"
-        default: false
-        example: false
-      AttachStderr:
-        description: |
-          Whether to attach to `stderr`.
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always false. It must not be used, and will be removed in API v1.48.
-        type: "boolean"
-        default: false
-        example: false
-      ExposedPorts:
-        description: |
-          An object mapping ports to an empty object in the form:
-
-          `{"<port>/<tcp|udp|sctp>": {}}`
-        type: "object"
-        x-nullable: true
-        additionalProperties:
-          type: "object"
-          enum:
-            - {}
-          default: {}
-        example: {
-          "80/tcp": {},
-          "443/tcp": {}
-        }
-      Tty:
-        description: |
-          Attach standard streams to a TTY, including `stdin` if it is not closed.
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always false. It must not be used, and will be removed in API v1.48.
-        type: "boolean"
-        default: false
-        example: false
-      OpenStdin:
-        description: |
-          Open `stdin`
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always false. It must not be used, and will be removed in API v1.48.
-        type: "boolean"
-        default: false
-        example: false
-      StdinOnce:
-        description: |
-          Close `stdin` after one attached client disconnects.
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always false. It must not be used, and will be removed in API v1.48.
-        type: "boolean"
-        default: false
-        example: false
-      Env:
-        description: |
-          A list of environment variables to set inside the container in the
-          form `["VAR=value", ...]`. A variable without `=` is removed from the
-          environment, rather than to have an empty value.
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
-      Cmd:
-        description: |
-          Command to run specified as a string or an array of strings.
-        type: "array"
-        items:
-          type: "string"
-        example: ["/bin/sh"]
-      Healthcheck:
-        $ref: "#/definitions/HealthConfig"
-      ArgsEscaped:
-        description: "Command is already escaped (Windows only)"
-        type: "boolean"
-        default: false
-        example: false
-        x-nullable: true
-      Image:
-        description: |
-          The name (or reference) of the image to use when creating the container,
-          or which was used when the container was created.
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always empty. It must not be used, and will be removed in API v1.48.
-        type: "string"
-        default: ""
-        example: ""
-      Volumes:
-        description: |
-          An object mapping mount point paths inside the container to empty
-          objects.
-        type: "object"
-        additionalProperties:
-          type: "object"
-          enum:
-            - {}
-          default: {}
-        example:
-          "/app/data": {}
-          "/app/config": {}
-      WorkingDir:
-        description: "The working directory for commands to run in."
-        type: "string"
-        example: "/public/"
-      Entrypoint:
-        description: |
-          The entry point for the container as a string or an array of strings.
-
-          If the array consists of exactly one empty string (`[""]`) then the
-          entry point is reset to system default (i.e., the entry point used by
-          docker when there is no `ENTRYPOINT` instruction in the `Dockerfile`).
-        type: "array"
-        items:
-          type: "string"
-        example: []
-      NetworkDisabled:
-        description: |
-          Disable networking for the container.
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always omitted. It must not be used, and will be removed in API v1.48.
-        type: "boolean"
-        default: false
-        example: false
-        x-nullable: true
-      MacAddress:
-        description: |
-          MAC address of the container.
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always omitted. It must not be used, and will be removed in API v1.48.
-        type: "string"
-        default: ""
-        example: ""
-        x-nullable: true
-      OnBuild:
-        description: |
-          `ONBUILD` metadata that were defined in the image's `Dockerfile`.
-        type: "array"
-        x-nullable: true
-        items:
-          type: "string"
-        example: []
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        additionalProperties:
-          type: "string"
-        example:
-          com.example.some-label: "some-value"
-          com.example.some-other-label: "some-other-value"
-      StopSignal:
-        description: |
-          Signal to stop a container as a string or unsigned integer.
-        type: "string"
-        example: "SIGTERM"
-        x-nullable: true
-      StopTimeout:
-        description: |
-          Timeout to stop a container in seconds.
-
-          <p><br /></p>
-
-          > **Deprecated**: this field is not part of the image specification and is
-          > always omitted. It must not be used, and will be removed in API v1.48.
-        type: "integer"
-        default: 10
-        x-nullable: true
-      Shell:
-        description: |
-          Shell for when `RUN`, `CMD`, and `ENTRYPOINT` uses a shell.
-        type: "array"
-        x-nullable: true
-        items:
-          type: "string"
-        example: ["/bin/sh", "-c"]
-    # FIXME(thaJeztah): temporarily using a full example to remove some "omitempty" fields. Remove once the fields are removed.
-    example:
-      "Hostname": ""
-      "Domainname": ""
-      "User": "web:web"
-      "AttachStdin": false
-      "AttachStdout": false
-      "AttachStderr": false
-      "ExposedPorts": {
-        "80/tcp": {},
-        "443/tcp": {}
-      }
-      "Tty": false
-      "OpenStdin": false
-      "StdinOnce": false
-      "Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"]
-      "Cmd": ["/bin/sh"]
-      "Healthcheck": {
-        "Test": ["string"],
-        "Interval": 0,
-        "Timeout": 0,
-        "Retries": 0,
-        "StartPeriod": 0,
-        "StartInterval": 0
-      }
-      "ArgsEscaped": true
-      "Image": ""
-      "Volumes": {
-        "/app/data": {},
-        "/app/config": {}
-      }
-      "WorkingDir": "/public/"
-      "Entrypoint": []
-      "OnBuild": []
-      "Labels": {
-        "com.example.some-label": "some-value",
-        "com.example.some-other-label": "some-other-value"
-      }
-      "StopSignal": "SIGTERM"
-      "Shell": ["/bin/sh", "-c"]
-
-  NetworkingConfig:
-    description: |
-      NetworkingConfig represents the container's networking configuration for
-      each of its interfaces.
-      It is used for the networking configs specified in the `docker create`
-      and `docker network connect` commands.
-    type: "object"
-    properties:
-      EndpointsConfig:
-        description: |
-          A mapping of network name to endpoint configuration for that network.
-          The endpoint configuration can be left empty to connect to that
-          network with no particular endpoint configuration.
-        type: "object"
-        additionalProperties:
-          $ref: "#/definitions/EndpointSettings"
-    example:
-      # putting an example here, instead of using the example values from
-      # /definitions/EndpointSettings, because EndpointSettings contains
-      # operational data returned when inspecting a container that we don't
-      # accept here.
-      EndpointsConfig:
-        isolated_nw:
-          IPAMConfig:
-            IPv4Address: "172.20.30.33"
-            IPv6Address: "2001:db8:abcd::3033"
-            LinkLocalIPs:
-              - "169.254.34.68"
-              - "fe80::3468"
-          MacAddress: "02:42:ac:12:05:02"
-          Links:
-            - "container_1"
-            - "container_2"
-          Aliases:
-            - "server_x"
-            - "server_y"
-        database_nw: {}
-
-  NetworkSettings:
-    description: "NetworkSettings exposes the network settings in the API"
-    type: "object"
-    properties:
-      Bridge:
-        description: |
-          Name of the default bridge interface when dockerd's --bridge flag is set.
-        type: "string"
-        example: "docker0"
-      SandboxID:
-        description: SandboxID uniquely represents a container's network stack.
-        type: "string"
-        example: "9d12daf2c33f5959c8bf90aa513e4f65b561738661003029ec84830cd503a0c3"
-      HairpinMode:
-        description: |
-          Indicates if hairpin NAT should be enabled on the virtual interface.
-
-          Deprecated: This field is never set and will be removed in a future release.
-        type: "boolean"
-        example: false
-      LinkLocalIPv6Address:
-        description: |
-          IPv6 unicast address using the link-local prefix.
-
-          Deprecated: This field is never set and will be removed in a future release.
-        type: "string"
-        example: ""
-      LinkLocalIPv6PrefixLen:
-        description: |
-          Prefix length of the IPv6 unicast address.
-
-          Deprecated: This field is never set and will be removed in a future release.
-        type: "integer"
-        example: ""
-      Ports:
-        $ref: "#/definitions/PortMap"
-      SandboxKey:
-        description: SandboxKey is the full path of the netns handle
-        type: "string"
-        example: "/var/run/docker/netns/8ab54b426c38"
-
-      SecondaryIPAddresses:
-        description: "Deprecated: This field is never set and will be removed in a future release."
-        type: "array"
-        items:
-          $ref: "#/definitions/Address"
-        x-nullable: true
-
-      SecondaryIPv6Addresses:
-        description: "Deprecated: This field is never set and will be removed in a future release."
-        type: "array"
-        items:
-          $ref: "#/definitions/Address"
-        x-nullable: true
-
-      # TODO properties below are part of DefaultNetworkSettings, which is
-      # marked as deprecated since Docker 1.9 and to be removed in Docker v17.12
-      EndpointID:
-        description: |
-          EndpointID uniquely represents a service endpoint in a Sandbox.
-
-          <p><br /></p>
-
-          > **Deprecated**: This field is only propagated when attached to the
-          > default "bridge" network. Use the information from the "bridge"
-          > network inside the `Networks` map instead, which contains the same
-          > information. This field was deprecated in Docker 1.9 and is scheduled
-          > to be removed in Docker 17.12.0
-        type: "string"
-        example: "b88f5b905aabf2893f3cbc4ee42d1ea7980bbc0a92e2c8922b1e1795298afb0b"
-      Gateway:
-        description: |
-          Gateway address for the default "bridge" network.
-
-          <p><br /></p>
-
-          > **Deprecated**: This field is only propagated when attached to the
-          > default "bridge" network. Use the information from the "bridge"
-          > network inside the `Networks` map instead, which contains the same
-          > information. This field was deprecated in Docker 1.9 and is scheduled
-          > to be removed in Docker 17.12.0
-        type: "string"
-        example: "172.17.0.1"
-      GlobalIPv6Address:
-        description: |
-          Global IPv6 address for the default "bridge" network.
-
-          <p><br /></p>
-
-          > **Deprecated**: This field is only propagated when attached to the
-          > default "bridge" network. Use the information from the "bridge"
-          > network inside the `Networks` map instead, which contains the same
-          > information. This field was deprecated in Docker 1.9 and is scheduled
-          > to be removed in Docker 17.12.0
-        type: "string"
-        example: "2001:db8::5689"
-      GlobalIPv6PrefixLen:
-        description: |
-          Mask length of the global IPv6 address.
-
-          <p><br /></p>
-
-          > **Deprecated**: This field is only propagated when attached to the
-          > default "bridge" network. Use the information from the "bridge"
-          > network inside the `Networks` map instead, which contains the same
-          > information. This field was deprecated in Docker 1.9 and is scheduled
-          > to be removed in Docker 17.12.0
-        type: "integer"
-        example: 64
-      IPAddress:
-        description: |
-          IPv4 address for the default "bridge" network.
-
-          <p><br /></p>
-
-          > **Deprecated**: This field is only propagated when attached to the
-          > default "bridge" network. Use the information from the "bridge"
-          > network inside the `Networks` map instead, which contains the same
-          > information. This field was deprecated in Docker 1.9 and is scheduled
-          > to be removed in Docker 17.12.0
-        type: "string"
-        example: "172.17.0.4"
-      IPPrefixLen:
-        description: |
-          Mask length of the IPv4 address.
-
-          <p><br /></p>
-
-          > **Deprecated**: This field is only propagated when attached to the
-          > default "bridge" network. Use the information from the "bridge"
-          > network inside the `Networks` map instead, which contains the same
-          > information. This field was deprecated in Docker 1.9 and is scheduled
-          > to be removed in Docker 17.12.0
-        type: "integer"
-        example: 16
-      IPv6Gateway:
-        description: |
-          IPv6 gateway address for this network.
-
-          <p><br /></p>
-
-          > **Deprecated**: This field is only propagated when attached to the
-          > default "bridge" network. Use the information from the "bridge"
-          > network inside the `Networks` map instead, which contains the same
-          > information. This field was deprecated in Docker 1.9 and is scheduled
-          > to be removed in Docker 17.12.0
-        type: "string"
-        example: "2001:db8:2::100"
-      MacAddress:
-        description: |
-          MAC address for the container on the default "bridge" network.
-
-          <p><br /></p>
-
-          > **Deprecated**: This field is only propagated when attached to the
-          > default "bridge" network. Use the information from the "bridge"
-          > network inside the `Networks` map instead, which contains the same
-          > information. This field was deprecated in Docker 1.9 and is scheduled
-          > to be removed in Docker 17.12.0
-        type: "string"
-        example: "02:42:ac:11:00:04"
-      Networks:
-        description: |
-          Information about all networks that the container is connected to.
-        type: "object"
-        additionalProperties:
-          $ref: "#/definitions/EndpointSettings"
-
-  Address:
-    description: Address represents an IPv4 or IPv6 IP address.
-    type: "object"
-    properties:
-      Addr:
-        description: IP address.
-        type: "string"
-      PrefixLen:
-        description: Mask length of the IP address.
-        type: "integer"
-
-  PortMap:
-    description: |
-      PortMap describes the mapping of container ports to host ports, using the
-      container's port-number and protocol as key in the format `<port>/<protocol>`,
-      for example, `80/udp`.
-
-      If a container's port is mapped for multiple protocols, separate entries
-      are added to the mapping table.
-    type: "object"
-    additionalProperties:
-      type: "array"
-      x-nullable: true
-      items:
-        $ref: "#/definitions/PortBinding"
-    example:
-      "443/tcp":
-        - HostIp: "127.0.0.1"
-          HostPort: "4443"
-      "80/tcp":
-        - HostIp: "0.0.0.0"
-          HostPort: "80"
-        - HostIp: "0.0.0.0"
-          HostPort: "8080"
-      "80/udp":
-        - HostIp: "0.0.0.0"
-          HostPort: "80"
-      "53/udp":
-        - HostIp: "0.0.0.0"
-          HostPort: "53"
-      "2377/tcp": null
-
-  PortBinding:
-    description: |
-      PortBinding represents a binding between a host IP address and a host
-      port.
-    type: "object"
-    properties:
-      HostIp:
-        description: "Host IP address that the container's port is mapped to."
-        type: "string"
-        example: "127.0.0.1"
-      HostPort:
-        description: "Host port number that the container's port is mapped to."
-        type: "string"
-        example: "4443"
-
-  GraphDriverData:
-    description: |
-      Information about the storage driver used to store the container's and
-      image's filesystem.
-    type: "object"
-    required: [Name, Data]
-    properties:
-      Name:
-        description: "Name of the storage driver."
-        type: "string"
-        x-nullable: false
-        example: "overlay2"
-      Data:
-        description: |
-          Low-level storage metadata, provided as key/value pairs.
-
-          This information is driver-specific, and depends on the storage-driver
-          in use, and should be used for informational purposes only.
-        type: "object"
-        x-nullable: false
-        additionalProperties:
-          type: "string"
-        example: {
-          "MergedDir": "/var/lib/docker/overlay2/ef749362d13333e65fc95c572eb525abbe0052e16e086cb64bc3b98ae9aa6d74/merged",
-          "UpperDir": "/var/lib/docker/overlay2/ef749362d13333e65fc95c572eb525abbe0052e16e086cb64bc3b98ae9aa6d74/diff",
-          "WorkDir": "/var/lib/docker/overlay2/ef749362d13333e65fc95c572eb525abbe0052e16e086cb64bc3b98ae9aa6d74/work"
-        }
-
-  FilesystemChange:
-    description: |
-      Change in the container's filesystem.
-    type: "object"
-    required: [Path, Kind]
-    properties:
-      Path:
-        description: |
-          Path to file or directory that has changed.
-        type: "string"
-        x-nullable: false
-      Kind:
-        $ref: "#/definitions/ChangeType"
-
-  ChangeType:
-    description: |
-      Kind of change
-
-      Can be one of:
-
-      - `0`: Modified ("C")
-      - `1`: Added ("A")
-      - `2`: Deleted ("D")
-    type: "integer"
-    format: "uint8"
-    enum: [0, 1, 2]
-    x-nullable: false
-
-  ImageInspect:
-    description: |
-      Information about an image in the local image cache.
-    type: "object"
-    properties:
-      Id:
-        description: |
-          ID is the content-addressable ID of an image.
-
-          This identifier is a content-addressable digest calculated from the
-          image's configuration (which includes the digests of layers used by
-          the image).
-
-          Note that this digest differs from the `RepoDigests` below, which
-          holds digests of image manifests that reference the image.
-        type: "string"
-        x-nullable: false
-        example: "sha256:ec3f0931a6e6b6855d76b2d7b0be30e81860baccd891b2e243280bf1cd8ad710"
-      RepoTags:
-        description: |
-          List of image names/tags in the local image cache that reference this
-          image.
-
-          Multiple image tags can refer to the same image, and this list may be
-          empty if no tags reference the image, in which case the image is
-          "untagged", in which case it can still be referenced by its ID.
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "example:1.0"
-          - "example:latest"
-          - "example:stable"
-          - "internal.registry.example.com:5000/example:1.0"
-      RepoDigests:
-        description: |
-          List of content-addressable digests of locally available image manifests
-          that the image is referenced from. Multiple manifests can refer to the
-          same image.
-
-          These digests are usually only available if the image was either pulled
-          from a registry, or if the image was pushed to a registry, which is when
-          the manifest is generated and its digest calculated.
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "example@sha256:afcc7f1ac1b49db317a7196c902e61c6c3c4607d63599ee1a82d702d249a0ccb"
-          - "internal.registry.example.com:5000/example@sha256:b69959407d21e8a062e0416bf13405bb2b71ed7a84dde4158ebafacfa06f5578"
-      Parent:
-        description: |
-          ID of the parent image.
-
-          Depending on how the image was created, this field may be empty and
-          is only set for images that were built/created locally. This field
-          is empty if the image was pulled from an image registry.
-        type: "string"
-        x-nullable: false
-        example: ""
-      Comment:
-        description: |
-          Optional message that was set when committing or importing the image.
-        type: "string"
-        x-nullable: false
-        example: ""
-      Created:
-        description: |
-          Date and time at which the image was created, formatted in
-          [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
-
-          This information is only available if present in the image,
-          and omitted otherwise.
-        type: "string"
-        format: "dateTime"
-        x-nullable: true
-        example: "2022-02-04T21:20:12.497794809Z"
-      DockerVersion:
-        description: |
-          The version of Docker that was used to build the image.
-
-          Depending on how the image was created, this field may be empty.
-        type: "string"
-        x-nullable: false
-        example: "27.0.1"
-      Author:
-        description: |
-          Name of the author that was specified when committing the image, or as
-          specified through MAINTAINER (deprecated) in the Dockerfile.
-        type: "string"
-        x-nullable: false
-        example: ""
-      Config:
-        $ref: "#/definitions/ImageConfig"
-      Architecture:
-        description: |
-          Hardware CPU architecture that the image runs on.
-        type: "string"
-        x-nullable: false
-        example: "arm"
-      Variant:
-        description: |
-          CPU architecture variant (presently ARM-only).
-        type: "string"
-        x-nullable: true
-        example: "v7"
-      Os:
-        description: |
-          Operating System the image is built to run on.
-        type: "string"
-        x-nullable: false
-        example: "linux"
-      OsVersion:
-        description: |
-          Operating System version the image is built to run on (especially
-          for Windows).
-        type: "string"
-        example: ""
-        x-nullable: true
-      Size:
-        description: |
-          Total size of the image including all layers it is composed of.
-        type: "integer"
-        format: "int64"
-        x-nullable: false
-        example: 1239828
-      VirtualSize:
-        description: |
-          Total size of the image including all layers it is composed of.
-
-          Deprecated: this field is omitted in API v1.44, but kept for backward compatibility. Use Size instead.
-        type: "integer"
-        format: "int64"
-        example: 1239828
-      GraphDriver:
-        $ref: "#/definitions/GraphDriverData"
-      RootFS:
-        description: |
-          Information about the image's RootFS, including the layer IDs.
-        type: "object"
-        required: [Type]
-        properties:
-          Type:
-            type: "string"
-            x-nullable: false
-            example: "layers"
-          Layers:
-            type: "array"
-            items:
-              type: "string"
-            example:
-              - "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6"
-              - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"
-      Metadata:
-        description: |
-          Additional metadata of the image in the local cache. This information
-          is local to the daemon, and not part of the image itself.
-        type: "object"
-        properties:
-          LastTagTime:
-            description: |
-              Date and time at which the image was last tagged in
-              [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
-
-              This information is only available if the image was tagged locally,
-              and omitted otherwise.
-            type: "string"
-            format: "dateTime"
-            example: "2022-02-28T14:40:02.623929178Z"
-            x-nullable: true
-
-  ImageSummary:
-    type: "object"
-    x-go-name: "Summary"
-    required:
-      - Id
-      - ParentId
-      - RepoTags
-      - RepoDigests
-      - Created
-      - Size
-      - SharedSize
-      - Labels
-      - Containers
-    properties:
-      Id:
-        description: |
-          ID is the content-addressable ID of an image.
-
-          This identifier is a content-addressable digest calculated from the
-          image's configuration (which includes the digests of layers used by
-          the image).
-
-          Note that this digest differs from the `RepoDigests` below, which
-          holds digests of image manifests that reference the image.
-        type: "string"
-        x-nullable: false
-        example: "sha256:ec3f0931a6e6b6855d76b2d7b0be30e81860baccd891b2e243280bf1cd8ad710"
-      ParentId:
-        description: |
-          ID of the parent image.
-
-          Depending on how the image was created, this field may be empty and
-          is only set for images that were built/created locally. This field
-          is empty if the image was pulled from an image registry.
-        type: "string"
-        x-nullable: false
-        example: ""
-      RepoTags:
-        description: |
-          List of image names/tags in the local image cache that reference this
-          image.
-
-          Multiple image tags can refer to the same image, and this list may be
-          empty if no tags reference the image, in which case the image is
-          "untagged", in which case it can still be referenced by its ID.
-        type: "array"
-        x-nullable: false
-        items:
-          type: "string"
-        example:
-          - "example:1.0"
-          - "example:latest"
-          - "example:stable"
-          - "internal.registry.example.com:5000/example:1.0"
-      RepoDigests:
-        description: |
-          List of content-addressable digests of locally available image manifests
-          that the image is referenced from. Multiple manifests can refer to the
-          same image.
-
-          These digests are usually only available if the image was either pulled
-          from a registry, or if the image was pushed to a registry, which is when
-          the manifest is generated and its digest calculated.
-        type: "array"
-        x-nullable: false
-        items:
-          type: "string"
-        example:
-          - "example@sha256:afcc7f1ac1b49db317a7196c902e61c6c3c4607d63599ee1a82d702d249a0ccb"
-          - "internal.registry.example.com:5000/example@sha256:b69959407d21e8a062e0416bf13405bb2b71ed7a84dde4158ebafacfa06f5578"
-      Created:
-        description: |
-          Date and time at which the image was created as a Unix timestamp
-          (number of seconds since EPOCH).
-        type: "integer"
-        x-nullable: false
-        example: "1644009612"
-      Size:
-        description: |
-          Total size of the image including all layers it is composed of.
-        type: "integer"
-        format: "int64"
-        x-nullable: false
-        example: 172064416
-      SharedSize:
-        description: |
-          Total size of image layers that are shared between this image and other
-          images.
-
-          This size is not calculated by default. `-1` indicates that the value
-          has not been set / calculated.
-        type: "integer"
-        format: "int64"
-        x-nullable: false
-        example: 1239828
-      VirtualSize:
-        description: |-
-          Total size of the image including all layers it is composed of.
-
-          Deprecated: this field is omitted in API v1.44, but kept for backward compatibility. Use Size instead.
-        type: "integer"
-        format: "int64"
-        example: 172064416
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        x-nullable: false
-        additionalProperties:
-          type: "string"
-        example:
-          com.example.some-label: "some-value"
-          com.example.some-other-label: "some-other-value"
-      Containers:
-        description: |
-          Number of containers using this image. Includes both stopped and running
-          containers.
-
-          This size is not calculated by default, and depends on which API endpoint
-          is used. `-1` indicates that the value has not been set / calculated.
-        x-nullable: false
-        type: "integer"
-        example: 2
-      Manifests:
-        description: |
-          Manifests is a list of manifests available in this image.
-          It provides a more detailed view of the platform-specific image manifests
-          or other image-attached data like build attestations.
-
-          WARNING: This is experimental and may change at any time without any backward
-          compatibility.
-        type: "array"
-        x-nullable: false
-        x-omitempty: true
-        items:
-          $ref: "#/definitions/ImageManifestSummary"
-
-  AuthConfig:
-    type: "object"
-    properties:
-      username:
-        type: "string"
-      password:
-        type: "string"
-      email:
-        type: "string"
-      serveraddress:
-        type: "string"
-    example:
-      username: "hannibal"
-      password: "xxxx"
-      serveraddress: "https://index.docker.io/v1/"
-
-  ProcessConfig:
-    type: "object"
-    properties:
-      privileged:
-        type: "boolean"
-      user:
-        type: "string"
-      tty:
-        type: "boolean"
-      entrypoint:
-        type: "string"
-      arguments:
-        type: "array"
-        items:
-          type: "string"
-
-  Volume:
-    type: "object"
-    required: [Name, Driver, Mountpoint, Labels, Scope, Options]
-    properties:
-      Name:
-        type: "string"
-        description: "Name of the volume."
-        x-nullable: false
-        example: "tardis"
-      Driver:
-        type: "string"
-        description: "Name of the volume driver used by the volume."
-        x-nullable: false
-        example: "custom"
-      Mountpoint:
-        type: "string"
-        description: "Mount path of the volume on the host."
-        x-nullable: false
-        example: "/var/lib/docker/volumes/tardis"
-      CreatedAt:
-        type: "string"
-        format: "dateTime"
-        description: "Date/Time the volume was created."
-        example: "2016-06-07T20:31:11.853781916Z"
-      Status:
-        type: "object"
-        description: |
-          Low-level details about the volume, provided by the volume driver.
-          Details are returned as a map with key/value pairs:
-          `{"key":"value","key2":"value2"}`.
-
-          The `Status` field is optional, and is omitted if the volume driver
-          does not support this feature.
-        additionalProperties:
-          type: "object"
-        example:
-          hello: "world"
-      Labels:
-        type: "object"
-        description: "User-defined key/value metadata."
-        x-nullable: false
-        additionalProperties:
-          type: "string"
-        example:
-          com.example.some-label: "some-value"
-          com.example.some-other-label: "some-other-value"
-      Scope:
-        type: "string"
-        description: |
-          The level at which the volume exists. Either `global` for cluster-wide,
-          or `local` for machine level.
-        default: "local"
-        x-nullable: false
-        enum: ["local", "global"]
-        example: "local"
-      ClusterVolume:
-        $ref: "#/definitions/ClusterVolume"
-      Options:
-        type: "object"
-        description: |
-          The driver specific options used when creating the volume.
-        additionalProperties:
-          type: "string"
-        example:
-          device: "tmpfs"
-          o: "size=100m,uid=1000"
-          type: "tmpfs"
-      UsageData:
-        type: "object"
-        x-nullable: true
-        x-go-name: "UsageData"
-        required: [Size, RefCount]
-        description: |
-          Usage details about the volume. This information is used by the
-          `GET /system/df` endpoint, and omitted in other endpoints.
-        properties:
-          Size:
-            type: "integer"
-            format: "int64"
-            default: -1
-            description: |
-              Amount of disk space used by the volume (in bytes). This information
-              is only available for volumes created with the `"local"` volume
-              driver. For volumes created with other volume drivers, this field
-              is set to `-1` ("not available")
-            x-nullable: false
-          RefCount:
-            type: "integer"
-            format: "int64"
-            default: -1
-            description: |
-              The number of containers referencing this volume. This field
-              is set to `-1` if the reference-count is not available.
-            x-nullable: false
-
-  VolumeCreateOptions:
-    description: "Volume configuration"
-    type: "object"
-    title: "VolumeConfig"
-    x-go-name: "CreateOptions"
-    properties:
-      Name:
-        description: |
-          The new volume's name. If not specified, Docker generates a name.
-        type: "string"
-        x-nullable: false
-        example: "tardis"
-      Driver:
-        description: "Name of the volume driver to use."
-        type: "string"
-        default: "local"
-        x-nullable: false
-        example: "custom"
-      DriverOpts:
-        description: |
-          A mapping of driver options and values. These options are
-          passed directly to the driver and are driver specific.
-        type: "object"
-        additionalProperties:
-          type: "string"
-        example:
-          device: "tmpfs"
-          o: "size=100m,uid=1000"
-          type: "tmpfs"
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        additionalProperties:
-          type: "string"
-        example:
-          com.example.some-label: "some-value"
-          com.example.some-other-label: "some-other-value"
-      ClusterVolumeSpec:
-        $ref: "#/definitions/ClusterVolumeSpec"
-
-  VolumeListResponse:
-    type: "object"
-    title: "VolumeListResponse"
-    x-go-name: "ListResponse"
-    description: "Volume list response"
-    properties:
-      Volumes:
-        type: "array"
-        description: "List of volumes"
-        items:
-          $ref: "#/definitions/Volume"
-      Warnings:
-        type: "array"
-        description: |
-          Warnings that occurred when fetching the list of volumes.
-        items:
-          type: "string"
-        example: []
-
-  Network:
-    type: "object"
-    properties:
-      Name:
-        description: |
-          Name of the network.
-        type: "string"
-        example: "my_network"
-      Id:
-        description: |
-          ID that uniquely identifies a network on a single machine.
-        type: "string"
-        example: "7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99"
-      Created:
-        description: |
-          Date and time at which the network was created in
-          [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
-        type: "string"
-        format: "dateTime"
-        example: "2016-10-19T04:33:30.360899459Z"
-      Scope:
-        description: |
-          The level at which the network exists (e.g. `swarm` for cluster-wide
-          or `local` for machine level)
-        type: "string"
-        example: "local"
-      Driver:
-        description: |
-          The name of the driver used to create the network (e.g. `bridge`,
-          `overlay`).
-        type: "string"
-        example: "overlay"
-      EnableIPv6:
-        description: |
-          Whether the network was created with IPv6 enabled.
-        type: "boolean"
-        example: false
-      IPAM:
-        $ref: "#/definitions/IPAM"
-      Internal:
-        description: |
-          Whether the network is created to only allow internal networking
-          connectivity.
-        type: "boolean"
-        default: false
-        example: false
-      Attachable:
-        description: |
-          Whether a global / swarm scope network is manually attachable by regular
-          containers from workers in swarm mode.
-        type: "boolean"
-        default: false
-        example: false
-      Ingress:
-        description: |
-          Whether the network is providing the routing-mesh for the swarm cluster.
-        type: "boolean"
-        default: false
-        example: false
-      ConfigFrom:
-        $ref: "#/definitions/ConfigReference"
-      ConfigOnly:
-        description: |
-          Whether the network is a config-only network. Config-only networks are
-          placeholder networks for network configurations to be used by other
-          networks. Config-only networks cannot be used directly to run containers
-          or services.
-        type: "boolean"
-        default: false
-      Containers:
-        description: |
-          Contains endpoints attached to the network.
-        type: "object"
-        additionalProperties:
-          $ref: "#/definitions/NetworkContainer"
-        example:
-          19a4d5d687db25203351ed79d478946f861258f018fe384f229f2efa4b23513c:
-            Name: "test"
-            EndpointID: "628cadb8bcb92de107b2a1e516cbffe463e321f548feb37697cce00ad694f21a"
-            MacAddress: "02:42:ac:13:00:02"
-            IPv4Address: "172.19.0.2/16"
-            IPv6Address: ""
-      Options:
-        description: |
-          Network-specific options uses when creating the network.
-        type: "object"
-        additionalProperties:
-          type: "string"
-        example:
-          com.docker.network.bridge.default_bridge: "true"
-          com.docker.network.bridge.enable_icc: "true"
-          com.docker.network.bridge.enable_ip_masquerade: "true"
-          com.docker.network.bridge.host_binding_ipv4: "0.0.0.0"
-          com.docker.network.bridge.name: "docker0"
-          com.docker.network.driver.mtu: "1500"
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        additionalProperties:
-          type: "string"
-        example:
-          com.example.some-label: "some-value"
-          com.example.some-other-label: "some-other-value"
-      Peers:
-        description: |
-          List of peer nodes for an overlay network. This field is only present
-          for overlay networks, and omitted for other network types.
-        type: "array"
-        items:
-          $ref: "#/definitions/PeerInfo"
-        x-nullable: true
-      # TODO: Add Services (only present when "verbose" is set).
-
-  ConfigReference:
-    description: |
-      The config-only network source to provide the configuration for
-      this network.
-    type: "object"
-    properties:
-      Network:
-        description: |
-          The name of the config-only network that provides the network's
-          configuration. The specified network must be an existing config-only
-          network. Only network names are allowed, not network IDs.
-        type: "string"
-        example: "config_only_network_01"
-
-  IPAM:
-    type: "object"
-    properties:
-      Driver:
-        description: "Name of the IPAM driver to use."
-        type: "string"
-        default: "default"
-        example: "default"
-      Config:
-        description: |
-          List of IPAM configuration options, specified as a map:
-
-          ```
-          {"Subnet": <CIDR>, "IPRange": <CIDR>, "Gateway": <IP address>, "AuxAddress": <device_name:IP address>}
-          ```
-        type: "array"
-        items:
-          $ref: "#/definitions/IPAMConfig"
-      Options:
-        description: "Driver-specific options, specified as a map."
-        type: "object"
-        additionalProperties:
-          type: "string"
-        example:
-          foo: "bar"
-
-  IPAMConfig:
-    type: "object"
-    properties:
-      Subnet:
-        type: "string"
-        example: "172.20.0.0/16"
-      IPRange:
-        type: "string"
-        example: "172.20.10.0/24"
-      Gateway:
-        type: "string"
-        example: "172.20.10.11"
-      AuxiliaryAddresses:
-        type: "object"
-        additionalProperties:
-          type: "string"
-
-  NetworkContainer:
-    type: "object"
-    properties:
-      Name:
-        type: "string"
-        example: "container_1"
-      EndpointID:
-        type: "string"
-        example: "628cadb8bcb92de107b2a1e516cbffe463e321f548feb37697cce00ad694f21a"
-      MacAddress:
-        type: "string"
-        example: "02:42:ac:13:00:02"
-      IPv4Address:
-        type: "string"
-        example: "172.19.0.2/16"
-      IPv6Address:
-        type: "string"
-        example: ""
-
-  PeerInfo:
-    description: |
-      PeerInfo represents one peer of an overlay network.
-    type: "object"
-    properties:
-      Name:
-        description:
-          ID of the peer-node in the Swarm cluster.
-        type: "string"
-        example: "6869d7c1732b"
-      IP:
-        description:
-          IP-address of the peer-node in the Swarm cluster.
-        type: "string"
-        example: "10.133.77.91"
-
-  NetworkCreateResponse:
-    description: "OK response to NetworkCreate operation"
-    type: "object"
-    title: "NetworkCreateResponse"
-    x-go-name: "CreateResponse"
-    required: [Id, Warning]
-    properties:
-      Id:
-        description: "The ID of the created network."
-        type: "string"
-        x-nullable: false
-        example: "b5c4fc71e8022147cd25de22b22173de4e3b170134117172eb595cb91b4e7e5d"
-      Warning:
-        description: "Warnings encountered when creating the container"
-        type: "string"
-        x-nullable: false
-        example: ""
-
-  BuildInfo:
-    type: "object"
-    properties:
-      id:
-        type: "string"
-      stream:
-        type: "string"
-      error:
-        type: "string"
-      errorDetail:
-        $ref: "#/definitions/ErrorDetail"
-      status:
-        type: "string"
-      progress:
-        type: "string"
-      progressDetail:
-        $ref: "#/definitions/ProgressDetail"
-      aux:
-        $ref: "#/definitions/ImageID"
-
-  BuildCache:
-    type: "object"
-    description: |
-      BuildCache contains information about a build cache record.
-    properties:
-      ID:
-        type: "string"
-        description: |
-          Unique ID of the build cache record.
-        example: "ndlpt0hhvkqcdfkputsk4cq9c"
-      Parent:
-        description: |
-          ID of the parent build cache record.
-
-          > **Deprecated**: This field is deprecated, and omitted if empty.
-        type: "string"
-        x-nullable: true
-        example: ""
-      Parents:
-        description: |
-          List of parent build cache record IDs.
-        type: "array"
-        items:
-          type: "string"
-        x-nullable: true
-        example: ["hw53o5aio51xtltp5xjp8v7fx"]
-      Type:
-        type: "string"
-        description: |
-          Cache record type.
-        example: "regular"
-        # see https://github.com/moby/buildkit/blob/fce4a32258dc9d9664f71a4831d5de10f0670677/client/diskusage.go#L75-L84
-        enum:
-          - "internal"
-          - "frontend"
-          - "source.local"
-          - "source.git.checkout"
-          - "exec.cachemount"
-          - "regular"
-      Description:
-        type: "string"
-        description: |
-          Description of the build-step that produced the build cache.
-        example: "mount / from exec /bin/sh -c echo 'Binary::apt::APT::Keep-Downloaded-Packages \"true\";' > /etc/apt/apt.conf.d/keep-cache"
-      InUse:
-        type: "boolean"
-        description: |
-          Indicates if the build cache is in use.
-        example: false
-      Shared:
-        type: "boolean"
-        description: |
-          Indicates if the build cache is shared.
-        example: true
-      Size:
-        description: |
-          Amount of disk space used by the build cache (in bytes).
-        type: "integer"
-        example: 51
-      CreatedAt:
-        description: |
-          Date and time at which the build cache was created in
-          [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
-        type: "string"
-        format: "dateTime"
-        example: "2016-08-18T10:44:24.496525531Z"
-      LastUsedAt:
-        description: |
-          Date and time at which the build cache was last used in
-          [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
-        type: "string"
-        format: "dateTime"
-        x-nullable: true
-        example: "2017-08-09T07:09:37.632105588Z"
-      UsageCount:
-        type: "integer"
-        example: 26
-
-  ImageID:
-    type: "object"
-    description: "Image ID or Digest"
-    properties:
-      ID:
-        type: "string"
-    example:
-      ID: "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c"
-
-  CreateImageInfo:
-    type: "object"
-    properties:
-      id:
-        type: "string"
-      error:
-        type: "string"
-      errorDetail:
-        $ref: "#/definitions/ErrorDetail"
-      status:
-        type: "string"
-      progress:
-        type: "string"
-      progressDetail:
-        $ref: "#/definitions/ProgressDetail"
-
-  PushImageInfo:
-    type: "object"
-    properties:
-      error:
-        type: "string"
-      status:
-        type: "string"
-      progress:
-        type: "string"
-      progressDetail:
-        $ref: "#/definitions/ProgressDetail"
-
-  ErrorDetail:
-    type: "object"
-    properties:
-      code:
-        type: "integer"
-      message:
-        type: "string"
-
-  ProgressDetail:
-    type: "object"
-    properties:
-      current:
-        type: "integer"
-      total:
-        type: "integer"
-
-  ErrorResponse:
-    description: "Represents an error."
-    type: "object"
-    required: ["message"]
-    properties:
-      message:
-        description: "The error message."
-        type: "string"
-        x-nullable: false
-    example:
-      message: "Something went wrong."
-
-  IdResponse:
-    description: "Response to an API call that returns just an Id"
-    type: "object"
-    required: ["Id"]
-    properties:
-      Id:
-        description: "The id of the newly created object."
-        type: "string"
-        x-nullable: false
-
-  EndpointSettings:
-    description: "Configuration for a network endpoint."
-    type: "object"
-    properties:
-      # Configurations
-      IPAMConfig:
-        $ref: "#/definitions/EndpointIPAMConfig"
-      Links:
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "container_1"
-          - "container_2"
-      MacAddress:
-        description: |
-          MAC address for the endpoint on this network. The network driver might ignore this parameter.
-        type: "string"
-        example: "02:42:ac:11:00:04"
-      Aliases:
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "server_x"
-          - "server_y"
-      DriverOpts:
-        description: |
-          DriverOpts is a mapping of driver options and values. These options
-          are passed directly to the driver and are driver specific.
-        type: "object"
-        x-nullable: true
-        additionalProperties:
-          type: "string"
-        example:
-          com.example.some-label: "some-value"
-          com.example.some-other-label: "some-other-value"
-
-      # Operational data
-      NetworkID:
-        description: |
-          Unique ID of the network.
-        type: "string"
-        example: "08754567f1f40222263eab4102e1c733ae697e8e354aa9cd6e18d7402835292a"
-      EndpointID:
-        description: |
-          Unique ID for the service endpoint in a Sandbox.
-        type: "string"
-        example: "b88f5b905aabf2893f3cbc4ee42d1ea7980bbc0a92e2c8922b1e1795298afb0b"
-      Gateway:
-        description: |
-          Gateway address for this network.
-        type: "string"
-        example: "172.17.0.1"
-      IPAddress:
-        description: |
-          IPv4 address.
-        type: "string"
-        example: "172.17.0.4"
-      IPPrefixLen:
-        description: |
-          Mask length of the IPv4 address.
-        type: "integer"
-        example: 16
-      IPv6Gateway:
-        description: |
-          IPv6 gateway address.
-        type: "string"
-        example: "2001:db8:2::100"
-      GlobalIPv6Address:
-        description: |
-          Global IPv6 address.
-        type: "string"
-        example: "2001:db8::5689"
-      GlobalIPv6PrefixLen:
-        description: |
-          Mask length of the global IPv6 address.
-        type: "integer"
-        format: "int64"
-        example: 64
-      DNSNames:
-        description: |
-          List of all DNS names an endpoint has on a specific network. This
-          list is based on the container name, network aliases, container short
-          ID, and hostname.
-
-          These DNS names are non-fully qualified but can contain several dots.
-          You can get fully qualified DNS names by appending `.<network-name>`.
-          For instance, if container name is `my.ctr` and the network is named
-          `testnet`, `DNSNames` will contain `my.ctr` and the FQDN will be
-          `my.ctr.testnet`.
-        type: array
-        items:
-          type: string
-        example: ["foobar", "server_x", "server_y", "my.ctr"]
-
-  EndpointIPAMConfig:
-    description: |
-      EndpointIPAMConfig represents an endpoint's IPAM configuration.
-    type: "object"
-    x-nullable: true
-    properties:
-      IPv4Address:
-        type: "string"
-        example: "172.20.30.33"
-      IPv6Address:
-        type: "string"
-        example: "2001:db8:abcd::3033"
-      LinkLocalIPs:
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "169.254.34.68"
-          - "fe80::3468"
-
-  PluginMount:
-    type: "object"
-    x-nullable: false
-    required: [Name, Description, Settable, Source, Destination, Type, Options]
-    properties:
-      Name:
-        type: "string"
-        x-nullable: false
-        example: "some-mount"
-      Description:
-        type: "string"
-        x-nullable: false
-        example: "This is a mount that's used by the plugin."
-      Settable:
-        type: "array"
-        items:
-          type: "string"
-      Source:
-        type: "string"
-        example: "/var/lib/docker/plugins/"
-      Destination:
-        type: "string"
-        x-nullable: false
-        example: "/mnt/state"
-      Type:
-        type: "string"
-        x-nullable: false
-        example: "bind"
-      Options:
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "rbind"
-          - "rw"
-
-  PluginDevice:
-    type: "object"
-    required: [Name, Description, Settable, Path]
-    x-nullable: false
-    properties:
-      Name:
-        type: "string"
-        x-nullable: false
-      Description:
-        type: "string"
-        x-nullable: false
-      Settable:
-        type: "array"
-        items:
-          type: "string"
-      Path:
-        type: "string"
-        example: "/dev/fuse"
-
-  PluginEnv:
-    type: "object"
-    x-nullable: false
-    required: [Name, Description, Settable, Value]
-    properties:
-      Name:
-        x-nullable: false
-        type: "string"
-      Description:
-        x-nullable: false
-        type: "string"
-      Settable:
-        type: "array"
-        items:
-          type: "string"
-      Value:
-        type: "string"
-
-  PluginInterfaceType:
-    type: "object"
-    x-nullable: false
-    required: [Prefix, Capability, Version]
-    properties:
-      Prefix:
-        type: "string"
-        x-nullable: false
-      Capability:
-        type: "string"
-        x-nullable: false
-      Version:
-        type: "string"
-        x-nullable: false
-
-  PluginPrivilege:
-    description: |
-      Describes a permission the user has to accept upon installing
-      the plugin.
-    type: "object"
-    x-go-name: "PluginPrivilege"
-    properties:
-      Name:
-        type: "string"
-        example: "network"
-      Description:
-        type: "string"
-      Value:
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "host"
-
-  Plugin:
-    description: "A plugin for the Engine API"
-    type: "object"
-    required: [Settings, Enabled, Config, Name]
-    properties:
-      Id:
-        type: "string"
-        example: "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078"
-      Name:
-        type: "string"
-        x-nullable: false
-        example: "tiborvass/sample-volume-plugin"
-      Enabled:
-        description:
-          True if the plugin is running. False if the plugin is not running,
-          only installed.
-        type: "boolean"
-        x-nullable: false
-        example: true
-      Settings:
-        description: "Settings that can be modified by users."
-        type: "object"
-        x-nullable: false
-        required: [Args, Devices, Env, Mounts]
-        properties:
-          Mounts:
-            type: "array"
-            items:
-              $ref: "#/definitions/PluginMount"
-          Env:
-            type: "array"
-            items:
-              type: "string"
-            example:
-              - "DEBUG=0"
-          Args:
-            type: "array"
-            items:
-              type: "string"
-          Devices:
-            type: "array"
-            items:
-              $ref: "#/definitions/PluginDevice"
-      PluginReference:
-        description: "plugin remote reference used to push/pull the plugin"
-        type: "string"
-        x-nullable: false
-        example: "localhost:5000/tiborvass/sample-volume-plugin:latest"
-      Config:
-        description: "The config of a plugin."
-        type: "object"
-        x-nullable: false
-        required:
-          - Description
-          - Documentation
-          - Interface
-          - Entrypoint
-          - WorkDir
-          - Network
-          - Linux
-          - PidHost
-          - PropagatedMount
-          - IpcHost
-          - Mounts
-          - Env
-          - Args
-        properties:
-          DockerVersion:
-            description: "Docker Version used to create the plugin"
-            type: "string"
-            x-nullable: false
-            example: "17.06.0-ce"
-          Description:
-            type: "string"
-            x-nullable: false
-            example: "A sample volume plugin for Docker"
-          Documentation:
-            type: "string"
-            x-nullable: false
-            example: "https://docs.docker.com/engine/extend/plugins/"
-          Interface:
-            description: "The interface between Docker and the plugin"
-            x-nullable: false
-            type: "object"
-            required: [Types, Socket]
-            properties:
-              Types:
-                type: "array"
-                items:
-                  $ref: "#/definitions/PluginInterfaceType"
-                example:
-                  - "docker.volumedriver/1.0"
-              Socket:
-                type: "string"
-                x-nullable: false
-                example: "plugins.sock"
-              ProtocolScheme:
-                type: "string"
-                example: "some.protocol/v1.0"
-                description: "Protocol to use for clients connecting to the plugin."
-                enum:
-                  - ""
-                  - "moby.plugins.http/v1"
-          Entrypoint:
-            type: "array"
-            items:
-              type: "string"
-            example:
-              - "/usr/bin/sample-volume-plugin"
-              - "/data"
-          WorkDir:
-            type: "string"
-            x-nullable: false
-            example: "/bin/"
-          User:
-            type: "object"
-            x-nullable: false
-            properties:
-              UID:
-                type: "integer"
-                format: "uint32"
-                example: 1000
-              GID:
-                type: "integer"
-                format: "uint32"
-                example: 1000
-          Network:
-            type: "object"
-            x-nullable: false
-            required: [Type]
-            properties:
-              Type:
-                x-nullable: false
-                type: "string"
-                example: "host"
-          Linux:
-            type: "object"
-            x-nullable: false
-            required: [Capabilities, AllowAllDevices, Devices]
-            properties:
-              Capabilities:
-                type: "array"
-                items:
-                  type: "string"
-                example:
-                  - "CAP_SYS_ADMIN"
-                  - "CAP_SYSLOG"
-              AllowAllDevices:
-                type: "boolean"
-                x-nullable: false
-                example: false
-              Devices:
-                type: "array"
-                items:
-                  $ref: "#/definitions/PluginDevice"
-          PropagatedMount:
-            type: "string"
-            x-nullable: false
-            example: "/mnt/volumes"
-          IpcHost:
-            type: "boolean"
-            x-nullable: false
-            example: false
-          PidHost:
-            type: "boolean"
-            x-nullable: false
-            example: false
-          Mounts:
-            type: "array"
-            items:
-              $ref: "#/definitions/PluginMount"
-          Env:
-            type: "array"
-            items:
-              $ref: "#/definitions/PluginEnv"
-            example:
-              - Name: "DEBUG"
-                Description: "If set, prints debug messages"
-                Settable: null
-                Value: "0"
-          Args:
-            type: "object"
-            x-nullable: false
-            required: [Name, Description, Settable, Value]
-            properties:
-              Name:
-                x-nullable: false
-                type: "string"
-                example: "args"
-              Description:
-                x-nullable: false
-                type: "string"
-                example: "command line arguments"
-              Settable:
-                type: "array"
-                items:
-                  type: "string"
-              Value:
-                type: "array"
-                items:
-                  type: "string"
-          rootfs:
-            type: "object"
-            properties:
-              type:
-                type: "string"
-                example: "layers"
-              diff_ids:
-                type: "array"
-                items:
-                  type: "string"
-                example:
-                  - "sha256:675532206fbf3030b8458f88d6e26d4eb1577688a25efec97154c94e8b6b4887"
-                  - "sha256:e216a057b1cb1efc11f8a268f37ef62083e70b1b38323ba252e25ac88904a7e8"
-
-  ObjectVersion:
-    description: |
-      The version number of the object such as node, service, etc. This is needed
-      to avoid conflicting writes. The client must send the version number along
-      with the modified specification when updating these objects.
-
-      This approach ensures safe concurrency and determinism in that the change
-      on the object may not be applied if the version number has changed from the
-      last read. In other words, if two update requests specify the same base
-      version, only one of the requests can succeed. As a result, two separate
-      update requests that happen at the same time will not unintentionally
-      overwrite each other.
-    type: "object"
-    properties:
-      Index:
-        type: "integer"
-        format: "uint64"
-        example: 373531
-
-  NodeSpec:
-    type: "object"
-    properties:
-      Name:
-        description: "Name for the node."
-        type: "string"
-        example: "my-node"
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        additionalProperties:
-          type: "string"
-      Role:
-        description: "Role of the node."
-        type: "string"
-        enum:
-          - "worker"
-          - "manager"
-        example: "manager"
-      Availability:
-        description: "Availability of the node."
-        type: "string"
-        enum:
-          - "active"
-          - "pause"
-          - "drain"
-        example: "active"
-    example:
-      Availability: "active"
-      Name: "node-name"
-      Role: "manager"
-      Labels:
-        foo: "bar"
-
-  Node:
-    type: "object"
-    properties:
-      ID:
-        type: "string"
-        example: "24ifsmvkjbyhk"
-      Version:
-        $ref: "#/definitions/ObjectVersion"
-      CreatedAt:
-        description: |
-          Date and time at which the node was added to the swarm in
-          [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
-        type: "string"
-        format: "dateTime"
-        example: "2016-08-18T10:44:24.496525531Z"
-      UpdatedAt:
-        description: |
-          Date and time at which the node was last updated in
-          [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
-        type: "string"
-        format: "dateTime"
-        example: "2017-08-09T07:09:37.632105588Z"
-      Spec:
-        $ref: "#/definitions/NodeSpec"
-      Description:
-        $ref: "#/definitions/NodeDescription"
-      Status:
-        $ref: "#/definitions/NodeStatus"
-      ManagerStatus:
-        $ref: "#/definitions/ManagerStatus"
-
-  NodeDescription:
-    description: |
-      NodeDescription encapsulates the properties of the Node as reported by the
-      agent.
-    type: "object"
-    properties:
-      Hostname:
-        type: "string"
-        example: "bf3067039e47"
-      Platform:
-        $ref: "#/definitions/Platform"
-      Resources:
-        $ref: "#/definitions/ResourceObject"
-      Engine:
-        $ref: "#/definitions/EngineDescription"
-      TLSInfo:
-        $ref: "#/definitions/TLSInfo"
-
-  Platform:
-    description: |
-      Platform represents the platform (Arch/OS).
-    type: "object"
-    properties:
-      Architecture:
-        description: |
-          Architecture represents the hardware architecture (for example,
-          `x86_64`).
-        type: "string"
-        example: "x86_64"
-      OS:
-        description: |
-          OS represents the Operating System (for example, `linux` or `windows`).
-        type: "string"
-        example: "linux"
-
-  EngineDescription:
-    description: "EngineDescription provides information about an engine."
-    type: "object"
-    properties:
-      EngineVersion:
-        type: "string"
-        example: "17.06.0"
-      Labels:
-        type: "object"
-        additionalProperties:
-          type: "string"
-        example:
-          foo: "bar"
-      Plugins:
-        type: "array"
-        items:
-          type: "object"
-          properties:
-            Type:
-              type: "string"
-            Name:
-              type: "string"
-        example:
-          - Type: "Log"
-            Name: "awslogs"
-          - Type: "Log"
-            Name: "fluentd"
-          - Type: "Log"
-            Name: "gcplogs"
-          - Type: "Log"
-            Name: "gelf"
-          - Type: "Log"
-            Name: "journald"
-          - Type: "Log"
-            Name: "json-file"
-          - Type: "Log"
-            Name: "splunk"
-          - Type: "Log"
-            Name: "syslog"
-          - Type: "Network"
-            Name: "bridge"
-          - Type: "Network"
-            Name: "host"
-          - Type: "Network"
-            Name: "ipvlan"
-          - Type: "Network"
-            Name: "macvlan"
-          - Type: "Network"
-            Name: "null"
-          - Type: "Network"
-            Name: "overlay"
-          - Type: "Volume"
-            Name: "local"
-          - Type: "Volume"
-            Name: "localhost:5000/vieux/sshfs:latest"
-          - Type: "Volume"
-            Name: "vieux/sshfs:latest"
-
-  TLSInfo:
-    description: |
-      Information about the issuer of leaf TLS certificates and the trusted root
-      CA certificate.
-    type: "object"
-    properties:
-      TrustRoot:
-        description: |
-          The root CA certificate(s) that are used to validate leaf TLS
-          certificates.
-        type: "string"
-      CertIssuerSubject:
-        description:
-          The base64-url-safe-encoded raw subject bytes of the issuer.
-        type: "string"
-      CertIssuerPublicKey:
-        description: |
-          The base64-url-safe-encoded raw public key bytes of the issuer.
-        type: "string"
-    example:
-      TrustRoot: |
-        -----BEGIN CERTIFICATE-----
-        MIIBajCCARCgAwIBAgIUbYqrLSOSQHoxD8CwG6Bi2PJi9c8wCgYIKoZIzj0EAwIw
-        EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTcwNDI0MjE0MzAwWhcNMzcwNDE5MjE0
-        MzAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH
-        A0IABJk/VyMPYdaqDXJb/VXh5n/1Yuv7iNrxV3Qb3l06XD46seovcDWs3IZNV1lf
-        3Skyr0ofcchipoiHkXBODojJydSjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
-        Af8EBTADAQH/MB0GA1UdDgQWBBRUXxuRcnFjDfR/RIAUQab8ZV/n4jAKBggqhkjO
-        PQQDAgNIADBFAiAy+JTe6Uc3KyLCMiqGl2GyWGQqQDEcO3/YG36x7om65AIhAJvz
-        pxv6zFeVEkAEEkqIYi0omA9+CjanB/6Bz4n1uw8H
-        -----END CERTIFICATE-----
-      CertIssuerSubject: "MBMxETAPBgNVBAMTCHN3YXJtLWNh"
-      CertIssuerPublicKey: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmT9XIw9h1qoNclv9VeHmf/Vi6/uI2vFXdBveXTpcPjqx6i9wNazchk1XWV/dKTKvSh9xyGKmiIeRcE4OiMnJ1A=="
-
-  NodeStatus:
-    description: |
-      NodeStatus represents the status of a node.
-
-      It provides the current status of the node, as seen by the manager.
-    type: "object"
-    properties:
-      State:
-        $ref: "#/definitions/NodeState"
-      Message:
-        type: "string"
-        example: ""
-      Addr:
-        description: "IP address of the node."
-        type: "string"
-        example: "172.17.0.2"
-
-  NodeState:
-    description: "NodeState represents the state of a node."
-    type: "string"
-    enum:
-      - "unknown"
-      - "down"
-      - "ready"
-      - "disconnected"
-    example: "ready"
-
-  ManagerStatus:
-    description: |
-      ManagerStatus represents the status of a manager.
-
-      It provides the current status of a node's manager component, if the node
-      is a manager.
-    x-nullable: true
-    type: "object"
-    properties:
-      Leader:
-        type: "boolean"
-        default: false
-        example: true
-      Reachability:
-        $ref: "#/definitions/Reachability"
-      Addr:
-        description: |
-          The IP address and port at which the manager is reachable.
-        type: "string"
-        example: "10.0.0.46:2377"
-
-  Reachability:
-    description: "Reachability represents the reachability of a node."
-    type: "string"
-    enum:
-      - "unknown"
-      - "unreachable"
-      - "reachable"
-    example: "reachable"
-
-  SwarmSpec:
-    description: "User modifiable swarm configuration."
-    type: "object"
-    properties:
-      Name:
-        description: "Name of the swarm."
-        type: "string"
-        example: "default"
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        additionalProperties:
-          type: "string"
-        example:
-          com.example.corp.type: "production"
-          com.example.corp.department: "engineering"
-      Orchestration:
-        description: "Orchestration configuration."
-        type: "object"
-        x-nullable: true
-        properties:
-          TaskHistoryRetentionLimit:
-            description: |
-              The number of historic tasks to keep per instance or node. If
-              negative, never remove completed or failed tasks.
-            type: "integer"
-            format: "int64"
-            example: 10
-      Raft:
-        description: "Raft configuration."
-        type: "object"
-        properties:
-          SnapshotInterval:
-            description: "The number of log entries between snapshots."
-            type: "integer"
-            format: "uint64"
-            example: 10000
-          KeepOldSnapshots:
-            description: |
-              The number of snapshots to keep beyond the current snapshot.
-            type: "integer"
-            format: "uint64"
-          LogEntriesForSlowFollowers:
-            description: |
-              The number of log entries to keep around to sync up slow followers
-              after a snapshot is created.
-            type: "integer"
-            format: "uint64"
-            example: 500
-          ElectionTick:
-            description: |
-              The number of ticks that a follower will wait for a message from
-              the leader before becoming a candidate and starting an election.
-              `ElectionTick` must be greater than `HeartbeatTick`.
-
-              A tick currently defaults to one second, so these translate
-              directly to seconds currently, but this is NOT guaranteed.
-            type: "integer"
-            example: 3
-          HeartbeatTick:
-            description: |
-              The number of ticks between heartbeats. Every HeartbeatTick ticks,
-              the leader will send a heartbeat to the followers.
-
-              A tick currently defaults to one second, so these translate
-              directly to seconds currently, but this is NOT guaranteed.
-            type: "integer"
-            example: 1
-      Dispatcher:
-        description: "Dispatcher configuration."
-        type: "object"
-        x-nullable: true
-        properties:
-          HeartbeatPeriod:
-            description: |
-              The delay for an agent to send a heartbeat to the dispatcher.
-            type: "integer"
-            format: "int64"
-            example: 5000000000
-      CAConfig:
-        description: "CA configuration."
-        type: "object"
-        x-nullable: true
-        properties:
-          NodeCertExpiry:
-            description: "The duration node certificates are issued for."
-            type: "integer"
-            format: "int64"
-            example: 7776000000000000
-          ExternalCAs:
-            description: |
-              Configuration for forwarding signing requests to an external
-              certificate authority.
-            type: "array"
-            items:
-              type: "object"
-              properties:
-                Protocol:
-                  description: |
-                    Protocol for communication with the external CA (currently
-                    only `cfssl` is supported).
-                  type: "string"
-                  enum:
-                    - "cfssl"
-                  default: "cfssl"
-                URL:
-                  description: |
-                    URL where certificate signing requests should be sent.
-                  type: "string"
-                Options:
-                  description: |
-                    An object with key/value pairs that are interpreted as
-                    protocol-specific options for the external CA driver.
-                  type: "object"
-                  additionalProperties:
-                    type: "string"
-                CACert:
-                  description: |
-                    The root CA certificate (in PEM format) this external CA uses
-                    to issue TLS certificates (assumed to be to the current swarm
-                    root CA certificate if not provided).
-                  type: "string"
-          SigningCACert:
-            description: |
-              The desired signing CA certificate for all swarm node TLS leaf
-              certificates, in PEM format.
-            type: "string"
-          SigningCAKey:
-            description: |
-              The desired signing CA key for all swarm node TLS leaf certificates,
-              in PEM format.
-            type: "string"
-          ForceRotate:
-            description: |
-              An integer whose purpose is to force swarm to generate a new
-              signing CA certificate and key, if none have been specified in
-              `SigningCACert` and `SigningCAKey`
-            format: "uint64"
-            type: "integer"
-      EncryptionConfig:
-        description: "Parameters related to encryption-at-rest."
-        type: "object"
-        properties:
-          AutoLockManagers:
-            description: |
-              If set, generate a key and use it to lock data stored on the
-              managers.
-            type: "boolean"
-            example: false
-      TaskDefaults:
-        description: "Defaults for creating tasks in this cluster."
-        type: "object"
-        properties:
-          LogDriver:
-            description: |
-              The log driver to use for tasks created in the orchestrator if
-              unspecified by a service.
-
-              Updating this value only affects new tasks. Existing tasks continue
-              to use their previously configured log driver until recreated.
-            type: "object"
-            properties:
-              Name:
-                description: |
-                  The log driver to use as a default for new tasks.
-                type: "string"
-                example: "json-file"
-              Options:
-                description: |
-                  Driver-specific options for the selected log driver, specified
-                  as key/value pairs.
-                type: "object"
-                additionalProperties:
-                  type: "string"
-                example:
-                  "max-file": "10"
-                  "max-size": "100m"
-
-  # The Swarm information for `GET /info`. It is the same as `GET /swarm`, but
-  # without `JoinTokens`.
-  ClusterInfo:
-    description: |
-      ClusterInfo represents information about the swarm as is returned by the
-      "/info" endpoint. Join-tokens are not included.
-    x-nullable: true
-    type: "object"
-    properties:
-      ID:
-        description: "The ID of the swarm."
-        type: "string"
-        example: "abajmipo7b4xz5ip2nrla6b11"
-      Version:
-        $ref: "#/definitions/ObjectVersion"
-      CreatedAt:
-        description: |
-          Date and time at which the swarm was initialised in
-          [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
-        type: "string"
-        format: "dateTime"
-        example: "2016-08-18T10:44:24.496525531Z"
-      UpdatedAt:
-        description: |
-          Date and time at which the swarm was last updated in
-          [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.
-        type: "string"
-        format: "dateTime"
-        example: "2017-08-09T07:09:37.632105588Z"
-      Spec:
-        $ref: "#/definitions/SwarmSpec"
-      TLSInfo:
-        $ref: "#/definitions/TLSInfo"
-      RootRotationInProgress:
-        description: |
-          Whether there is currently a root CA rotation in progress for the swarm
-        type: "boolean"
-        example: false
-      DataPathPort:
-        description: |
-          DataPathPort specifies the data path port number for data traffic.
-          Acceptable port range is 1024 to 49151.
-          If no port is set or is set to 0, the default port (4789) is used.
-        type: "integer"
-        format: "uint32"
-        default: 4789
-        example: 4789
-      DefaultAddrPool:
-        description: |
-          Default Address Pool specifies default subnet pools for global scope
-          networks.
-        type: "array"
-        items:
-          type: "string"
-          format: "CIDR"
-          example: ["10.10.0.0/16", "20.20.0.0/16"]
-      SubnetSize:
-        description: |
-          SubnetSize specifies the subnet size of the networks created from the
-          default subnet pool.
-        type: "integer"
-        format: "uint32"
-        maximum: 29
-        default: 24
-        example: 24
-
-  JoinTokens:
-    description: |
-      JoinTokens contains the tokens workers and managers need to join the swarm.
-    type: "object"
-    properties:
-      Worker:
-        description: |
-          The token workers can use to join the swarm.
-        type: "string"
-        example: "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx"
-      Manager:
-        description: |
-          The token managers can use to join the swarm.
-        type: "string"
-        example: "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2"
-
-  Swarm:
-    type: "object"
-    allOf:
-      - $ref: "#/definitions/ClusterInfo"
-      - type: "object"
-        properties:
-          JoinTokens:
-            $ref: "#/definitions/JoinTokens"
-
-  TaskSpec:
-    description: "User modifiable task configuration."
-    type: "object"
-    properties:
-      PluginSpec:
-        type: "object"
-        description: |
-          Plugin spec for the service.  *(Experimental release only.)*
-
-          <p><br /></p>
-
-          > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are
-          > mutually exclusive. PluginSpec is only used when the Runtime field
-          > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime
-          > field is set to `attachment`.
-        properties:
-          Name:
-            description: "The name or 'alias' to use for the plugin."
-            type: "string"
-          Remote:
-            description: "The plugin image reference to use."
-            type: "string"
-          Disabled:
-            description: "Disable the plugin once scheduled."
-            type: "boolean"
-          PluginPrivilege:
-            type: "array"
-            items:
-              $ref: "#/definitions/PluginPrivilege"
-      ContainerSpec:
-        type: "object"
-        description: |
-          Container spec for the service.
-
-          <p><br /></p>
-
-          > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are
-          > mutually exclusive. PluginSpec is only used when the Runtime field
-          > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime
-          > field is set to `attachment`.
-        properties:
-          Image:
-            description: "The image name to use for the container"
-            type: "string"
-          Labels:
-            description: "User-defined key/value data."
-            type: "object"
-            additionalProperties:
-              type: "string"
-          Command:
-            description: "The command to be run in the image."
-            type: "array"
-            items:
-              type: "string"
-          Args:
-            description: "Arguments to the command."
-            type: "array"
-            items:
-              type: "string"
-          Hostname:
-            description: |
-              The hostname to use for the container, as a valid
-              [RFC 1123](https://tools.ietf.org/html/rfc1123) hostname.
-            type: "string"
-          Env:
-            description: |
-              A list of environment variables in the form `VAR=value`.
-            type: "array"
-            items:
-              type: "string"
-          Dir:
-            description: "The working directory for commands to run in."
-            type: "string"
-          User:
-            description: "The user inside the container."
-            type: "string"
-          Groups:
-            type: "array"
-            description: |
-              A list of additional groups that the container process will run as.
-            items:
-              type: "string"
-          Privileges:
-            type: "object"
-            description: "Security options for the container"
-            properties:
-              CredentialSpec:
-                type: "object"
-                description: "CredentialSpec for managed service account (Windows only)"
-                properties:
-                  Config:
-                    type: "string"
-                    example: "0bt9dmxjvjiqermk6xrop3ekq"
-                    description: |
-                      Load credential spec from a Swarm Config with the given ID.
-                      The specified config must also be present in the Configs
-                      field with the Runtime property set.
-
-                      <p><br /></p>
-
-
-                      > **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`,
-                      > and `CredentialSpec.Config` are mutually exclusive.
-                  File:
-                    type: "string"
-                    example: "spec.json"
-                    description: |
-                      Load credential spec from this file. The file is read by
-                      the daemon, and must be present in the `CredentialSpecs`
-                      subdirectory in the docker data directory, which defaults
-                      to `C:\ProgramData\Docker\` on Windows.
-
-                      For example, specifying `spec.json` loads
-                      `C:\ProgramData\Docker\CredentialSpecs\spec.json`.
-
-                      <p><br /></p>
-
-                      > **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`,
-                      > and `CredentialSpec.Config` are mutually exclusive.
-                  Registry:
-                    type: "string"
-                    description: |
-                      Load credential spec from this value in the Windows
-                      registry. The specified registry value must be located in:
-
-                      `HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs`
-
-                      <p><br /></p>
-
-
-                      > **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`,
-                      > and `CredentialSpec.Config` are mutually exclusive.
-              SELinuxContext:
-                type: "object"
-                description: "SELinux labels of the container"
-                properties:
-                  Disable:
-                    type: "boolean"
-                    description: "Disable SELinux"
-                  User:
-                    type: "string"
-                    description: "SELinux user label"
-                  Role:
-                    type: "string"
-                    description: "SELinux role label"
-                  Type:
-                    type: "string"
-                    description: "SELinux type label"
-                  Level:
-                    type: "string"
-                    description: "SELinux level label"
-              Seccomp:
-                type: "object"
-                description: "Options for configuring seccomp on the container"
-                properties:
-                  Mode:
-                    type: "string"
-                    enum:
-                      - "default"
-                      - "unconfined"
-                      - "custom"
-                  Profile:
-                    description: "The custom seccomp profile as a json object"
-                    type: "string"
-              AppArmor:
-                type: "object"
-                description: "Options for configuring AppArmor on the container"
-                properties:
-                  Mode:
-                    type: "string"
-                    enum:
-                      - "default"
-                      - "disabled"
-              NoNewPrivileges:
-                type: "boolean"
-                description: "Configuration of the no_new_privs bit in the container"
-
-          TTY:
-            description: "Whether a pseudo-TTY should be allocated."
-            type: "boolean"
-          OpenStdin:
-            description: "Open `stdin`"
-            type: "boolean"
-          ReadOnly:
-            description: "Mount the container's root filesystem as read only."
-            type: "boolean"
-          Mounts:
-            description: |
-              Specification for mounts to be added to containers created as part
-              of the service.
-            type: "array"
-            items:
-              $ref: "#/definitions/Mount"
-          StopSignal:
-            description: "Signal to stop the container."
-            type: "string"
-          StopGracePeriod:
-            description: |
-              Amount of time to wait for the container to terminate before
-              forcefully killing it.
-            type: "integer"
-            format: "int64"
-          HealthCheck:
-            $ref: "#/definitions/HealthConfig"
-          Hosts:
-            type: "array"
-            description: |
-              A list of hostname/IP mappings to add to the container's `hosts`
-              file. The format of extra hosts is specified in the
-              [hosts(5)](http://man7.org/linux/man-pages/man5/hosts.5.html)
-              man page:
-
-                  IP_address canonical_hostname [aliases...]
-            items:
-              type: "string"
-          DNSConfig:
-            description: |
-              Specification for DNS related configurations in resolver configuration
-              file (`resolv.conf`).
-            type: "object"
-            properties:
-              Nameservers:
-                description: "The IP addresses of the name servers."
-                type: "array"
-                items:
-                  type: "string"
-              Search:
-                description: "A search list for host-name lookup."
-                type: "array"
-                items:
-                  type: "string"
-              Options:
-                description: |
-                  A list of internal resolver variables to be modified (e.g.,
-                  `debug`, `ndots:3`, etc.).
-                type: "array"
-                items:
-                  type: "string"
-          Secrets:
-            description: |
-              Secrets contains references to zero or more secrets that will be
-              exposed to the service.
-            type: "array"
-            items:
-              type: "object"
-              properties:
-                File:
-                  description: |
-                    File represents a specific target that is backed by a file.
-                  type: "object"
-                  properties:
-                    Name:
-                      description: |
-                        Name represents the final filename in the filesystem.
-                      type: "string"
-                    UID:
-                      description: "UID represents the file UID."
-                      type: "string"
-                    GID:
-                      description: "GID represents the file GID."
-                      type: "string"
-                    Mode:
-                      description: "Mode represents the FileMode of the file."
-                      type: "integer"
-                      format: "uint32"
-                SecretID:
-                  description: |
-                    SecretID represents the ID of the specific secret that we're
-                    referencing.
-                  type: "string"
-                SecretName:
-                  description: |
-                    SecretName is the name of the secret that this references,
-                    but this is just provided for lookup/display purposes. The
-                    secret in the reference will be identified by its ID.
-                  type: "string"
-          OomScoreAdj:
-            type: "integer"
-            format: "int64"
-            description: |
-              An integer value containing the score given to the container in
-              order to tune OOM killer preferences.
-            example: 0
-          Configs:
-            description: |
-              Configs contains references to zero or more configs that will be
-              exposed to the service.
-            type: "array"
-            items:
-              type: "object"
-              properties:
-                File:
-                  description: |
-                    File represents a specific target that is backed by a file.
-
-                    <p><br /><p>
-
-                    > **Note**: `Configs.File` and `Configs.Runtime` are mutually exclusive
-                  type: "object"
-                  properties:
-                    Name:
-                      description: |
-                        Name represents the final filename in the filesystem.
-                      type: "string"
-                    UID:
-                      description: "UID represents the file UID."
-                      type: "string"
-                    GID:
-                      description: "GID represents the file GID."
-                      type: "string"
-                    Mode:
-                      description: "Mode represents the FileMode of the file."
-                      type: "integer"
-                      format: "uint32"
-                Runtime:
-                  description: |
-                    Runtime represents a target that is not mounted into the
-                    container but is used by the task
-
-                    <p><br /><p>
-
-                    > **Note**: `Configs.File` and `Configs.Runtime` are mutually
-                    > exclusive
-                  type: "object"
-                ConfigID:
-                  description: |
-                    ConfigID represents the ID of the specific config that we're
-                    referencing.
-                  type: "string"
-                ConfigName:
-                  description: |
-                    ConfigName is the name of the config that this references,
-                    but this is just provided for lookup/display purposes. The
-                    config in the reference will be identified by its ID.
-                  type: "string"
-          Isolation:
-            type: "string"
-            description: |
-              Isolation technology of the containers running the service.
-              (Windows only)
-            enum:
-              - "default"
-              - "process"
-              - "hyperv"
-              - ""
-          Init:
-            description: |
-              Run an init inside the container that forwards signals and reaps
-              processes. This field is omitted if empty, and the default (as
-              configured on the daemon) is used.
-            type: "boolean"
-            x-nullable: true
-          Sysctls:
-            description: |
-              Set kernel namedspaced parameters (sysctls) in the container.
-              The Sysctls option on services accepts the same sysctls as the
-              are supported on containers. Note that while the same sysctls are
-              supported, no guarantees or checks are made about their
-              suitability for a clustered environment, and it's up to the user
-              to determine whether a given sysctl will work properly in a
-              Service.
-            type: "object"
-            additionalProperties:
-              type: "string"
-          # This option is not used by Windows containers
-          CapabilityAdd:
-            type: "array"
-            description: |
-              A list of kernel capabilities to add to the default set
-              for the container.
-            items:
-              type: "string"
-            example:
-              - "CAP_NET_RAW"
-              - "CAP_SYS_ADMIN"
-              - "CAP_SYS_CHROOT"
-              - "CAP_SYSLOG"
-          CapabilityDrop:
-            type: "array"
-            description: |
-              A list of kernel capabilities to drop from the default set
-              for the container.
-            items:
-              type: "string"
-            example:
-              - "CAP_NET_RAW"
-          Ulimits:
-            description: |
-              A list of resource limits to set in the container. For example: `{"Name": "nofile", "Soft": 1024, "Hard": 2048}`"
-            type: "array"
-            items:
-              type: "object"
-              properties:
-                Name:
-                  description: "Name of ulimit"
-                  type: "string"
-                Soft:
-                  description: "Soft limit"
-                  type: "integer"
-                Hard:
-                  description: "Hard limit"
-                  type: "integer"
-      NetworkAttachmentSpec:
-        description: |
-          Read-only spec type for non-swarm containers attached to swarm overlay
-          networks.
-
-          <p><br /></p>
-
-          > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are
-          > mutually exclusive. PluginSpec is only used when the Runtime field
-          > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime
-          > field is set to `attachment`.
-        type: "object"
-        properties:
-          ContainerID:
-            description: "ID of the container represented by this task"
-            type: "string"
-      Resources:
-        description: |
-          Resource requirements which apply to each individual container created
-          as part of the service.
-        type: "object"
-        properties:
-          Limits:
-            description: "Define resources limits."
-            $ref: "#/definitions/Limit"
-          Reservations:
-            description: "Define resources reservation."
-            $ref: "#/definitions/ResourceObject"
-      RestartPolicy:
-        description: |
-          Specification for the restart policy which applies to containers
-          created as part of this service.
-        type: "object"
-        properties:
-          Condition:
-            description: "Condition for restart."
-            type: "string"
-            enum:
-              - "none"
-              - "on-failure"
-              - "any"
-          Delay:
-            description: "Delay between restart attempts."
-            type: "integer"
-            format: "int64"
-          MaxAttempts:
-            description: |
-              Maximum attempts to restart a given container before giving up
-              (default value is 0, which is ignored).
-            type: "integer"
-            format: "int64"
-            default: 0
-          Window:
-            description: |
-              Windows is the time window used to evaluate the restart policy
-              (default value is 0, which is unbounded).
-            type: "integer"
-            format: "int64"
-            default: 0
-      Placement:
-        type: "object"
-        properties:
-          Constraints:
-            description: |
-              An array of constraint expressions to limit the set of nodes where
-              a task can be scheduled. Constraint expressions can either use a
-              _match_ (`==`) or _exclude_ (`!=`) rule. Multiple constraints find
-              nodes that satisfy every expression (AND match). Constraints can
-              match node or Docker Engine labels as follows:
-
-              node attribute       | matches                        | example
-              ---------------------|--------------------------------|-----------------------------------------------
-              `node.id`            | Node ID                        | `node.id==2ivku8v2gvtg4`
-              `node.hostname`      | Node hostname                  | `node.hostname!=node-2`
-              `node.role`          | Node role (`manager`/`worker`) | `node.role==manager`
-              `node.platform.os`   | Node operating system          | `node.platform.os==windows`
-              `node.platform.arch` | Node architecture              | `node.platform.arch==x86_64`
-              `node.labels`        | User-defined node labels       | `node.labels.security==high`
-              `engine.labels`      | Docker Engine's labels         | `engine.labels.operatingsystem==ubuntu-24.04`
-
-              `engine.labels` apply to Docker Engine labels like operating system,
-              drivers, etc. Swarm administrators add `node.labels` for operational
-              purposes by using the [`node update endpoint`](#operation/NodeUpdate).
-
-            type: "array"
-            items:
-              type: "string"
-            example:
-              - "node.hostname!=node3.corp.example.com"
-              - "node.role!=manager"
-              - "node.labels.type==production"
-              - "node.platform.os==linux"
-              - "node.platform.arch==x86_64"
-          Preferences:
-            description: |
-              Preferences provide a way to make the scheduler aware of factors
-              such as topology. They are provided in order from highest to
-              lowest precedence.
-            type: "array"
-            items:
-              type: "object"
-              properties:
-                Spread:
-                  type: "object"
-                  properties:
-                    SpreadDescriptor:
-                      description: |
-                        label descriptor, such as `engine.labels.az`.
-                      type: "string"
-            example:
-              - Spread:
-                  SpreadDescriptor: "node.labels.datacenter"
-              - Spread:
-                  SpreadDescriptor: "node.labels.rack"
-          MaxReplicas:
-            description: |
-              Maximum number of replicas for per node (default value is 0, which
-              is unlimited)
-            type: "integer"
-            format: "int64"
-            default: 0
-          Platforms:
-            description: |
-              Platforms stores all the platforms that the service's image can
-              run on. This field is used in the platform filter for scheduling.
-              If empty, then the platform filter is off, meaning there are no
-              scheduling restrictions.
-            type: "array"
-            items:
-              $ref: "#/definitions/Platform"
-      ForceUpdate:
-        description: |
-          A counter that triggers an update even if no relevant parameters have
-          been changed.
-        type: "integer"
-      Runtime:
-        description: |
-          Runtime is the type of runtime specified for the task executor.
-        type: "string"
-      Networks:
-        description: "Specifies which networks the service should attach to."
-        type: "array"
-        items:
-          $ref: "#/definitions/NetworkAttachmentConfig"
-      LogDriver:
-        description: |
-          Specifies the log driver to use for tasks created from this spec. If
-          not present, the default one for the swarm will be used, finally
-          falling back to the engine default if not specified.
-        type: "object"
-        properties:
-          Name:
-            type: "string"
-          Options:
-            type: "object"
-            additionalProperties:
-              type: "string"
-
-  TaskState:
-    type: "string"
-    enum:
-      - "new"
-      - "allocated"
-      - "pending"
-      - "assigned"
-      - "accepted"
-      - "preparing"
-      - "ready"
-      - "starting"
-      - "running"
-      - "complete"
-      - "shutdown"
-      - "failed"
-      - "rejected"
-      - "remove"
-      - "orphaned"
-
-  ContainerStatus:
-    type: "object"
-    description: "represents the status of a container."
-    properties:
-      ContainerID:
-        type: "string"
-      PID:
-        type: "integer"
-      ExitCode:
-        type: "integer"
-
-  PortStatus:
-    type: "object"
-    description: "represents the port status of a task's host ports whose service has published host ports"
-    properties:
-      Ports:
-        type: "array"
-        items:
-          $ref: "#/definitions/EndpointPortConfig"
-
-  TaskStatus:
-    type: "object"
-    description: "represents the status of a task."
-    properties:
-      Timestamp:
-        type: "string"
-        format: "dateTime"
-      State:
-        $ref: "#/definitions/TaskState"
-      Message:
-        type: "string"
-      Err:
-        type: "string"
-      ContainerStatus:
-        $ref: "#/definitions/ContainerStatus"
-      PortStatus:
-        $ref: "#/definitions/PortStatus"
-
-  Task:
-    type: "object"
-    properties:
-      ID:
-        description: "The ID of the task."
-        type: "string"
-      Version:
-        $ref: "#/definitions/ObjectVersion"
-      CreatedAt:
-        type: "string"
-        format: "dateTime"
-      UpdatedAt:
-        type: "string"
-        format: "dateTime"
-      Name:
-        description: "Name of the task."
-        type: "string"
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        additionalProperties:
-          type: "string"
-      Spec:
-        $ref: "#/definitions/TaskSpec"
-      ServiceID:
-        description: "The ID of the service this task is part of."
-        type: "string"
-      Slot:
-        type: "integer"
-      NodeID:
-        description: "The ID of the node that this task is on."
-        type: "string"
-      AssignedGenericResources:
-        $ref: "#/definitions/GenericResources"
-      Status:
-        $ref: "#/definitions/TaskStatus"
-      DesiredState:
-        $ref: "#/definitions/TaskState"
-      JobIteration:
-        description: |
-          If the Service this Task belongs to is a job-mode service, contains
-          the JobIteration of the Service this Task was created for. Absent if
-          the Task was created for a Replicated or Global Service.
-        $ref: "#/definitions/ObjectVersion"
-    example:
-      ID: "0kzzo1i0y4jz6027t0k7aezc7"
-      Version:
-        Index: 71
-      CreatedAt: "2016-06-07T21:07:31.171892745Z"
-      UpdatedAt: "2016-06-07T21:07:31.376370513Z"
-      Spec:
-        ContainerSpec:
-          Image: "redis"
-        Resources:
-          Limits: {}
-          Reservations: {}
-        RestartPolicy:
-          Condition: "any"
-          MaxAttempts: 0
-        Placement: {}
-      ServiceID: "9mnpnzenvg8p8tdbtq4wvbkcz"
-      Slot: 1
-      NodeID: "60gvrl6tm78dmak4yl7srz94v"
-      Status:
-        Timestamp: "2016-06-07T21:07:31.290032978Z"
-        State: "running"
-        Message: "started"
-        ContainerStatus:
-          ContainerID: "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035"
-          PID: 677
-      DesiredState: "running"
-      NetworksAttachments:
-        - Network:
-            ID: "4qvuz4ko70xaltuqbt8956gd1"
-            Version:
-              Index: 18
-            CreatedAt: "2016-06-07T20:31:11.912919752Z"
-            UpdatedAt: "2016-06-07T21:07:29.955277358Z"
-            Spec:
-              Name: "ingress"
-              Labels:
-                com.docker.swarm.internal: "true"
-              DriverConfiguration: {}
-              IPAMOptions:
-                Driver: {}
-                Configs:
-                  - Subnet: "10.255.0.0/16"
-                    Gateway: "10.255.0.1"
-            DriverState:
-              Name: "overlay"
-              Options:
-                com.docker.network.driver.overlay.vxlanid_list: "256"
-            IPAMOptions:
-              Driver:
-                Name: "default"
-              Configs:
-                - Subnet: "10.255.0.0/16"
-                  Gateway: "10.255.0.1"
-          Addresses:
-            - "10.255.0.10/16"
-      AssignedGenericResources:
-        - DiscreteResourceSpec:
-            Kind: "SSD"
-            Value: 3
-        - NamedResourceSpec:
-            Kind: "GPU"
-            Value: "UUID1"
-        - NamedResourceSpec:
-            Kind: "GPU"
-            Value: "UUID2"
-
-  ServiceSpec:
-    description: "User modifiable configuration for a service."
-    type: object
-    properties:
-      Name:
-        description: "Name of the service."
-        type: "string"
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        additionalProperties:
-          type: "string"
-      TaskTemplate:
-        $ref: "#/definitions/TaskSpec"
-      Mode:
-        description: "Scheduling mode for the service."
-        type: "object"
-        properties:
-          Replicated:
-            type: "object"
-            properties:
-              Replicas:
-                type: "integer"
-                format: "int64"
-          Global:
-            type: "object"
-          ReplicatedJob:
-            description: |
-              The mode used for services with a finite number of tasks that run
-              to a completed state.
-            type: "object"
-            properties:
-              MaxConcurrent:
-                description: |
-                  The maximum number of replicas to run simultaneously.
-                type: "integer"
-                format: "int64"
-                default: 1
-              TotalCompletions:
-                description: |
-                  The total number of replicas desired to reach the Completed
-                  state. If unset, will default to the value of `MaxConcurrent`
-                type: "integer"
-                format: "int64"
-          GlobalJob:
-            description: |
-              The mode used for services which run a task to the completed state
-              on each valid node.
-            type: "object"
-      UpdateConfig:
-        description: "Specification for the update strategy of the service."
-        type: "object"
-        properties:
-          Parallelism:
-            description: |
-              Maximum number of tasks to be updated in one iteration (0 means
-              unlimited parallelism).
-            type: "integer"
-            format: "int64"
-          Delay:
-            description: "Amount of time between updates, in nanoseconds."
-            type: "integer"
-            format: "int64"
-          FailureAction:
-            description: |
-              Action to take if an updated task fails to run, or stops running
-              during the update.
-            type: "string"
-            enum:
-              - "continue"
-              - "pause"
-              - "rollback"
-          Monitor:
-            description: |
-              Amount of time to monitor each updated task for failures, in
-              nanoseconds.
-            type: "integer"
-            format: "int64"
-          MaxFailureRatio:
-            description: |
-              The fraction of tasks that may fail during an update before the
-              failure action is invoked, specified as a floating point number
-              between 0 and 1.
-            type: "number"
-            default: 0
-          Order:
-            description: |
-              The order of operations when rolling out an updated task. Either
-              the old task is shut down before the new task is started, or the
-              new task is started before the old task is shut down.
-            type: "string"
-            enum:
-              - "stop-first"
-              - "start-first"
-      RollbackConfig:
-        description: "Specification for the rollback strategy of the service."
-        type: "object"
-        properties:
-          Parallelism:
-            description: |
-              Maximum number of tasks to be rolled back in one iteration (0 means
-              unlimited parallelism).
-            type: "integer"
-            format: "int64"
-          Delay:
-            description: |
-              Amount of time between rollback iterations, in nanoseconds.
-            type: "integer"
-            format: "int64"
-          FailureAction:
-            description: |
-              Action to take if an rolled back task fails to run, or stops
-              running during the rollback.
-            type: "string"
-            enum:
-              - "continue"
-              - "pause"
-          Monitor:
-            description: |
-              Amount of time to monitor each rolled back task for failures, in
-              nanoseconds.
-            type: "integer"
-            format: "int64"
-          MaxFailureRatio:
-            description: |
-              The fraction of tasks that may fail during a rollback before the
-              failure action is invoked, specified as a floating point number
-              between 0 and 1.
-            type: "number"
-            default: 0
-          Order:
-            description: |
-              The order of operations when rolling back a task. Either the old
-              task is shut down before the new task is started, or the new task
-              is started before the old task is shut down.
-            type: "string"
-            enum:
-              - "stop-first"
-              - "start-first"
-      Networks:
-        description: |
-          Specifies which networks the service should attach to.
-
-          Deprecated: This field is deprecated since v1.44. The Networks field in TaskSpec should be used instead.
-        type: "array"
-        items:
-          $ref: "#/definitions/NetworkAttachmentConfig"
-
-      EndpointSpec:
-        $ref: "#/definitions/EndpointSpec"
-
-  EndpointPortConfig:
-    type: "object"
-    properties:
-      Name:
-        type: "string"
-      Protocol:
-        type: "string"
-        enum:
-          - "tcp"
-          - "udp"
-          - "sctp"
-      TargetPort:
-        description: "The port inside the container."
-        type: "integer"
-      PublishedPort:
-        description: "The port on the swarm hosts."
-        type: "integer"
-      PublishMode:
-        description: |
-          The mode in which port is published.
-
-          <p><br /></p>
-
-          - "ingress" makes the target port accessible on every node,
-            regardless of whether there is a task for the service running on
-            that node or not.
-          - "host" bypasses the routing mesh and publish the port directly on
-            the swarm node where that service is running.
-
-        type: "string"
-        enum:
-          - "ingress"
-          - "host"
-        default: "ingress"
-        example: "ingress"
-
-  EndpointSpec:
-    description: "Properties that can be configured to access and load balance a service."
-    type: "object"
-    properties:
-      Mode:
-        description: |
-          The mode of resolution to use for internal load balancing between tasks.
-        type: "string"
-        enum:
-          - "vip"
-          - "dnsrr"
-        default: "vip"
-      Ports:
-        description: |
-          List of exposed ports that this service is accessible on from the
-          outside. Ports can only be provided if `vip` resolution mode is used.
-        type: "array"
-        items:
-          $ref: "#/definitions/EndpointPortConfig"
-
-  Service:
-    type: "object"
-    properties:
-      ID:
-        type: "string"
-      Version:
-        $ref: "#/definitions/ObjectVersion"
-      CreatedAt:
-        type: "string"
-        format: "dateTime"
-      UpdatedAt:
-        type: "string"
-        format: "dateTime"
-      Spec:
-        $ref: "#/definitions/ServiceSpec"
-      Endpoint:
-        type: "object"
-        properties:
-          Spec:
-            $ref: "#/definitions/EndpointSpec"
-          Ports:
-            type: "array"
-            items:
-              $ref: "#/definitions/EndpointPortConfig"
-          VirtualIPs:
-            type: "array"
-            items:
-              type: "object"
-              properties:
-                NetworkID:
-                  type: "string"
-                Addr:
-                  type: "string"
-      UpdateStatus:
-        description: "The status of a service update."
-        type: "object"
-        properties:
-          State:
-            type: "string"
-            enum:
-              - "updating"
-              - "paused"
-              - "completed"
-          StartedAt:
-            type: "string"
-            format: "dateTime"
-          CompletedAt:
-            type: "string"
-            format: "dateTime"
-          Message:
-            type: "string"
-      ServiceStatus:
-        description: |
-          The status of the service's tasks. Provided only when requested as
-          part of a ServiceList operation.
-        type: "object"
-        properties:
-          RunningTasks:
-            description: |
-              The number of tasks for the service currently in the Running state.
-            type: "integer"
-            format: "uint64"
-            example: 7
-          DesiredTasks:
-            description: |
-              The number of tasks for the service desired to be running.
-              For replicated services, this is the replica count from the
-              service spec. For global services, this is computed by taking
-              count of all tasks for the service with a Desired State other
-              than Shutdown.
-            type: "integer"
-            format: "uint64"
-            example: 10
-          CompletedTasks:
-            description: |
-              The number of tasks for a job that are in the Completed state.
-              This field must be cross-referenced with the service type, as the
-              value of 0 may mean the service is not in a job mode, or it may
-              mean the job-mode service has no tasks yet Completed.
-            type: "integer"
-            format: "uint64"
-      JobStatus:
-        description: |
-          The status of the service when it is in one of ReplicatedJob or
-          GlobalJob modes. Absent on Replicated and Global mode services. The
-          JobIteration is an ObjectVersion, but unlike the Service's version,
-          does not need to be sent with an update request.
-        type: "object"
-        properties:
-          JobIteration:
-            description: |
-              JobIteration is a value increased each time a Job is executed,
-              successfully or otherwise. "Executed", in this case, means the
-              job as a whole has been started, not that an individual Task has
-              been launched. A job is "Executed" when its ServiceSpec is
-              updated. JobIteration can be used to disambiguate Tasks belonging
-              to different executions of a job.  Though JobIteration will
-              increase with each subsequent execution, it may not necessarily
-              increase by 1, and so JobIteration should not be used to
-            $ref: "#/definitions/ObjectVersion"
-          LastExecution:
-            description: |
-              The last time, as observed by the server, that this job was
-              started.
-            type: "string"
-            format: "dateTime"
-    example:
-      ID: "9mnpnzenvg8p8tdbtq4wvbkcz"
-      Version:
-        Index: 19
-      CreatedAt: "2016-06-07T21:05:51.880065305Z"
-      UpdatedAt: "2016-06-07T21:07:29.962229872Z"
-      Spec:
-        Name: "hopeful_cori"
-        TaskTemplate:
-          ContainerSpec:
-            Image: "redis"
-          Resources:
-            Limits: {}
-            Reservations: {}
-          RestartPolicy:
-            Condition: "any"
-            MaxAttempts: 0
-          Placement: {}
-          ForceUpdate: 0
-        Mode:
-          Replicated:
-            Replicas: 1
-        UpdateConfig:
-          Parallelism: 1
-          Delay: 1000000000
-          FailureAction: "pause"
-          Monitor: 15000000000
-          MaxFailureRatio: 0.15
-        RollbackConfig:
-          Parallelism: 1
-          Delay: 1000000000
-          FailureAction: "pause"
-          Monitor: 15000000000
-          MaxFailureRatio: 0.15
-        EndpointSpec:
-          Mode: "vip"
-          Ports:
-            -
-              Protocol: "tcp"
-              TargetPort: 6379
-              PublishedPort: 30001
-      Endpoint:
-        Spec:
-          Mode: "vip"
-          Ports:
-            -
-              Protocol: "tcp"
-              TargetPort: 6379
-              PublishedPort: 30001
-        Ports:
-          -
-            Protocol: "tcp"
-            TargetPort: 6379
-            PublishedPort: 30001
-        VirtualIPs:
-          -
-            NetworkID: "4qvuz4ko70xaltuqbt8956gd1"
-            Addr: "10.255.0.2/16"
-          -
-            NetworkID: "4qvuz4ko70xaltuqbt8956gd1"
-            Addr: "10.255.0.3/16"
-
-  ImageDeleteResponseItem:
-    type: "object"
-    x-go-name: "DeleteResponse"
-    properties:
-      Untagged:
-        description: "The image ID of an image that was untagged"
-        type: "string"
-      Deleted:
-        description: "The image ID of an image that was deleted"
-        type: "string"
-
-  ServiceCreateResponse:
-    type: "object"
-    description: |
-      contains the information returned to a client on the
-      creation of a new service.
-    properties:
-      ID:
-        description: "The ID of the created service."
-        type: "string"
-        x-nullable: false
-        example: "ak7w3gjqoa3kuz8xcpnyy0pvl"
-      Warnings:
-        description: |
-          Optional warning message.
-
-          FIXME(thaJeztah): this should have "omitempty" in the generated type.
-        type: "array"
-        x-nullable: true
-        items:
-          type: "string"
-        example:
-          - "unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found"
-
-  ServiceUpdateResponse:
-    type: "object"
-    properties:
-      Warnings:
-        description: "Optional warning messages"
-        type: "array"
-        items:
-          type: "string"
-    example:
-      Warnings:
-        - "unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found"
-
-  ContainerSummary:
-    type: "object"
-    properties:
-      Id:
-        description: "The ID of this container"
-        type: "string"
-        x-go-name: "ID"
-      Names:
-        description: "The names that this container has been given"
-        type: "array"
-        items:
-          type: "string"
-      Image:
-        description: "The name of the image used when creating this container"
-        type: "string"
-      ImageID:
-        description: "The ID of the image that this container was created from"
-        type: "string"
-      Command:
-        description: "Command to run when starting the container"
-        type: "string"
-      Created:
-        description: "When the container was created"
-        type: "integer"
-        format: "int64"
-      Ports:
-        description: "The ports exposed by this container"
-        type: "array"
-        items:
-          $ref: "#/definitions/Port"
-      SizeRw:
-        description: "The size of files that have been created or changed by this container"
-        type: "integer"
-        format: "int64"
-      SizeRootFs:
-        description: "The total size of all the files in this container"
-        type: "integer"
-        format: "int64"
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        additionalProperties:
-          type: "string"
-      State:
-        description: "The state of this container (e.g. `Exited`)"
-        type: "string"
-      Status:
-        description: "Additional human-readable status of this container (e.g. `Exit 0`)"
-        type: "string"
-      HostConfig:
-        type: "object"
-        properties:
-          NetworkMode:
-            type: "string"
-          Annotations:
-            description: "Arbitrary key-value metadata attached to container"
-            type: "object"
-            x-nullable: true
-            additionalProperties:
-              type: "string"
-      NetworkSettings:
-        description: "A summary of the container's network settings"
-        type: "object"
-        properties:
-          Networks:
-            type: "object"
-            additionalProperties:
-              $ref: "#/definitions/EndpointSettings"
-      Mounts:
-        type: "array"
-        items:
-          $ref: "#/definitions/MountPoint"
-
-  Driver:
-    description: "Driver represents a driver (network, logging, secrets)."
-    type: "object"
-    required: [Name]
-    properties:
-      Name:
-        description: "Name of the driver."
-        type: "string"
-        x-nullable: false
-        example: "some-driver"
-      Options:
-        description: "Key/value map of driver-specific options."
-        type: "object"
-        x-nullable: false
-        additionalProperties:
-          type: "string"
-        example:
-          OptionA: "value for driver-specific option A"
-          OptionB: "value for driver-specific option B"
-
-  SecretSpec:
-    type: "object"
-    properties:
-      Name:
-        description: "User-defined name of the secret."
-        type: "string"
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        additionalProperties:
-          type: "string"
-        example:
-          com.example.some-label: "some-value"
-          com.example.some-other-label: "some-other-value"
-      Data:
-        description: |
-          Base64-url-safe-encoded ([RFC 4648](https://tools.ietf.org/html/rfc4648#section-5))
-          data to store as secret.
-
-          This field is only used to _create_ a secret, and is not returned by
-          other endpoints.
-        type: "string"
-        example: ""
-      Driver:
-        description: |
-          Name of the secrets driver used to fetch the secret's value from an
-          external secret store.
-        $ref: "#/definitions/Driver"
-      Templating:
-        description: |
-          Templating driver, if applicable
-
-          Templating controls whether and how to evaluate the config payload as
-          a template. If no driver is set, no templating is used.
-        $ref: "#/definitions/Driver"
-
-  Secret:
-    type: "object"
-    properties:
-      ID:
-        type: "string"
-        example: "blt1owaxmitz71s9v5zh81zun"
-      Version:
-        $ref: "#/definitions/ObjectVersion"
-      CreatedAt:
-        type: "string"
-        format: "dateTime"
-        example: "2017-07-20T13:55:28.678958722Z"
-      UpdatedAt:
-        type: "string"
-        format: "dateTime"
-        example: "2017-07-20T13:55:28.678958722Z"
-      Spec:
-        $ref: "#/definitions/SecretSpec"
-
-  ConfigSpec:
-    type: "object"
-    properties:
-      Name:
-        description: "User-defined name of the config."
-        type: "string"
-      Labels:
-        description: "User-defined key/value metadata."
-        type: "object"
-        additionalProperties:
-          type: "string"
-      Data:
-        description: |
-          Base64-url-safe-encoded ([RFC 4648](https://tools.ietf.org/html/rfc4648#section-5))
-          config data.
-        type: "string"
-      Templating:
-        description: |
-          Templating driver, if applicable
-
-          Templating controls whether and how to evaluate the config payload as
-          a template. If no driver is set, no templating is used.
-        $ref: "#/definitions/Driver"
-
-  Config:
-    type: "object"
-    properties:
-      ID:
-        type: "string"
-      Version:
-        $ref: "#/definitions/ObjectVersion"
-      CreatedAt:
-        type: "string"
-        format: "dateTime"
-      UpdatedAt:
-        type: "string"
-        format: "dateTime"
-      Spec:
-        $ref: "#/definitions/ConfigSpec"
-
-  ContainerState:
-    description: |
-      ContainerState stores container's running state. It's part of ContainerJSONBase
-      and will be returned by the "inspect" command.
-    type: "object"
-    x-nullable: true
-    properties:
-      Status:
-        description: |
-          String representation of the container state. Can be one of "created",
-          "running", "paused", "restarting", "removing", "exited", or "dead".
-        type: "string"
-        enum: ["created", "running", "paused", "restarting", "removing", "exited", "dead"]
-        example: "running"
-      Running:
-        description: |
-          Whether this container is running.
-
-          Note that a running container can be _paused_. The `Running` and `Paused`
-          booleans are not mutually exclusive:
-
-          When pausing a container (on Linux), the freezer cgroup is used to suspend
-          all processes in the container. Freezing the process requires the process to
-          be running. As a result, paused containers are both `Running` _and_ `Paused`.
-
-          Use the `Status` field instead to determine if a container's state is "running".
-        type: "boolean"
-        example: true
-      Paused:
-        description: "Whether this container is paused."
-        type: "boolean"
-        example: false
-      Restarting:
-        description: "Whether this container is restarting."
-        type: "boolean"
-        example: false
-      OOMKilled:
-        description: |
-          Whether a process within this container has been killed because it ran
-          out of memory since the container was last started.
-        type: "boolean"
-        example: false
-      Dead:
-        type: "boolean"
-        example: false
-      Pid:
-        description: "The process ID of this container"
-        type: "integer"
-        example: 1234
-      ExitCode:
-        description: "The last exit code of this container"
-        type: "integer"
-        example: 0
-      Error:
-        type: "string"
-      StartedAt:
-        description: "The time when this container was last started."
-        type: "string"
-        example: "2020-01-06T09:06:59.461876391Z"
-      FinishedAt:
-        description: "The time when this container last exited."
-        type: "string"
-        example: "2020-01-06T09:07:59.461876391Z"
-      Health:
-        $ref: "#/definitions/Health"
-
-  ContainerCreateResponse:
-    description: "OK response to ContainerCreate operation"
-    type: "object"
-    title: "ContainerCreateResponse"
-    x-go-name: "CreateResponse"
-    required: [Id, Warnings]
-    properties:
-      Id:
-        description: "The ID of the created container"
-        type: "string"
-        x-nullable: false
-        example: "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743"
-      Warnings:
-        description: "Warnings encountered when creating the container"
-        type: "array"
-        x-nullable: false
-        items:
-          type: "string"
-        example: []
-
-  ContainerWaitResponse:
-    description: "OK response to ContainerWait operation"
-    type: "object"
-    x-go-name: "WaitResponse"
-    title: "ContainerWaitResponse"
-    required: [StatusCode]
-    properties:
-      StatusCode:
-        description: "Exit code of the container"
-        type: "integer"
-        format: "int64"
-        x-nullable: false
-      Error:
-        $ref: "#/definitions/ContainerWaitExitError"
-
-  ContainerWaitExitError:
-    description: "container waiting error, if any"
-    type: "object"
-    x-go-name: "WaitExitError"
-    properties:
-      Message:
-        description: "Details of an error"
-        type: "string"
-
-  SystemVersion:
-    type: "object"
-    description: |
-      Response of Engine API: GET "/version"
-    properties:
-      Platform:
-        type: "object"
-        required: [Name]
-        properties:
-          Name:
-            type: "string"
-      Components:
-        type: "array"
-        description: |
-          Information about system components
-        items:
-          type: "object"
-          x-go-name: ComponentVersion
-          required: [Name, Version]
-          properties:
-            Name:
-              description: |
-                Name of the component
-              type: "string"
-              example: "Engine"
-            Version:
-              description: |
-                Version of the component
-              type: "string"
-              x-nullable: false
-              example: "27.0.1"
-            Details:
-              description: |
-                Key/value pairs of strings with additional information about the
-                component. These values are intended for informational purposes
-                only, and their content is not defined, and not part of the API
-                specification.
-
-                These messages can be printed by the client as information to the user.
-              type: "object"
-              x-nullable: true
-      Version:
-        description: "The version of the daemon"
-        type: "string"
-        example: "27.0.1"
-      ApiVersion:
-        description: |
-          The default (and highest) API version that is supported by the daemon
-        type: "string"
-        example: "1.47"
-      MinAPIVersion:
-        description: |
-          The minimum API version that is supported by the daemon
-        type: "string"
-        example: "1.24"
-      GitCommit:
-        description: |
-          The Git commit of the source code that was used to build the daemon
-        type: "string"
-        example: "48a66213fe"
-      GoVersion:
-        description: |
-          The version Go used to compile the daemon, and the version of the Go
-          runtime in use.
-        type: "string"
-        example: "go1.22.7"
-      Os:
-        description: |
-          The operating system that the daemon is running on ("linux" or "windows")
-        type: "string"
-        example: "linux"
-      Arch:
-        description: |
-          The architecture that the daemon is running on
-        type: "string"
-        example: "amd64"
-      KernelVersion:
-        description: |
-          The kernel version (`uname -r`) that the daemon is running on.
-
-          This field is omitted when empty.
-        type: "string"
-        example: "6.8.0-31-generic"
-      Experimental:
-        description: |
-          Indicates if the daemon is started with experimental features enabled.
-
-          This field is omitted when empty / false.
-        type: "boolean"
-        example: true
-      BuildTime:
-        description: |
-          The date and time that the daemon was compiled.
-        type: "string"
-        example: "2020-06-22T15:49:27.000000000+00:00"
-
-  SystemInfo:
-    type: "object"
-    properties:
-      ID:
-        description: |
-          Unique identifier of the daemon.
-
-          <p><br /></p>
-
-          > **Note**: The format of the ID itself is not part of the API, and
-          > should not be considered stable.
-        type: "string"
-        example: "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS"
-      Containers:
-        description: "Total number of containers on the host."
-        type: "integer"
-        example: 14
-      ContainersRunning:
-        description: |
-          Number of containers with status `"running"`.
-        type: "integer"
-        example: 3
-      ContainersPaused:
-        description: |
-          Number of containers with status `"paused"`.
-        type: "integer"
-        example: 1
-      ContainersStopped:
-        description: |
-          Number of containers with status `"stopped"`.
-        type: "integer"
-        example: 10
-      Images:
-        description: |
-          Total number of images on the host.
-
-          Both _tagged_ and _untagged_ (dangling) images are counted.
-        type: "integer"
-        example: 508
-      Driver:
-        description: "Name of the storage driver in use."
-        type: "string"
-        example: "overlay2"
-      DriverStatus:
-        description: |
-          Information specific to the storage driver, provided as
-          "label" / "value" pairs.
-
-          This information is provided by the storage driver, and formatted
-          in a way consistent with the output of `docker info` on the command
-          line.
-
-          <p><br /></p>
-
-          > **Note**: The information returned in this field, including the
-          > formatting of values and labels, should not be considered stable,
-          > and may change without notice.
-        type: "array"
-        items:
-          type: "array"
-          items:
-            type: "string"
-        example:
-          - ["Backing Filesystem", "extfs"]
-          - ["Supports d_type", "true"]
-          - ["Native Overlay Diff", "true"]
-      DockerRootDir:
-        description: |
-          Root directory of persistent Docker state.
-
-          Defaults to `/var/lib/docker` on Linux, and `C:\ProgramData\docker`
-          on Windows.
-        type: "string"
-        example: "/var/lib/docker"
-      Plugins:
-        $ref: "#/definitions/PluginsInfo"
-      MemoryLimit:
-        description: "Indicates if the host has memory limit support enabled."
-        type: "boolean"
-        example: true
-      SwapLimit:
-        description: "Indicates if the host has memory swap limit support enabled."
-        type: "boolean"
-        example: true
-      KernelMemoryTCP:
-        description: |
-          Indicates if the host has kernel memory TCP limit support enabled. This
-          field is omitted if not supported.
-
-          Kernel memory TCP limits are not supported when using cgroups v2, which
-          does not support the corresponding `memory.kmem.tcp.limit_in_bytes` cgroup.
-        type: "boolean"
-        example: true
-      CpuCfsPeriod:
-        description: |
-          Indicates if CPU CFS(Completely Fair Scheduler) period is supported by
-          the host.
-        type: "boolean"
-        example: true
-      CpuCfsQuota:
-        description: |
-          Indicates if CPU CFS(Completely Fair Scheduler) quota is supported by
-          the host.
-        type: "boolean"
-        example: true
-      CPUShares:
-        description: |
-          Indicates if CPU Shares limiting is supported by the host.
-        type: "boolean"
-        example: true
-      CPUSet:
-        description: |
-          Indicates if CPUsets (cpuset.cpus, cpuset.mems) are supported by the host.
-
-          See [cpuset(7)](https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt)
-        type: "boolean"
-        example: true
-      PidsLimit:
-        description: "Indicates if the host kernel has PID limit support enabled."
-        type: "boolean"
-        example: true
-      OomKillDisable:
-        description: "Indicates if OOM killer disable is supported on the host."
-        type: "boolean"
-      IPv4Forwarding:
-        description: "Indicates IPv4 forwarding is enabled."
-        type: "boolean"
-        example: true
-      BridgeNfIptables:
-        description: "Indicates if `bridge-nf-call-iptables` is available on the host."
-        type: "boolean"
-        example: true
-      BridgeNfIp6tables:
-        description: "Indicates if `bridge-nf-call-ip6tables` is available on the host."
-        type: "boolean"
-        example: true
-      Debug:
-        description: |
-          Indicates if the daemon is running in debug-mode / with debug-level
-          logging enabled.
-        type: "boolean"
-        example: true
-      NFd:
-        description: |
-          The total number of file Descriptors in use by the daemon process.
-
-          This information is only returned if debug-mode is enabled.
-        type: "integer"
-        example: 64
-      NGoroutines:
-        description: |
-          The  number of goroutines that currently exist.
-
-          This information is only returned if debug-mode is enabled.
-        type: "integer"
-        example: 174
-      SystemTime:
-        description: |
-          Current system-time in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt)
-          format with nano-seconds.
-        type: "string"
-        example: "2017-08-08T20:28:29.06202363Z"
-      LoggingDriver:
-        description: |
-          The logging driver to use as a default for new containers.
-        type: "string"
-      CgroupDriver:
-        description: |
-          The driver to use for managing cgroups.
-        type: "string"
-        enum: ["cgroupfs", "systemd", "none"]
-        default: "cgroupfs"
-        example: "cgroupfs"
-      CgroupVersion:
-        description: |
-          The version of the cgroup.
-        type: "string"
-        enum: ["1", "2"]
-        default: "1"
-        example: "1"
-      NEventsListener:
-        description: "Number of event listeners subscribed."
-        type: "integer"
-        example: 30
-      KernelVersion:
-        description: |
-          Kernel version of the host.
-
-          On Linux, this information obtained from `uname`. On Windows this
-          information is queried from the <kbd>HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\</kbd>
-          registry value, for example _"10.0 14393 (14393.1198.amd64fre.rs1_release_sec.170427-1353)"_.
-        type: "string"
-        example: "6.8.0-31-generic"
-      OperatingSystem:
-        description: |
-          Name of the host's operating system, for example: "Ubuntu 24.04 LTS"
-          or "Windows Server 2016 Datacenter"
-        type: "string"
-        example: "Ubuntu 24.04 LTS"
-      OSVersion:
-        description: |
-          Version of the host's operating system
-
-          <p><br /></p>
-
-          > **Note**: The information returned in this field, including its
-          > very existence, and the formatting of values, should not be considered
-          > stable, and may change without notice.
-        type: "string"
-        example: "24.04"
-      OSType:
-        description: |
-          Generic type of the operating system of the host, as returned by the
-          Go runtime (`GOOS`).
-
-          Currently returned values are "linux" and "windows". A full list of
-          possible values can be found in the [Go documentation](https://go.dev/doc/install/source#environment).
-        type: "string"
-        example: "linux"
-      Architecture:
-        description: |
-          Hardware architecture of the host, as returned by the Go runtime
-          (`GOARCH`).
-
-          A full list of possible values can be found in the [Go documentation](https://go.dev/doc/install/source#environment).
-        type: "string"
-        example: "x86_64"
-      NCPU:
-        description: |
-          The number of logical CPUs usable by the daemon.
-
-          The number of available CPUs is checked by querying the operating
-          system when the daemon starts. Changes to operating system CPU
-          allocation after the daemon is started are not reflected.
-        type: "integer"
-        example: 4
-      MemTotal:
-        description: |
-          Total amount of physical memory available on the host, in bytes.
-        type: "integer"
-        format: "int64"
-        example: 2095882240
-
-      IndexServerAddress:
-        description: |
-          Address / URL of the index server that is used for image search,
-          and as a default for user authentication for Docker Hub and Docker Cloud.
-        default: "https://index.docker.io/v1/"
-        type: "string"
-        example: "https://index.docker.io/v1/"
-      RegistryConfig:
-        $ref: "#/definitions/RegistryServiceConfig"
-      GenericResources:
-        $ref: "#/definitions/GenericResources"
-      HttpProxy:
-        description: |
-          HTTP-proxy configured for the daemon. This value is obtained from the
-          [`HTTP_PROXY`](https://www.gnu.org/software/wget/manual/html_node/Proxies.html) environment variable.
-          Credentials ([user info component](https://tools.ietf.org/html/rfc3986#section-3.2.1)) in the proxy URL
-          are masked in the API response.
-
-          Containers do not automatically inherit this configuration.
-        type: "string"
-        example: "http://xxxxx:xxxxx@proxy.corp.example.com:8080"
-      HttpsProxy:
-        description: |
-          HTTPS-proxy configured for the daemon. This value is obtained from the
-          [`HTTPS_PROXY`](https://www.gnu.org/software/wget/manual/html_node/Proxies.html) environment variable.
-          Credentials ([user info component](https://tools.ietf.org/html/rfc3986#section-3.2.1)) in the proxy URL
-          are masked in the API response.
-
-          Containers do not automatically inherit this configuration.
-        type: "string"
-        example: "https://xxxxx:xxxxx@proxy.corp.example.com:4443"
-      NoProxy:
-        description: |
-          Comma-separated list of domain extensions for which no proxy should be
-          used. This value is obtained from the [`NO_PROXY`](https://www.gnu.org/software/wget/manual/html_node/Proxies.html)
-          environment variable.
-
-          Containers do not automatically inherit this configuration.
-        type: "string"
-        example: "*.local, 169.254/16"
-      Name:
-        description: "Hostname of the host."
-        type: "string"
-        example: "node5.corp.example.com"
-      Labels:
-        description: |
-          User-defined labels (key/value metadata) as set on the daemon.
-
-          <p><br /></p>
-
-          > **Note**: When part of a Swarm, nodes can both have _daemon_ labels,
-          > set through the daemon configuration, and _node_ labels, set from a
-          > manager node in the Swarm. Node labels are not included in this
-          > field. Node labels can be retrieved using the `/nodes/(id)` endpoint
-          > on a manager node in the Swarm.
-        type: "array"
-        items:
-          type: "string"
-        example: ["storage=ssd", "production"]
-      ExperimentalBuild:
-        description: |
-          Indicates if experimental features are enabled on the daemon.
-        type: "boolean"
-        example: true
-      ServerVersion:
-        description: |
-          Version string of the daemon.
-        type: "string"
-        example: "27.0.1"
-      Runtimes:
-        description: |
-          List of [OCI compliant](https://github.com/opencontainers/runtime-spec)
-          runtimes configured on the daemon. Keys hold the "name" used to
-          reference the runtime.
-
-          The Docker daemon relies on an OCI compliant runtime (invoked via the
-          `containerd` daemon) as its interface to the Linux kernel namespaces,
-          cgroups, and SELinux.
-
-          The default runtime is `runc`, and automatically configured. Additional
-          runtimes can be configured by the user and will be listed here.
-        type: "object"
-        additionalProperties:
-          $ref: "#/definitions/Runtime"
-        default:
-          runc:
-            path: "runc"
-        example:
-          runc:
-            path: "runc"
-          runc-master:
-            path: "/go/bin/runc"
-          custom:
-            path: "/usr/local/bin/my-oci-runtime"
-            runtimeArgs: ["--debug", "--systemd-cgroup=false"]
-      DefaultRuntime:
-        description: |
-          Name of the default OCI runtime that is used when starting containers.
-
-          The default can be overridden per-container at create time.
-        type: "string"
-        default: "runc"
-        example: "runc"
-      Swarm:
-        $ref: "#/definitions/SwarmInfo"
-      LiveRestoreEnabled:
-        description: |
-          Indicates if live restore is enabled.
-
-          If enabled, containers are kept running when the daemon is shutdown
-          or upon daemon start if running containers are detected.
-        type: "boolean"
-        default: false
-        example: false
-      Isolation:
-        description: |
-          Represents the isolation technology to use as a default for containers.
-          The supported values are platform-specific.
-
-          If no isolation value is specified on daemon start, on Windows client,
-          the default is `hyperv`, and on Windows server, the default is `process`.
-
-          This option is currently not used on other platforms.
-        default: "default"
-        type: "string"
-        enum:
-          - "default"
-          - "hyperv"
-          - "process"
-          - ""
-      InitBinary:
-        description: |
-          Name and, optional, path of the `docker-init` binary.
-
-          If the path is omitted, the daemon searches the host's `$PATH` for the
-          binary and uses the first result.
-        type: "string"
-        example: "docker-init"
-      ContainerdCommit:
-        $ref: "#/definitions/Commit"
-      RuncCommit:
-        $ref: "#/definitions/Commit"
-      InitCommit:
-        $ref: "#/definitions/Commit"
-      SecurityOptions:
-        description: |
-          List of security features that are enabled on the daemon, such as
-          apparmor, seccomp, SELinux, user-namespaces (userns), rootless and
-          no-new-privileges.
-
-          Additional configuration options for each security feature may
-          be present, and are included as a comma-separated list of key/value
-          pairs.
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "name=apparmor"
-          - "name=seccomp,profile=default"
-          - "name=selinux"
-          - "name=userns"
-          - "name=rootless"
-      ProductLicense:
-        description: |
-          Reports a summary of the product license on the daemon.
-
-          If a commercial license has been applied to the daemon, information
-          such as number of nodes, and expiration are included.
-        type: "string"
-        example: "Community Engine"
-      DefaultAddressPools:
-        description: |
-          List of custom default address pools for local networks, which can be
-          specified in the daemon.json file or dockerd option.
-
-          Example: a Base "10.10.0.0/16" with Size 24 will define the set of 256
-          10.10.[0-255].0/24 address pools.
-        type: "array"
-        items:
-          type: "object"
-          properties:
-            Base:
-              description: "The network address in CIDR format"
-              type: "string"
-              example: "10.10.0.0/16"
-            Size:
-              description: "The network pool size"
-              type: "integer"
-              example: "24"
-      Warnings:
-        description: |
-          List of warnings / informational messages about missing features, or
-          issues related to the daemon configuration.
-
-          These messages can be printed by the client as information to the user.
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "WARNING: No memory limit support"
-      CDISpecDirs:
-        description: |
-          List of directories where (Container Device Interface) CDI
-          specifications are located.
-
-          These specifications define vendor-specific modifications to an OCI
-          runtime specification for a container being created.
-
-          An empty list indicates that CDI device injection is disabled.
-
-          Note that since using CDI device injection requires the daemon to have
-          experimental enabled. For non-experimental daemons an empty list will
-          always be returned.
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "/etc/cdi"
-          - "/var/run/cdi"
-      Containerd:
-        $ref: "#/definitions/ContainerdInfo"
-
-  ContainerdInfo:
-    description: |
-      Information for connecting to the containerd instance that is used by the daemon.
-      This is included for debugging purposes only.
-    type: "object"
-    x-nullable: true
-    properties:
-      Address:
-        description: "The address of the containerd socket."
-        type: "string"
-        example: "/run/containerd/containerd.sock"
-      Namespaces:
-        description: |
-          The namespaces that the daemon uses for running containers and
-          plugins in containerd. These namespaces can be configured in the
-          daemon configuration, and are considered to be used exclusively
-          by the daemon, Tampering with the containerd instance may cause
-          unexpected behavior.
-
-          As these namespaces are considered to be exclusively accessed
-          by the daemon, it is not recommended to change these values,
-          or to change them to a value that is used by other systems,
-          such as cri-containerd.
-        type: "object"
-        properties:
-          Containers:
-            description: |
-              The default containerd namespace used for containers managed
-              by the daemon.
-
-              The default namespace for containers is "moby", but will be
-              suffixed with the `<uid>.<gid>` of the remapped `root` if
-              user-namespaces are enabled and the containerd image-store
-              is used.
-            type: "string"
-            default: "moby"
-            example: "moby"
-          Plugins:
-            description: |
-              The default containerd namespace used for plugins managed by
-              the daemon.
-
-              The default namespace for plugins is "plugins.moby", but will be
-              suffixed with the `<uid>.<gid>` of the remapped `root` if
-              user-namespaces are enabled and the containerd image-store
-              is used.
-            type: "string"
-            default: "plugins.moby"
-            example: "plugins.moby"
-
-  # PluginsInfo is a temp struct holding Plugins name
-  # registered with docker daemon. It is used by Info struct
-  PluginsInfo:
-    description: |
-      Available plugins per type.
-
-      <p><br /></p>
-
-      > **Note**: Only unmanaged (V1) plugins are included in this list.
-      > V1 plugins are "lazily" loaded, and are not returned in this list
-      > if there is no resource using the plugin.
-    type: "object"
-    properties:
-      Volume:
-        description: "Names of available volume-drivers, and network-driver plugins."
-        type: "array"
-        items:
-          type: "string"
-        example: ["local"]
-      Network:
-        description: "Names of available network-drivers, and network-driver plugins."
-        type: "array"
-        items:
-          type: "string"
-        example: ["bridge", "host", "ipvlan", "macvlan", "null", "overlay"]
-      Authorization:
-        description: "Names of available authorization plugins."
-        type: "array"
-        items:
-          type: "string"
-        example: ["img-authz-plugin", "hbm"]
-      Log:
-        description: "Names of available logging-drivers, and logging-driver plugins."
-        type: "array"
-        items:
-          type: "string"
-        example: ["awslogs", "fluentd", "gcplogs", "gelf", "journald", "json-file", "splunk", "syslog"]
-
-
-  RegistryServiceConfig:
-    description: |
-      RegistryServiceConfig stores daemon registry services configuration.
-    type: "object"
-    x-nullable: true
-    properties:
-      AllowNondistributableArtifactsCIDRs:
-        description: |
-          List of IP ranges to which nondistributable artifacts can be pushed,
-          using the CIDR syntax [RFC 4632](https://tools.ietf.org/html/4632).
-
-          Some images (for example, Windows base images) contain artifacts
-          whose distribution is restricted by license. When these images are
-          pushed to a registry, restricted artifacts are not included.
-
-          This configuration override this behavior, and enables the daemon to
-          push nondistributable artifacts to all registries whose resolved IP
-          address is within the subnet described by the CIDR syntax.
-
-          This option is useful when pushing images containing
-          nondistributable artifacts to a registry on an air-gapped network so
-          hosts on that network can pull the images without connecting to
-          another server.
-
-          > **Warning**: Nondistributable artifacts typically have restrictions
-          > on how and where they can be distributed and shared. Only use this
-          > feature to push artifacts to private registries and ensure that you
-          > are in compliance with any terms that cover redistributing
-          > nondistributable artifacts.
-
-        type: "array"
-        items:
-          type: "string"
-        example: ["::1/128", "127.0.0.0/8"]
-      AllowNondistributableArtifactsHostnames:
-        description: |
-          List of registry hostnames to which nondistributable artifacts can be
-          pushed, using the format `<hostname>[:<port>]` or `<IP address>[:<port>]`.
-
-          Some images (for example, Windows base images) contain artifacts
-          whose distribution is restricted by license. When these images are
-          pushed to a registry, restricted artifacts are not included.
-
-          This configuration override this behavior for the specified
-          registries.
-
-          This option is useful when pushing images containing
-          nondistributable artifacts to a registry on an air-gapped network so
-          hosts on that network can pull the images without connecting to
-          another server.
-
-          > **Warning**: Nondistributable artifacts typically have restrictions
-          > on how and where they can be distributed and shared. Only use this
-          > feature to push artifacts to private registries and ensure that you
-          > are in compliance with any terms that cover redistributing
-          > nondistributable artifacts.
-        type: "array"
-        items:
-          type: "string"
-        example: ["registry.internal.corp.example.com:3000", "[2001:db8:a0b:12f0::1]:443"]
-      InsecureRegistryCIDRs:
-        description: |
-          List of IP ranges of insecure registries, using the CIDR syntax
-          ([RFC 4632](https://tools.ietf.org/html/4632)). Insecure registries
-          accept un-encrypted (HTTP) and/or untrusted (HTTPS with certificates
-          from unknown CAs) communication.
-
-          By default, local registries (`127.0.0.0/8`) are configured as
-          insecure. All other registries are secure. Communicating with an
-          insecure registry is not possible if the daemon assumes that registry
-          is secure.
-
-          This configuration override this behavior, insecure communication with
-          registries whose resolved IP address is within the subnet described by
-          the CIDR syntax.
-
-          Registries can also be marked insecure by hostname. Those registries
-          are listed under `IndexConfigs` and have their `Secure` field set to
-          `false`.
-
-          > **Warning**: Using this option can be useful when running a local
-          > registry, but introduces security vulnerabilities. This option
-          > should therefore ONLY be used for testing purposes. For increased
-          > security, users should add their CA to their system's list of trusted
-          > CAs instead of enabling this option.
-        type: "array"
-        items:
-          type: "string"
-        example: ["::1/128", "127.0.0.0/8"]
-      IndexConfigs:
-        type: "object"
-        additionalProperties:
-          $ref: "#/definitions/IndexInfo"
-        example:
-          "127.0.0.1:5000":
-            "Name": "127.0.0.1:5000"
-            "Mirrors": []
-            "Secure": false
-            "Official": false
-          "[2001:db8:a0b:12f0::1]:80":
-            "Name": "[2001:db8:a0b:12f0::1]:80"
-            "Mirrors": []
-            "Secure": false
-            "Official": false
-          "docker.io":
-            Name: "docker.io"
-            Mirrors: ["https://hub-mirror.corp.example.com:5000/"]
-            Secure: true
-            Official: true
-          "registry.internal.corp.example.com:3000":
-            Name: "registry.internal.corp.example.com:3000"
-            Mirrors: []
-            Secure: false
-            Official: false
-      Mirrors:
-        description: |
-          List of registry URLs that act as a mirror for the official
-          (`docker.io`) registry.
-
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "https://hub-mirror.corp.example.com:5000/"
-          - "https://[2001:db8:a0b:12f0::1]/"
-
-  IndexInfo:
-    description:
-      IndexInfo contains information about a registry.
-    type: "object"
-    x-nullable: true
-    properties:
-      Name:
-        description: |
-          Name of the registry, such as "docker.io".
-        type: "string"
-        example: "docker.io"
-      Mirrors:
-        description: |
-          List of mirrors, expressed as URIs.
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "https://hub-mirror.corp.example.com:5000/"
-          - "https://registry-2.docker.io/"
-          - "https://registry-3.docker.io/"
-      Secure:
-        description: |
-          Indicates if the registry is part of the list of insecure
-          registries.
-
-          If `false`, the registry is insecure. Insecure registries accept
-          un-encrypted (HTTP) and/or untrusted (HTTPS with certificates from
-          unknown CAs) communication.
-
-          > **Warning**: Insecure registries can be useful when running a local
-          > registry. However, because its use creates security vulnerabilities
-          > it should ONLY be enabled for testing purposes. For increased
-          > security, users should add their CA to their system's list of
-          > trusted CAs instead of enabling this option.
-        type: "boolean"
-        example: true
-      Official:
-        description: |
-          Indicates whether this is an official registry (i.e., Docker Hub / docker.io)
-        type: "boolean"
-        example: true
-
-  Runtime:
-    description: |
-      Runtime describes an [OCI compliant](https://github.com/opencontainers/runtime-spec)
-      runtime.
-
-      The runtime is invoked by the daemon via the `containerd` daemon. OCI
-      runtimes act as an interface to the Linux kernel namespaces, cgroups,
-      and SELinux.
-    type: "object"
-    properties:
-      path:
-        description: |
-          Name and, optional, path, of the OCI executable binary.
-
-          If the path is omitted, the daemon searches the host's `$PATH` for the
-          binary and uses the first result.
-        type: "string"
-        example: "/usr/local/bin/my-oci-runtime"
-      runtimeArgs:
-        description: |
-          List of command-line arguments to pass to the runtime when invoked.
-        type: "array"
-        x-nullable: true
-        items:
-          type: "string"
-        example: ["--debug", "--systemd-cgroup=false"]
-      status:
-        description: |
-          Information specific to the runtime.
-
-          While this API specification does not define data provided by runtimes,
-          the following well-known properties may be provided by runtimes:
-
-          `org.opencontainers.runtime-spec.features`: features structure as defined
-          in the [OCI Runtime Specification](https://github.com/opencontainers/runtime-spec/blob/main/features.md),
-          in a JSON string representation.
-
-          <p><br /></p>
-
-          > **Note**: The information returned in this field, including the
-          > formatting of values and labels, should not be considered stable,
-          > and may change without notice.
-        type: "object"
-        x-nullable: true
-        additionalProperties:
-          type: "string"
-        example:
-          "org.opencontainers.runtime-spec.features": "{\"ociVersionMin\":\"1.0.0\",\"ociVersionMax\":\"1.1.0\",\"...\":\"...\"}"
-
-  Commit:
-    description: |
-      Commit holds the Git-commit (SHA1) that a binary was built from, as
-      reported in the version-string of external tools, such as `containerd`,
-      or `runC`.
-    type: "object"
-    properties:
-      ID:
-        description: "Actual commit ID of external tool."
-        type: "string"
-        example: "cfb82a876ecc11b5ca0977d1733adbe58599088a"
-      Expected:
-        description: |
-          Commit ID of external tool expected by dockerd as set at build time.
-        type: "string"
-        example: "2d41c047c83e09a6d61d464906feb2a2f3c52aa4"
-
-  SwarmInfo:
-    description: |
-      Represents generic information about swarm.
-    type: "object"
-    properties:
-      NodeID:
-        description: "Unique identifier of for this node in the swarm."
-        type: "string"
-        default: ""
-        example: "k67qz4598weg5unwwffg6z1m1"
-      NodeAddr:
-        description: |
-          IP address at which this node can be reached by other nodes in the
-          swarm.
-        type: "string"
-        default: ""
-        example: "10.0.0.46"
-      LocalNodeState:
-        $ref: "#/definitions/LocalNodeState"
-      ControlAvailable:
-        type: "boolean"
-        default: false
-        example: true
-      Error:
-        type: "string"
-        default: ""
-      RemoteManagers:
-        description: |
-          List of ID's and addresses of other managers in the swarm.
-        type: "array"
-        default: null
-        x-nullable: true
-        items:
-          $ref: "#/definitions/PeerNode"
-        example:
-          - NodeID: "71izy0goik036k48jg985xnds"
-            Addr: "10.0.0.158:2377"
-          - NodeID: "79y6h1o4gv8n120drcprv5nmc"
-            Addr: "10.0.0.159:2377"
-          - NodeID: "k67qz4598weg5unwwffg6z1m1"
-            Addr: "10.0.0.46:2377"
-      Nodes:
-        description: "Total number of nodes in the swarm."
-        type: "integer"
-        x-nullable: true
-        example: 4
-      Managers:
-        description: "Total number of managers in the swarm."
-        type: "integer"
-        x-nullable: true
-        example: 3
-      Cluster:
-        $ref: "#/definitions/ClusterInfo"
-
-  LocalNodeState:
-    description: "Current local status of this node."
-    type: "string"
-    default: ""
-    enum:
-      - ""
-      - "inactive"
-      - "pending"
-      - "active"
-      - "error"
-      - "locked"
-    example: "active"
-
-  PeerNode:
-    description: "Represents a peer-node in the swarm"
-    type: "object"
-    properties:
-      NodeID:
-        description: "Unique identifier of for this node in the swarm."
-        type: "string"
-      Addr:
-        description: |
-          IP address and ports at which this node can be reached.
-        type: "string"
-
-  NetworkAttachmentConfig:
-    description: |
-      Specifies how a service should be attached to a particular network.
-    type: "object"
-    properties:
-      Target:
-        description: |
-          The target network for attachment. Must be a network name or ID.
-        type: "string"
-      Aliases:
-        description: |
-          Discoverable alternate names for the service on this network.
-        type: "array"
-        items:
-          type: "string"
-      DriverOpts:
-        description: |
-          Driver attachment options for the network target.
-        type: "object"
-        additionalProperties:
-          type: "string"
-
-  EventActor:
-    description: |
-      Actor describes something that generates events, like a container, network,
-      or a volume.
-    type: "object"
-    properties:
-      ID:
-        description: "The ID of the object emitting the event"
-        type: "string"
-        example: "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743"
-      Attributes:
-        description: |
-          Various key/value attributes of the object, depending on its type.
-        type: "object"
-        additionalProperties:
-          type: "string"
-        example:
-          com.example.some-label: "some-label-value"
-          image: "alpine:latest"
-          name: "my-container"
-
-  EventMessage:
-    description: |
-      EventMessage represents the information an event contains.
-    type: "object"
-    title: "SystemEventsResponse"
-    properties:
-      Type:
-        description: "The type of object emitting the event"
-        type: "string"
-        enum: ["builder", "config", "container", "daemon", "image", "network", "node", "plugin", "secret", "service", "volume"]
-        example: "container"
-      Action:
-        description: "The type of event"
-        type: "string"
-        example: "create"
-      Actor:
-        $ref: "#/definitions/EventActor"
-      scope:
-        description: |
-          Scope of the event. Engine events are `local` scope. Cluster (Swarm)
-          events are `swarm` scope.
-        type: "string"
-        enum: ["local", "swarm"]
-      time:
-        description: "Timestamp of event"
-        type: "integer"
-        format: "int64"
-        example: 1629574695
-      timeNano:
-        description: "Timestamp of event, with nanosecond accuracy"
-        type: "integer"
-        format: "int64"
-        example: 1629574695515050031
-
-  OCIDescriptor:
-    type: "object"
-    x-go-name: Descriptor
-    description: |
-      A descriptor struct containing digest, media type, and size, as defined in
-      the [OCI Content Descriptors Specification](https://github.com/opencontainers/image-spec/blob/v1.0.1/descriptor.md).
-    properties:
-      mediaType:
-        description: |
-          The media type of the object this schema refers to.
-        type: "string"
-        example: "application/vnd.docker.distribution.manifest.v2+json"
-      digest:
-        description: |
-          The digest of the targeted content.
-        type: "string"
-        example: "sha256:c0537ff6a5218ef531ece93d4984efc99bbf3f7497c0a7726c88e2bb7584dc96"
-      size:
-        description: |
-          The size in bytes of the blob.
-        type: "integer"
-        format: "int64"
-        example: 3987495
-        # TODO Not yet including these fields for now, as they are nil / omitted in our response.
-        # urls:
-        #   description: |
-        #     List of URLs from which this object MAY be downloaded.
-        #   type: "array"
-        #   items:
-        #     type: "string"
-        #     format: "uri"
-        # annotations:
-        #   description: |
-        #     Arbitrary metadata relating to the targeted content.
-        #   type: "object"
-        #   additionalProperties:
-        #     type: "string"
-        # platform:
-        #   $ref: "#/definitions/OCIPlatform"
-
-  OCIPlatform:
-    type: "object"
-    x-go-name: Platform
-    description: |
-      Describes the platform which the image in the manifest runs on, as defined
-      in the [OCI Image Index Specification](https://github.com/opencontainers/image-spec/blob/v1.0.1/image-index.md).
-    properties:
-      architecture:
-        description: |
-          The CPU architecture, for example `amd64` or `ppc64`.
-        type: "string"
-        example: "arm"
-      os:
-        description: |
-          The operating system, for example `linux` or `windows`.
-        type: "string"
-        example: "windows"
-      os.version:
-        description: |
-          Optional field specifying the operating system version, for example on
-          Windows `10.0.19041.1165`.
-        type: "string"
-        example: "10.0.19041.1165"
-      os.features:
-        description: |
-          Optional field specifying an array of strings, each listing a required
-          OS feature (for example on Windows `win32k`).
-        type: "array"
-        items:
-          type: "string"
-        example:
-          - "win32k"
-      variant:
-        description: |
-          Optional field specifying a variant of the CPU, for example `v7` to
-          specify ARMv7 when architecture is `arm`.
-        type: "string"
-        example: "v7"
-
-  DistributionInspect:
-    type: "object"
-    x-go-name: DistributionInspect
-    title: "DistributionInspectResponse"
-    required: [Descriptor, Platforms]
-    description: |
-      Describes the result obtained from contacting the registry to retrieve
-      image metadata.
-    properties:
-      Descriptor:
-        $ref: "#/definitions/OCIDescriptor"
-      Platforms:
-        type: "array"
-        description: |
-          An array containing all platforms supported by the image.
-        items:
-          $ref: "#/definitions/OCIPlatform"
-
-  ClusterVolume:
-    type: "object"
-    description: |
-      Options and information specific to, and only present on, Swarm CSI
-      cluster volumes.
-    properties:
-      ID:
-        type: "string"
-        description: |
-          The Swarm ID of this volume. Because cluster volumes are Swarm
-          objects, they have an ID, unlike non-cluster volumes. This ID can
-          be used to refer to the Volume instead of the name.
-      Version:
-        $ref: "#/definitions/ObjectVersion"
-      CreatedAt:
-        type: "string"
-        format: "dateTime"
-      UpdatedAt:
-        type: "string"
-        format: "dateTime"
-      Spec:
-        $ref: "#/definitions/ClusterVolumeSpec"
-      Info:
-        type: "object"
-        description: |
-          Information about the global status of the volume.
-        properties:
-          CapacityBytes:
-            type: "integer"
-            format: "int64"
-            description: |
-              The capacity of the volume in bytes. A value of 0 indicates that
-              the capacity is unknown.
-          VolumeContext:
-            type: "object"
-            description: |
-              A map of strings to strings returned from the storage plugin when
-              the volume is created.
-            additionalProperties:
-              type: "string"
-          VolumeID:
-            type: "string"
-            description: |
-              The ID of the volume as returned by the CSI storage plugin. This
-              is distinct from the volume's ID as provided by Docker. This ID
-              is never used by the user when communicating with Docker to refer
-              to this volume. If the ID is blank, then the Volume has not been
-              successfully created in the plugin yet.
-          AccessibleTopology:
-            type: "array"
-            description: |
-              The topology this volume is actually accessible from.
-            items:
-              $ref: "#/definitions/Topology"
-      PublishStatus:
-        type: "array"
-        description: |
-          The status of the volume as it pertains to its publishing and use on
-          specific nodes
-        items:
-          type: "object"
-          properties:
-            NodeID:
-              type: "string"
-              description: |
-                The ID of the Swarm node the volume is published on.
-            State:
-              type: "string"
-              description: |
-                The published state of the volume.
-                * `pending-publish` The volume should be published to this node, but the call to the controller plugin to do so has not yet been successfully completed.
-                * `published` The volume is published successfully to the node.
-                * `pending-node-unpublish` The volume should be unpublished from the node, and the manager is awaiting confirmation from the worker that it has done so.
-                * `pending-controller-unpublish` The volume is successfully unpublished from the node, but has not yet been successfully unpublished on the controller.
-              enum:
-                - "pending-publish"
-                - "published"
-                - "pending-node-unpublish"
-                - "pending-controller-unpublish"
-            PublishContext:
-              type: "object"
-              description: |
-                A map of strings to strings returned by the CSI controller
-                plugin when a volume is published.
-              additionalProperties:
-                type: "string"
-
-  ClusterVolumeSpec:
-    type: "object"
-    description: |
-      Cluster-specific options used to create the volume.
-    properties:
-      Group:
-        type: "string"
-        description: |
-          Group defines the volume group of this volume. Volumes belonging to
-          the same group can be referred to by group name when creating
-          Services.  Referring to a volume by group instructs Swarm to treat
-          volumes in that group interchangeably for the purpose of scheduling.
-          Volumes with an empty string for a group technically all belong to
-          the same, emptystring group.
-      AccessMode:
-        type: "object"
-        description: |
-          Defines how the volume is used by tasks.
-        properties:
-          Scope:
-            type: "string"
-            description: |
-              The set of nodes this volume can be used on at one time.
-              - `single` The volume may only be scheduled to one node at a time.
-              - `multi` the volume may be scheduled to any supported number of nodes at a time.
-            default: "single"
-            enum: ["single", "multi"]
-            x-nullable: false
-          Sharing:
-            type: "string"
-            description: |
-              The number and way that different tasks can use this volume
-              at one time.
-              - `none` The volume may only be used by one task at a time.
-              - `readonly` The volume may be used by any number of tasks, but they all must mount the volume as readonly
-              - `onewriter` The volume may be used by any number of tasks, but only one may mount it as read/write.
-              - `all` The volume may have any number of readers and writers.
-            default: "none"
-            enum: ["none", "readonly", "onewriter", "all"]
-            x-nullable: false
-          MountVolume:
-            type: "object"
-            description: |
-              Options for using this volume as a Mount-type volume.
-
-                  Either MountVolume or BlockVolume, but not both, must be
-                  present.
-                properties:
-                  FsType:
-                    type: "string"
-                    description: |
-                      Specifies the filesystem type for the mount volume.
-                      Optional.
-                  MountFlags:
-                    type: "array"
-                    description: |
-                      Flags to pass when mounting the volume. Optional.
-                    items:
-                      type: "string"
-              BlockVolume:
-                type: "object"
-                description: |
-                  Options for using this volume as a Block-type volume.
-                  Intentionally empty.
-          Secrets:
-            type: "array"
-            description: |
-              Swarm Secrets that are passed to the CSI storage plugin when
-              operating on this volume.
-            items:
-              type: "object"
-              description: |
-                One cluster volume secret entry. Defines a key-value pair that
-                is passed to the plugin.
-              properties:
-                Key:
-                  type: "string"
-                  description: |
-                    Key is the name of the key of the key-value pair passed to
-                    the plugin.
-                Secret:
-                  type: "string"
-                  description: |
-                    Secret is the swarm Secret object from which to read data.
-                    This can be a Secret name or ID. The Secret data is
-                    retrieved by swarm and used as the value of the key-value
-                    pair passed to the plugin.
-          AccessibilityRequirements:
-            type: "object"
-            description: |
-              Requirements for the accessible topology of the volume. These
-              fields are optional. For an in-depth description of what these
-              fields mean, see the CSI specification.
-            properties:
-              Requisite:
-                type: "array"
-                description: |
-                  A list of required topologies, at least one of which the
-                  volume must be accessible from.
-                items:
-                  $ref: "#/definitions/Topology"
-              Preferred:
-                type: "array"
-                description: |
-                  A list of topologies that the volume should attempt to be
-                  provisioned in.
-                items:
-                  $ref: "#/definitions/Topology"
-          CapacityRange:
-            type: "object"
-            description: |
-              The desired capacity that the volume should be created with. If
-              empty, the plugin will decide the capacity.
-            properties:
-              RequiredBytes:
-                type: "integer"
-                format: "int64"
-                description: |
-                  The volume must be at least this big. The value of 0
-                  indicates an unspecified minimum
-              LimitBytes:
-                type: "integer"
-                format: "int64"
-                description: |
-                  The volume must not be bigger than this. The value of 0
-                  indicates an unspecified maximum.
-          Availability:
-            type: "string"
-            description: |
-              The availability of the volume for use in tasks.
-              - `active` The volume is fully available for scheduling on the cluster
-              - `pause` No new workloads should use the volume, but existing workloads are not stopped.
-              - `drain` All workloads using this volume should be stopped and rescheduled, and no new ones should be started.
-            default: "active"
-            x-nullable: false
-            enum:
-              - "active"
-              - "pause"
-              - "drain"
-
-  Topology:
-    description: |
-      A map of topological domains to topological segments. For in depth
-      details, see documentation for the Topology object in the CSI
-      specification.
-    type: "object"
-    additionalProperties:
-      type: "string"
-
-  ImageManifestSummary:
-    x-go-name: "ManifestSummary"
-    description: |
-      ImageManifestSummary represents a summary of an image manifest.
-    type: "object"
-    required: ["ID", "Descriptor", "Available", "Size", "Kind"]
-    properties:
-      ID:
-        description: |
-          ID is the content-addressable ID of an image and is the same as the
-          digest of the image manifest.
-        type: "string"
-        example: "sha256:95869fbcf224d947ace8d61d0e931d49e31bb7fc67fffbbe9c3198c33aa8e93f"
-      Descriptor:
-        $ref: "#/definitions/OCIDescriptor"
-      Available:
-        description: Indicates whether all the child content (image config, layers) is fully available locally.
-        type: "boolean"
-        example: true
-      Size:
-        type: "object"
-        x-nullable: false
-        required: ["Content", "Total"]
-        properties:
-          Total:
-            type: "integer"
-            format: "int64"
-            example: 8213251
-            description: |
-              Total is the total size (in bytes) of all the locally present
-              data (both distributable and non-distributable) that's related to
-              this manifest and its children.
-              This equal to the sum of [Content] size AND all the sizes in the
-              [Size] struct present in the Kind-specific data struct.
-              For example, for an image kind (Kind == "image")
-              this would include the size of the image content and unpacked
-              image snapshots ([Size.Content] + [ImageData.Size.Unpacked]).
-          Content:
-            description: |
-              Content is the size (in bytes) of all the locally present
-              content in the content store (e.g. image config, layers)
-              referenced by this manifest and its children.
-              This only includes blobs in the content store.
-            type: "integer"
-            format: "int64"
-            example: 3987495
-      Kind:
-        type: "string"
-        example: "image"
-        enum:
-          - "image"
-          - "attestation"
-          - "unknown"
-        description: |
-          The kind of the manifest.
-
-          kind         | description
-          -------------|-----------------------------------------------------------
-          image        | Image manifest that can be used to start a container.
-          attestation  | Attestation manifest produced by the Buildkit builder for a specific image manifest.
-      ImageData:
-        description: |
-          The image data for the image manifest.
-          This field is only populated when Kind is "image".
-        type: "object"
-        x-nullable: true
-        x-omitempty: true
-        required: ["Platform", "Containers", "Size", "UnpackedSize"]
-        properties:
-          Platform:
-            $ref: "#/definitions/OCIPlatform"
-            description: |
-              OCI platform of the image. This will be the platform specified in the
-              manifest descriptor from the index/manifest list.
-              If it's not available, it will be obtained from the image config.
-          Containers:
-            description: |
-              The IDs of the containers that are using this image.
-            type: "array"
-            items:
-              type: "string"
-            example: ["ede54ee1fda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c7430", "abadbce344c096744d8d6071a90d474d28af8f1034b5ea9fb03c3f4bfc6d005e"]
-          Size:
-            type: "object"
-            x-nullable: false
-            required: ["Unpacked"]
-            properties:
-              Unpacked:
-                type: "integer"
-                format: "int64"
-                example: 3987495
-                description: |
-                  Unpacked is the size (in bytes) of the locally unpacked
-                  (uncompressed) image content that's directly usable by the containers
-                  running this image.
-                  It's independent of the distributable content - e.g.
-                  the image might still have an unpacked data that's still used by
-                  some container even when the distributable/compressed content is
-                  already gone.
-      AttestationData:
-        description: |
-          The image data for the attestation manifest.
-          This field is only populated when Kind is "attestation".
-        type: "object"
-        x-nullable: true
-        x-omitempty: true
-        required: ["For"]
-        properties:
-          For:
-            description: |
-              The digest of the image manifest that this attestation is for.
-            type: "string"
-            example: "sha256:95869fbcf224d947ace8d61d0e931d49e31bb7fc67fffbbe9c3198c33aa8e93f"
-
-paths:
-  /containers/json:
-    get:
-      summary: "List containers"
-      description: |
-        Returns a list of containers. For details on the format, see the
-        [inspect endpoint](#operation/ContainerInspect).
-
-        Note that it uses a different, smaller representation of a container
-        than inspecting a single container. For example, the list of linked
-        containers is not propagated .
-      operationId: "ContainerList"
-      produces:
-        - "application/json"
-      parameters:
-        - name: "all"
-          in: "query"
-          description: |
-            Return all containers. By default, only running containers are shown.
-          type: "boolean"
-          default: false
-        - name: "limit"
-          in: "query"
-          description: |
-            Return this number of most recently created containers, including
-            non-running ones.
-          type: "integer"
-        - name: "size"
-          in: "query"
-          description: |
-            Return the size of container as fields `SizeRw` and `SizeRootFs`.
-          type: "boolean"
-          default: false
-        - name: "filters"
-          in: "query"
-          description: |
-            Filters to process on the container list, encoded as JSON (a
-            `map[string][]string`). For example, `{"status": ["paused"]}` will
-            only return paused containers.
-
-            Available filters:
-
-            - `ancestor`=(`<image-name>[:<tag>]`, `<image id>`, or `<image@digest>`)
-            - `before`=(`<container id>` or `<container name>`)
-            - `expose`=(`<port>[/<proto>]`|`<startport-endport>/[<proto>]`)
-            - `exited=<int>` containers with exit code of `<int>`
-            - `health`=(`starting`|`healthy`|`unhealthy`|`none`)
-            - `id=<ID>` a container's ID
-            - `isolation=`(`default`|`process`|`hyperv`) (Windows daemon only)
-            - `is-task=`(`true`|`false`)
-            - `label=key` or `label="key=value"` of a container label
-            - `name=<name>` a container's name
-            - `network`=(`<network id>` or `<network name>`)
-            - `publish`=(`<port>[/<proto>]`|`<startport-endport>/[<proto>]`)
-            - `since`=(`<container id>` or `<container name>`)
-            - `status=`(`created`|`restarting`|`running`|`removing`|`paused`|`exited`|`dead`)
-            - `volume`=(`<volume name>` or `<mount point destination>`)
-          type: "string"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/ContainerSummary"
-          examples:
-            application/json:
-              - Id: "8dfafdbc3a40"
-                Names:
-                  - "/boring_feynman"
-                Image: "ubuntu:latest"
-                ImageID: "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82"
-                Command: "echo 1"
-                Created: 1367854155
-                State: "Exited"
-                Status: "Exit 0"
-                Ports:
-                  - PrivatePort: 2222
-                    PublicPort: 3333
-                    Type: "tcp"
-                Labels:
-                  com.example.vendor: "Acme"
-                  com.example.license: "GPL"
-                  com.example.version: "1.0"
-                SizeRw: 12288
-                SizeRootFs: 0
-                HostConfig:
-                  NetworkMode: "default"
-                  Annotations:
-                    io.kubernetes.docker.type: "container"
-                NetworkSettings:
-                  Networks:
-                    bridge:
-                      NetworkID: "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812"
-                      EndpointID: "2cdc4edb1ded3631c81f57966563e5c8525b81121bb3706a9a9a3ae102711f3f"
-                      Gateway: "172.17.0.1"
-                      IPAddress: "172.17.0.2"
-                      IPPrefixLen: 16
-                      IPv6Gateway: ""
-                      GlobalIPv6Address: ""
-                      GlobalIPv6PrefixLen: 0
-                      MacAddress: "02:42:ac:11:00:02"
-                Mounts:
-                  - Name: "fac362...80535"
-                    Source: "/data"
-                    Destination: "/data"
-                    Driver: "local"
-                    Mode: "ro,Z"
-                    RW: false
-                    Propagation: ""
-              - Id: "9cd87474be90"
-                Names:
-                  - "/coolName"
-                Image: "ubuntu:latest"
-                ImageID: "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82"
-                Command: "echo 222222"
-                Created: 1367854155
-                State: "Exited"
-                Status: "Exit 0"
-                Ports: []
-                Labels: {}
-                SizeRw: 12288
-                SizeRootFs: 0
-                HostConfig:
-                  NetworkMode: "default"
-                  Annotations:
-                    io.kubernetes.docker.type: "container"
-                    io.kubernetes.sandbox.id: "3befe639bed0fd6afdd65fd1fa84506756f59360ec4adc270b0fdac9be22b4d3"
-                NetworkSettings:
-                  Networks:
-                    bridge:
-                      NetworkID: "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812"
-                      EndpointID: "88eaed7b37b38c2a3f0c4bc796494fdf51b270c2d22656412a2ca5d559a64d7a"
-                      Gateway: "172.17.0.1"
-                      IPAddress: "172.17.0.8"
-                      IPPrefixLen: 16
-                      IPv6Gateway: ""
-                      GlobalIPv6Address: ""
-                      GlobalIPv6PrefixLen: 0
-                      MacAddress: "02:42:ac:11:00:08"
-                Mounts: []
-              - Id: "3176a2479c92"
-                Names:
-                  - "/sleepy_dog"
-                Image: "ubuntu:latest"
-                ImageID: "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82"
-                Command: "echo 3333333333333333"
-                Created: 1367854154
-                State: "Exited"
-                Status: "Exit 0"
-                Ports: []
-                Labels: {}
-                SizeRw: 12288
-                SizeRootFs: 0
-                HostConfig:
-                  NetworkMode: "default"
-                  Annotations:
-                    io.kubernetes.image.id: "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82"
-                    io.kubernetes.image.name: "ubuntu:latest"
-                NetworkSettings:
-                  Networks:
-                    bridge:
-                      NetworkID: "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812"
-                      EndpointID: "8b27c041c30326d59cd6e6f510d4f8d1d570a228466f956edf7815508f78e30d"
-                      Gateway: "172.17.0.1"
-                      IPAddress: "172.17.0.6"
-                      IPPrefixLen: 16
-                      IPv6Gateway: ""
-                      GlobalIPv6Address: ""
-                      GlobalIPv6PrefixLen: 0
-                      MacAddress: "02:42:ac:11:00:06"
-                Mounts: []
-              - Id: "4cb07b47f9fb"
-                Names:
-                  - "/running_cat"
-                Image: "ubuntu:latest"
-                ImageID: "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82"
-                Command: "echo 444444444444444444444444444444444"
-                Created: 1367854152
-                State: "Exited"
-                Status: "Exit 0"
-                Ports: []
-                Labels: {}
-                SizeRw: 12288
-                SizeRootFs: 0
-                HostConfig:
-                  NetworkMode: "default"
-                  Annotations:
-                    io.kubernetes.config.source: "api"
-                NetworkSettings:
-                  Networks:
-                    bridge:
-                      NetworkID: "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812"
-                      EndpointID: "d91c7b2f0644403d7ef3095985ea0e2370325cd2332ff3a3225c4247328e66e9"
-                      Gateway: "172.17.0.1"
-                      IPAddress: "172.17.0.5"
-                      IPPrefixLen: 16
-                      IPv6Gateway: ""
-                      GlobalIPv6Address: ""
-                      GlobalIPv6PrefixLen: 0
-                      MacAddress: "02:42:ac:11:00:05"
-                Mounts: []
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Container"]
-  /containers/create:
-    post:
-      summary: "Create a container"
-      operationId: "ContainerCreate"
-      consumes:
-        - "application/json"
-        - "application/octet-stream"
-      produces:
-        - "application/json"
-      parameters:
-        - name: "name"
-          in: "query"
-          description: |
-            Assign the specified name to the container. Must match
-            `/?[a-zA-Z0-9][a-zA-Z0-9_.-]+`.
-          type: "string"
-          pattern: "^/?[a-zA-Z0-9][a-zA-Z0-9_.-]+$"
-        - name: "platform"
-          in: "query"
-          description: |
-            Platform in the format `os[/arch[/variant]]` used for image lookup.
-
-            When specified, the daemon checks if the requested image is present
-            in the local image cache with the given OS and Architecture, and
-            otherwise returns a `404` status.
-
-            If the option is not set, the host's native OS and Architecture are
-            used to look up the image in the image cache. However, if no platform
-            is passed and the given image does exist in the local image cache,
-            but its OS or architecture does not match, the container is created
-            with the available image, and a warning is added to the `Warnings`
-            field in the response, for example;
-
-                WARNING: The requested image's platform (linux/arm64/v8) does not
-                         match the detected host platform (linux/amd64) and no
-                         specific platform was requested
-
-          type: "string"
-          default: ""
-        - name: "body"
-          in: "body"
-          description: "Container to create"
-          schema:
-            allOf:
-              - $ref: "#/definitions/ContainerConfig"
-              - type: "object"
-                properties:
-                  HostConfig:
-                    $ref: "#/definitions/HostConfig"
-                  NetworkingConfig:
-                    $ref: "#/definitions/NetworkingConfig"
-            example:
-              Hostname: ""
-              Domainname: ""
-              User: ""
-              AttachStdin: false
-              AttachStdout: true
-              AttachStderr: true
-              Tty: false
-              OpenStdin: false
-              StdinOnce: false
-              Env:
-                - "FOO=bar"
-                - "BAZ=quux"
-              Cmd:
-                - "date"
-              Entrypoint: ""
-              Image: "ubuntu"
-              Labels:
-                com.example.vendor: "Acme"
-                com.example.license: "GPL"
-                com.example.version: "1.0"
-              Volumes:
-                /volumes/data: {}
-              WorkingDir: ""
-              NetworkDisabled: false
-              MacAddress: "12:34:56:78:9a:bc"
-              ExposedPorts:
-                22/tcp: {}
-              StopSignal: "SIGTERM"
-              StopTimeout: 10
-              HostConfig:
-                Binds:
-                  - "/tmp:/tmp"
-                Links:
-                  - "redis3:redis"
-                Memory: 0
-                MemorySwap: 0
-                MemoryReservation: 0
-                NanoCpus: 500000
-                CpuPercent: 80
-                CpuShares: 512
-                CpuPeriod: 100000
-                CpuRealtimePeriod: 1000000
-                CpuRealtimeRuntime: 10000
-                CpuQuota: 50000
-                CpusetCpus: "0,1"
-                CpusetMems: "0,1"
-                MaximumIOps: 0
-                MaximumIOBps: 0
-                BlkioWeight: 300
-                BlkioWeightDevice:
-                  - {}
-                BlkioDeviceReadBps:
-                  - {}
-                BlkioDeviceReadIOps:
-                  - {}
-                BlkioDeviceWriteBps:
-                  - {}
-                BlkioDeviceWriteIOps:
-                  - {}
-                DeviceRequests:
-                  - Driver: "nvidia"
-                    Count: -1
-                    DeviceIDs": ["0", "1", "GPU-fef8089b-4820-abfc-e83e-94318197576e"]
-                    Capabilities: [["gpu", "nvidia", "compute"]]
-                    Options:
-                      property1: "string"
-                      property2: "string"
-                MemorySwappiness: 60
-                OomKillDisable: false
-                OomScoreAdj: 500
-                PidMode: ""
-                PidsLimit: 0
-                PortBindings:
-                  22/tcp:
-                    - HostPort: "11022"
-                PublishAllPorts: false
-                Privileged: false
-                ReadonlyRootfs: false
-                Dns:
-                  - "8.8.8.8"
-                DnsOptions:
-                  - ""
-                DnsSearch:
-                  - ""
-                VolumesFrom:
-                  - "parent"
-                  - "other:ro"
-                CapAdd:
-                  - "NET_ADMIN"
-                CapDrop:
-                  - "MKNOD"
-                GroupAdd:
-                  - "newgroup"
-                RestartPolicy:
-                  Name: ""
-                  MaximumRetryCount: 0
-                AutoRemove: true
-                NetworkMode: "bridge"
-                Devices: []
-                Ulimits:
-                  - {}
-                LogConfig:
-                  Type: "json-file"
-                  Config: {}
-                SecurityOpt: []
-                StorageOpt: {}
-                CgroupParent: ""
-                VolumeDriver: ""
-                ShmSize: 67108864
-              NetworkingConfig:
-                EndpointsConfig:
-                  isolated_nw:
-                    IPAMConfig:
-                      IPv4Address: "172.20.30.33"
-                      IPv6Address: "2001:db8:abcd::3033"
-                      LinkLocalIPs:
-                        - "169.254.34.68"
-                        - "fe80::3468"
-                    Links:
-                      - "container_1"
-                      - "container_2"
-                    Aliases:
-                      - "server_x"
-                      - "server_y"
-                  database_nw: {}
-
-          required: true
-      responses:
-        201:
-          description: "Container created successfully"
-          schema:
-            $ref: "#/definitions/ContainerCreateResponse"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "no such image"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such image: c2ada9df5af8"
-        409:
-          description: "conflict"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Container"]
-  /containers/{id}/json:
-    get:
-      summary: "Inspect a container"
-      description: "Return low-level information about a container."
-      operationId: "ContainerInspect"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "object"
-            title: "ContainerInspectResponse"
-            properties:
-              Id:
-                description: "The ID of the container"
-                type: "string"
-              Created:
-                description: "The time the container was created"
-                type: "string"
-              Path:
-                description: "The path to the command being run"
-                type: "string"
-              Args:
-                description: "The arguments to the command being run"
-                type: "array"
-                items:
-                  type: "string"
-              State:
-                $ref: "#/definitions/ContainerState"
-              Image:
-                description: "The container's image ID"
-                type: "string"
-              ResolvConfPath:
-                type: "string"
-              HostnamePath:
-                type: "string"
-              HostsPath:
-                type: "string"
-              LogPath:
-                type: "string"
-              Name:
-                type: "string"
-              RestartCount:
-                type: "integer"
-              Driver:
-                type: "string"
-              Platform:
-                type: "string"
-              MountLabel:
-                type: "string"
-              ProcessLabel:
-                type: "string"
-              AppArmorProfile:
-                type: "string"
-              ExecIDs:
-                description: "IDs of exec instances that are running in the container."
-                type: "array"
-                items:
-                  type: "string"
-                x-nullable: true
-              HostConfig:
-                $ref: "#/definitions/HostConfig"
-              GraphDriver:
-                $ref: "#/definitions/GraphDriverData"
-              SizeRw:
-                description: |
-                  The size of files that have been created or changed by this
-                  container.
-                type: "integer"
-                format: "int64"
-              SizeRootFs:
-                description: "The total size of all the files in this container."
-                type: "integer"
-                format: "int64"
-              Mounts:
-                type: "array"
-                items:
-                  $ref: "#/definitions/MountPoint"
-              Config:
-                $ref: "#/definitions/ContainerConfig"
-              NetworkSettings:
-                $ref: "#/definitions/NetworkSettings"
-          examples:
-            application/json:
-              AppArmorProfile: ""
-              Args:
-                - "-c"
-                - "exit 9"
-              Config:
-                AttachStderr: true
-                AttachStdin: false
-                AttachStdout: true
-                Cmd:
-                  - "/bin/sh"
-                  - "-c"
-                  - "exit 9"
-                Domainname: ""
-                Env:
-                  - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
-                Healthcheck:
-                  Test: ["CMD-SHELL", "exit 0"]
-                Hostname: "ba033ac44011"
-                Image: "ubuntu"
-                Labels:
-                  com.example.vendor: "Acme"
-                  com.example.license: "GPL"
-                  com.example.version: "1.0"
-                MacAddress: ""
-                NetworkDisabled: false
-                OpenStdin: false
-                StdinOnce: false
-                Tty: false
-                User: ""
-                Volumes:
-                  /volumes/data: {}
-                WorkingDir: ""
-                StopSignal: "SIGTERM"
-                StopTimeout: 10
-              Created: "2015-01-06T15:47:31.485331387Z"
-              Driver: "overlay2"
-              ExecIDs:
-                - "b35395de42bc8abd327f9dd65d913b9ba28c74d2f0734eeeae84fa1c616a0fca"
-                - "3fc1232e5cd20c8de182ed81178503dc6437f4e7ef12b52cc5e8de020652f1c4"
-              HostConfig:
-                MaximumIOps: 0
-                MaximumIOBps: 0
-                BlkioWeight: 0
-                BlkioWeightDevice:
-                  - {}
-                BlkioDeviceReadBps:
-                  - {}
-                BlkioDeviceWriteBps:
-                  - {}
-                BlkioDeviceReadIOps:
-                  - {}
-                BlkioDeviceWriteIOps:
-                  - {}
-                ContainerIDFile: ""
-                CpusetCpus: ""
-                CpusetMems: ""
-                CpuPercent: 80
-                CpuShares: 0
-                CpuPeriod: 100000
-                CpuRealtimePeriod: 1000000
-                CpuRealtimeRuntime: 10000
-                Devices: []
-                DeviceRequests:
-                  - Driver: "nvidia"
-                    Count: -1
-                    DeviceIDs": ["0", "1", "GPU-fef8089b-4820-abfc-e83e-94318197576e"]
-                    Capabilities: [["gpu", "nvidia", "compute"]]
-                    Options:
-                      property1: "string"
-                      property2: "string"
-                IpcMode: ""
-                Memory: 0
-                MemorySwap: 0
-                MemoryReservation: 0
-                OomKillDisable: false
-                OomScoreAdj: 500
-                NetworkMode: "bridge"
-                PidMode: ""
-                PortBindings: {}
-                Privileged: false
-                ReadonlyRootfs: false
-                PublishAllPorts: false
-                RestartPolicy:
-                  MaximumRetryCount: 2
-                  Name: "on-failure"
-                LogConfig:
-                  Type: "json-file"
-                Sysctls:
-                  net.ipv4.ip_forward: "1"
-                Ulimits:
-                  - {}
-                VolumeDriver: ""
-                ShmSize: 67108864
-              HostnamePath: "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname"
-              HostsPath: "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts"
-              LogPath: "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log"
-              Id: "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39"
-              Image: "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2"
-              MountLabel: ""
-              Name: "/boring_euclid"
-              NetworkSettings:
-                Bridge: ""
-                SandboxID: ""
-                HairpinMode: false
-                LinkLocalIPv6Address: ""
-                LinkLocalIPv6PrefixLen: 0
-                SandboxKey: ""
-                EndpointID: ""
-                Gateway: ""
-                GlobalIPv6Address: ""
-                GlobalIPv6PrefixLen: 0
-                IPAddress: ""
-                IPPrefixLen: 0
-                IPv6Gateway: ""
-                MacAddress: ""
-                Networks:
-                  bridge:
-                    NetworkID: "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812"
-                    EndpointID: "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d"
-                    Gateway: "172.17.0.1"
-                    IPAddress: "172.17.0.2"
-                    IPPrefixLen: 16
-                    IPv6Gateway: ""
-                    GlobalIPv6Address: ""
-                    GlobalIPv6PrefixLen: 0
-                    MacAddress: "02:42:ac:12:00:02"
-              Path: "/bin/sh"
-              ProcessLabel: ""
-              ResolvConfPath: "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf"
-              RestartCount: 1
-              State:
-                Error: ""
-                ExitCode: 9
-                FinishedAt: "2015-01-06T15:47:32.080254511Z"
-                Health:
-                  Status: "healthy"
-                  FailingStreak: 0
-                  Log:
-                    - Start: "2019-12-22T10:59:05.6385933Z"
-                      End: "2019-12-22T10:59:05.8078452Z"
-                      ExitCode: 0
-                      Output: ""
-                OOMKilled: false
-                Dead: false
-                Paused: false
-                Pid: 0
-                Restarting: false
-                Running: true
-                StartedAt: "2015-01-06T15:47:32.072697474Z"
-                Status: "running"
-              Mounts:
-                - Name: "fac362...80535"
-                  Source: "/data"
-                  Destination: "/data"
-                  Driver: "local"
-                  Mode: "ro,Z"
-                  RW: false
-                  Propagation: ""
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "size"
-          in: "query"
-          type: "boolean"
-          default: false
-          description: "Return the size of container as fields `SizeRw` and `SizeRootFs`"
-      tags: ["Container"]
-  /containers/{id}/top:
-    get:
-      summary: "List processes running inside a container"
-      description: |
-        On Unix systems, this is done by running the `ps` command. This endpoint
-        is not supported on Windows.
-      operationId: "ContainerTop"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "object"
-            title: "ContainerTopResponse"
-            description: "OK response to ContainerTop operation"
-            properties:
-              Titles:
-                description: "The ps column titles"
-                type: "array"
-                items:
-                  type: "string"
-              Processes:
-                description: |
-                  Each process running in the container, where each is process
-                  is an array of values corresponding to the titles.
-                type: "array"
-                items:
-                  type: "array"
-                  items:
-                    type: "string"
-          examples:
-            application/json:
-              Titles:
-                - "UID"
-                - "PID"
-                - "PPID"
-                - "C"
-                - "STIME"
-                - "TTY"
-                - "TIME"
-                - "CMD"
-              Processes:
-                -
-                  - "root"
-                  - "13642"
-                  - "882"
-                  - "0"
-                  - "17:03"
-                  - "pts/0"
-                  - "00:00:00"
-                  - "/bin/bash"
-                -
-                  - "root"
-                  - "13735"
-                  - "13642"
-                  - "0"
-                  - "17:06"
-                  - "pts/0"
-                  - "00:00:00"
-                  - "sleep 10"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "ps_args"
-          in: "query"
-          description: "The arguments to pass to `ps`. For example, `aux`"
-          type: "string"
-          default: "-ef"
-      tags: ["Container"]
-  /containers/{id}/logs:
-    get:
-      summary: "Get container logs"
-      description: |
-        Get `stdout` and `stderr` logs from a container.
-
-        Note: This endpoint works only for containers with the `json-file` or
-        `journald` logging driver.
-      produces:
-        - "application/vnd.docker.raw-stream"
-        - "application/vnd.docker.multiplexed-stream"
-      operationId: "ContainerLogs"
-      responses:
-        200:
-          description: |
-            logs returned as a stream in response body.
-            For the stream format, [see the documentation for the attach endpoint](#operation/ContainerAttach).
-            Note that unlike the attach endpoint, the logs endpoint does not
-            upgrade the connection and does not set Content-Type.
-          schema:
-            type: "string"
-            format: "binary"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "follow"
-          in: "query"
-          description: "Keep connection after returning logs."
-          type: "boolean"
-          default: false
-        - name: "stdout"
-          in: "query"
-          description: "Return logs from `stdout`"
-          type: "boolean"
-          default: false
-        - name: "stderr"
-          in: "query"
-          description: "Return logs from `stderr`"
-          type: "boolean"
-          default: false
-        - name: "since"
-          in: "query"
-          description: "Only return logs since this time, as a UNIX timestamp"
-          type: "integer"
-          default: 0
-        - name: "until"
-          in: "query"
-          description: "Only return logs before this time, as a UNIX timestamp"
-          type: "integer"
-          default: 0
-        - name: "timestamps"
-          in: "query"
-          description: "Add timestamps to every log line"
-          type: "boolean"
-          default: false
-        - name: "tail"
-          in: "query"
-          description: |
-            Only return this number of log lines from the end of the logs.
-            Specify as an integer or `all` to output all log lines.
-          type: "string"
-          default: "all"
-      tags: ["Container"]
-  /containers/{id}/changes:
-    get:
-      summary: "Get changes on a container’s filesystem"
-      description: |
-        Returns which files in a container's filesystem have been added, deleted,
-        or modified. The `Kind` of modification can be one of:
-
-        - `0`: Modified ("C")
-        - `1`: Added ("A")
-        - `2`: Deleted ("D")
-      operationId: "ContainerChanges"
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "The list of changes"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/FilesystemChange"
-          examples:
-            application/json:
-              - Path: "/dev"
-                Kind: 0
-              - Path: "/dev/kmsg"
-                Kind: 1
-              - Path: "/test"
-                Kind: 1
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-      tags: ["Container"]
-  /containers/{id}/export:
-    get:
-      summary: "Export a container"
-      description: "Export the contents of a container as a tarball."
-      operationId: "ContainerExport"
-      produces:
-        - "application/octet-stream"
-      responses:
-        200:
-          description: "no error"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-      tags: ["Container"]
-  /containers/{id}/stats:
-    get:
-      summary: "Get container stats based on resource usage"
-      description: |
-        This endpoint returns a live stream of a container’s resource usage
-        statistics.
-
-        The `precpu_stats` is the CPU statistic of the *previous* read, and is
-        used to calculate the CPU usage percentage. It is not an exact copy
-        of the `cpu_stats` field.
-
-        If either `precpu_stats.online_cpus` or `cpu_stats.online_cpus` is
-        nil then for compatibility with older daemons the length of the
-        corresponding `cpu_usage.percpu_usage` array should be used.
-
-        On a cgroup v2 host, the following fields are not set
-        * `blkio_stats`: all fields other than `io_service_bytes_recursive`
-        * `cpu_stats`: `cpu_usage.percpu_usage`
-        * `memory_stats`: `max_usage` and `failcnt`
-        Also, `memory_stats.stats` fields are incompatible with cgroup v1.
-
-        To calculate the values shown by the `stats` command of the docker cli tool
-        the following formulas can be used:
-        * used_memory = `memory_stats.usage - memory_stats.stats.cache`
-        * available_memory = `memory_stats.limit`
-        * Memory usage % = `(used_memory / available_memory) * 100.0`
-        * cpu_delta = `cpu_stats.cpu_usage.total_usage - precpu_stats.cpu_usage.total_usage`
-        * system_cpu_delta = `cpu_stats.system_cpu_usage - precpu_stats.system_cpu_usage`
-        * number_cpus = `length(cpu_stats.cpu_usage.percpu_usage)` or `cpu_stats.online_cpus`
-        * CPU usage % = `(cpu_delta / system_cpu_delta) * number_cpus * 100.0`
-      operationId: "ContainerStats"
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "object"
-          examples:
-            application/json:
-              read: "2015-01-08T22:57:31.547920715Z"
-              pids_stats:
-                current: 3
-              networks:
-                eth0:
-                  rx_bytes: 5338
-                  rx_dropped: 0
-                  rx_errors: 0
-                  rx_packets: 36
-                  tx_bytes: 648
-                  tx_dropped: 0
-                  tx_errors: 0
-                  tx_packets: 8
-                eth5:
-                  rx_bytes: 4641
-                  rx_dropped: 0
-                  rx_errors: 0
-                  rx_packets: 26
-                  tx_bytes: 690
-                  tx_dropped: 0
-                  tx_errors: 0
-                  tx_packets: 9
-              memory_stats:
-                stats:
-                  total_pgmajfault: 0
-                  cache: 0
-                  mapped_file: 0
-                  total_inactive_file: 0
-                  pgpgout: 414
-                  rss: 6537216
-                  total_mapped_file: 0
-                  writeback: 0
-                  unevictable: 0
-                  pgpgin: 477
-                  total_unevictable: 0
-                  pgmajfault: 0
-                  total_rss: 6537216
-                  total_rss_huge: 6291456
-                  total_writeback: 0
-                  total_inactive_anon: 0
-                  rss_huge: 6291456
-                  hierarchical_memory_limit: 67108864
-                  total_pgfault: 964
-                  total_active_file: 0
-                  active_anon: 6537216
-                  total_active_anon: 6537216
-                  total_pgpgout: 414
-                  total_cache: 0
-                  inactive_anon: 0
-                  active_file: 0
-                  pgfault: 964
-                  inactive_file: 0
-                  total_pgpgin: 477
-                max_usage: 6651904
-                usage: 6537216
-                failcnt: 0
-                limit: 67108864
-              blkio_stats: {}
-              cpu_stats:
-                cpu_usage:
-                  percpu_usage:
-                    - 8646879
-                    - 24472255
-                    - 36438778
-                    - 30657443
-                  usage_in_usermode: 50000000
-                  total_usage: 100215355
-                  usage_in_kernelmode: 30000000
-                system_cpu_usage: 739306590000000
-                online_cpus: 4
-                throttling_data:
-                  periods: 0
-                  throttled_periods: 0
-                  throttled_time: 0
-              precpu_stats:
-                cpu_usage:
-                  percpu_usage:
-                    - 8646879
-                    - 24350896
-                    - 36438778
-                    - 30657443
-                  usage_in_usermode: 50000000
-                  total_usage: 100093996
-                  usage_in_kernelmode: 30000000
-                system_cpu_usage: 9492140000000
-                online_cpus: 4
-                throttling_data:
-                  periods: 0
-                  throttled_periods: 0
-                  throttled_time: 0
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "stream"
-          in: "query"
-          description: |
-            Stream the output. If false, the stats will be output once and then
-            it will disconnect.
-          type: "boolean"
-          default: true
-        - name: "one-shot"
-          in: "query"
-          description: |
-            Only get a single stat instead of waiting for 2 cycles. Must be used
-            with `stream=false`.
-          type: "boolean"
-          default: false
-      tags: ["Container"]
-  /containers/{id}/resize:
-    post:
-      summary: "Resize a container TTY"
-      description: "Resize the TTY for a container."
-      operationId: "ContainerResize"
-      consumes:
-        - "application/octet-stream"
-      produces:
-        - "text/plain"
-      responses:
-        200:
-          description: "no error"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "cannot resize container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "h"
-          in: "query"
-          required: true
-          description: "Height of the TTY session in characters"
-          type: "integer"
-        - name: "w"
-          in: "query"
-          required: true
-          description: "Width of the TTY session in characters"
-          type: "integer"
-      tags: ["Container"]
-  /containers/{id}/start:
-    post:
-      summary: "Start a container"
-      operationId: "ContainerStart"
-      responses:
-        204:
-          description: "no error"
-        304:
-          description: "container already started"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "detachKeys"
-          in: "query"
-          description: |
-            Override the key sequence for detaching a container. Format is a
-            single character `[a-Z]` or `ctrl-<value>` where `<value>` is one
-            of: `a-z`, `@`, `^`, `[`, `,` or `_`.
-          type: "string"
-      tags: ["Container"]
-  /containers/{id}/stop:
-    post:
-      summary: "Stop a container"
-      operationId: "ContainerStop"
-      responses:
-        204:
-          description: "no error"
-        304:
-          description: "container already stopped"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "signal"
-          in: "query"
-          description: |
-            Signal to send to the container as an integer or string (e.g. `SIGINT`).
-          type: "string"
-        - name: "t"
-          in: "query"
-          description: "Number of seconds to wait before killing the container"
-          type: "integer"
-      tags: ["Container"]
-  /containers/{id}/restart:
-    post:
-      summary: "Restart a container"
-      operationId: "ContainerRestart"
-      responses:
-        204:
-          description: "no error"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "signal"
-          in: "query"
-          description: |
-            Signal to send to the container as an integer or string (e.g. `SIGINT`).
-          type: "string"
-        - name: "t"
-          in: "query"
-          description: "Number of seconds to wait before killing the container"
-          type: "integer"
-      tags: ["Container"]
-  /containers/{id}/kill:
-    post:
-      summary: "Kill a container"
-      description: |
-        Send a POSIX signal to a container, defaulting to killing to the
-        container.
-      operationId: "ContainerKill"
-      responses:
-        204:
-          description: "no error"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        409:
-          description: "container is not running"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "Container d37cde0fe4ad63c3a7252023b2f9800282894247d145cb5933ddf6e52cc03a28 is not running"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "signal"
-          in: "query"
-          description: |
-            Signal to send to the container as an integer or string (e.g. `SIGINT`).
-          type: "string"
-          default: "SIGKILL"
-      tags: ["Container"]
-  /containers/{id}/update:
-    post:
-      summary: "Update a container"
-      description: |
-        Change various configuration options of a container without having to
-        recreate it.
-      operationId: "ContainerUpdate"
-      consumes: ["application/json"]
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "The container has been updated."
-          schema:
-            type: "object"
-            title: "ContainerUpdateResponse"
-            description: "OK response to ContainerUpdate operation"
-            properties:
-              Warnings:
-                type: "array"
-                items:
-                  type: "string"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "update"
-          in: "body"
-          required: true
-          schema:
-            allOf:
-              - $ref: "#/definitions/Resources"
-              - type: "object"
-                properties:
-                  RestartPolicy:
-                    $ref: "#/definitions/RestartPolicy"
-            example:
-              BlkioWeight: 300
-              CpuShares: 512
-              CpuPeriod: 100000
-              CpuQuota: 50000
-              CpuRealtimePeriod: 1000000
-              CpuRealtimeRuntime: 10000
-              CpusetCpus: "0,1"
-              CpusetMems: "0"
-              Memory: 314572800
-              MemorySwap: 514288000
-              MemoryReservation: 209715200
-              RestartPolicy:
-                MaximumRetryCount: 4
-                Name: "on-failure"
-      tags: ["Container"]
-  /containers/{id}/rename:
-    post:
-      summary: "Rename a container"
-      operationId: "ContainerRename"
-      responses:
-        204:
-          description: "no error"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        409:
-          description: "name already in use"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "name"
-          in: "query"
-          required: true
-          description: "New name for the container"
-          type: "string"
-      tags: ["Container"]
-  /containers/{id}/pause:
-    post:
-      summary: "Pause a container"
-      description: |
-        Use the freezer cgroup to suspend all processes in a container.
-
-        Traditionally, when suspending a process the `SIGSTOP` signal is used,
-        which is observable by the process being suspended. With the freezer
-        cgroup the process is unaware, and unable to capture, that it is being
-        suspended, and subsequently resumed.
-      operationId: "ContainerPause"
-      responses:
-        204:
-          description: "no error"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-      tags: ["Container"]
-  /containers/{id}/unpause:
-    post:
-      summary: "Unpause a container"
-      description: "Resume a container which has been paused."
-      operationId: "ContainerUnpause"
-      responses:
-        204:
-          description: "no error"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-      tags: ["Container"]
-  /containers/{id}/attach:
-    post:
-      summary: "Attach to a container"
-      description: |
-        Attach to a container to read its output or send it input. You can attach
-        to the same container multiple times and you can reattach to containers
-        that have been detached.
-
-        Either the `stream` or `logs` parameter must be `true` for this endpoint
-        to do anything.
-
-        See the [documentation for the `docker attach` command](https://docs.docker.com/engine/reference/commandline/attach/)
-        for more details.
-
-        ### Hijacking
-
-        This endpoint hijacks the HTTP connection to transport `stdin`, `stdout`,
-        and `stderr` on the same socket.
-
-        This is the response from the daemon for an attach request:
-
-        ```
-        HTTP/1.1 200 OK
-        Content-Type: application/vnd.docker.raw-stream
-
-        [STREAM]
-        ```
-
-        After the headers and two new lines, the TCP connection can now be used
-        for raw, bidirectional communication between the client and server.
-
-        To hint potential proxies about connection hijacking, the Docker client
-        can also optionally send connection upgrade headers.
-
-        For example, the client sends this request to upgrade the connection:
-
-        ```
-        POST /containers/16253994b7c4/attach?stream=1&stdout=1 HTTP/1.1
-        Upgrade: tcp
-        Connection: Upgrade
-        ```
-
-        The Docker daemon will respond with a `101 UPGRADED` response, and will
-        similarly follow with the raw stream:
-
-        ```
-        HTTP/1.1 101 UPGRADED
-        Content-Type: application/vnd.docker.raw-stream
-        Connection: Upgrade
-        Upgrade: tcp
-
-        [STREAM]
-        ```
-
-        ### Stream format
-
-        When the TTY setting is disabled in [`POST /containers/create`](#operation/ContainerCreate),
-        the HTTP Content-Type header is set to application/vnd.docker.multiplexed-stream
-        and the stream over the hijacked connected is multiplexed to separate out
-        `stdout` and `stderr`. The stream consists of a series of frames, each
-        containing a header and a payload.
-
-        The header contains the information which the stream writes (`stdout` or
-        `stderr`). It also contains the size of the associated frame encoded in
-        the last four bytes (`uint32`).
-
-        It is encoded on the first eight bytes like this:
-
-        ```go
-        header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}
-        ```
-
-        `STREAM_TYPE` can be:
-
-        - 0: `stdin` (is written on `stdout`)
-        - 1: `stdout`
-        - 2: `stderr`
-
-        `SIZE1, SIZE2, SIZE3, SIZE4` are the four bytes of the `uint32` size
-        encoded as big endian.
-
-        Following the header is the payload, which is the specified number of
-        bytes of `STREAM_TYPE`.
-
-        The simplest way to implement this protocol is the following:
-
-        1. Read 8 bytes.
-        2. Choose `stdout` or `stderr` depending on the first byte.
-        3. Extract the frame size from the last four bytes.
-        4. Read the extracted size and output it on the correct output.
-        5. Goto 1.
-
-        ### Stream format when using a TTY
-
-        When the TTY setting is enabled in [`POST /containers/create`](#operation/ContainerCreate),
-        the stream is not multiplexed. The data exchanged over the hijacked
-        connection is simply the raw data from the process PTY and client's
-        `stdin`.
-
-      operationId: "ContainerAttach"
-      produces:
-        - "application/vnd.docker.raw-stream"
-        - "application/vnd.docker.multiplexed-stream"
-      responses:
-        101:
-          description: "no error, hints proxy about hijacking"
-        200:
-          description: "no error, no upgrade header found"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "detachKeys"
-          in: "query"
-          description: |
-            Override the key sequence for detaching a container.Format is a single
-            character `[a-Z]` or `ctrl-<value>` where `<value>` is one of: `a-z`,
-            `@`, `^`, `[`, `,` or `_`.
-          type: "string"
-        - name: "logs"
-          in: "query"
-          description: |
-            Replay previous logs from the container.
-
-            This is useful for attaching to a container that has started and you
-            want to output everything since the container started.
-
-            If `stream` is also enabled, once all the previous output has been
-            returned, it will seamlessly transition into streaming current
-            output.
-          type: "boolean"
-          default: false
-        - name: "stream"
-          in: "query"
-          description: |
-            Stream attached streams from the time the request was made onwards.
-          type: "boolean"
-          default: false
-        - name: "stdin"
-          in: "query"
-          description: "Attach to `stdin`"
-          type: "boolean"
-          default: false
-        - name: "stdout"
-          in: "query"
-          description: "Attach to `stdout`"
-          type: "boolean"
-          default: false
-        - name: "stderr"
-          in: "query"
-          description: "Attach to `stderr`"
-          type: "boolean"
-          default: false
-      tags: ["Container"]
-  /containers/{id}/attach/ws:
-    get:
-      summary: "Attach to a container via a websocket"
-      operationId: "ContainerAttachWebsocket"
-      responses:
-        101:
-          description: "no error, hints proxy about hijacking"
-        200:
-          description: "no error, no upgrade header found"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "detachKeys"
-          in: "query"
-          description: |
-            Override the key sequence for detaching a container.Format is a single
-            character `[a-Z]` or `ctrl-<value>` where `<value>` is one of: `a-z`,
-            `@`, `^`, `[`, `,`, or `_`.
-          type: "string"
-        - name: "logs"
-          in: "query"
-          description: "Return logs"
-          type: "boolean"
-          default: false
-        - name: "stream"
-          in: "query"
-          description: "Return stream"
-          type: "boolean"
-          default: false
-        - name: "stdin"
-          in: "query"
-          description: "Attach to `stdin`"
-          type: "boolean"
-          default: false
-        - name: "stdout"
-          in: "query"
-          description: "Attach to `stdout`"
-          type: "boolean"
-          default: false
-        - name: "stderr"
-          in: "query"
-          description: "Attach to `stderr`"
-          type: "boolean"
-          default: false
-      tags: ["Container"]
-  /containers/{id}/wait:
-    post:
-      summary: "Wait for a container"
-      description: "Block until a container stops, then returns the exit code."
-      operationId: "ContainerWait"
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "The container has exit."
-          schema:
-            $ref: "#/definitions/ContainerWaitResponse"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "condition"
-          in: "query"
-          description: |
-            Wait until a container state reaches the given condition.
-
-            Defaults to `not-running` if omitted or empty.
-          type: "string"
-          enum:
-            - "not-running"
-            - "next-exit"
-            - "removed"
-          default: "not-running"
-      tags: ["Container"]
-  /containers/{id}:
-    delete:
-      summary: "Remove a container"
-      operationId: "ContainerDelete"
-      responses:
-        204:
-          description: "no error"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        409:
-          description: "conflict"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: |
-                You cannot remove a running container: c2ada9df5af8. Stop the
-                container before attempting removal or force remove
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "v"
-          in: "query"
-          description: "Remove anonymous volumes associated with the container."
-          type: "boolean"
-          default: false
-        - name: "force"
-          in: "query"
-          description: "If the container is running, kill it before removing it."
-          type: "boolean"
-          default: false
-        - name: "link"
-          in: "query"
-          description: "Remove the specified link associated with the container."
-          type: "boolean"
-          default: false
-      tags: ["Container"]
-  /containers/{id}/archive:
-    head:
-      summary: "Get information about files in a container"
-      description: |
-        A response header `X-Docker-Container-Path-Stat` is returned, containing
-        a base64 - encoded JSON object with some filesystem header information
-        about the path.
-      operationId: "ContainerArchiveInfo"
-      responses:
-        200:
-          description: "no error"
-          headers:
-            X-Docker-Container-Path-Stat:
-              type: "string"
-              description: |
-                A base64 - encoded JSON object with some filesystem header
-                information about the path
-        400:
-          description: "Bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "Container or path does not exist"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "path"
-          in: "query"
-          required: true
-          description: "Resource in the container’s filesystem to archive."
-          type: "string"
-      tags: ["Container"]
-    get:
-      summary: "Get an archive of a filesystem resource in a container"
-      description: "Get a tar archive of a resource in the filesystem of container id."
-      operationId: "ContainerArchive"
-      produces: ["application/x-tar"]
-      responses:
-        200:
-          description: "no error"
-        400:
-          description: "Bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "Container or path does not exist"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "path"
-          in: "query"
-          required: true
-          description: "Resource in the container’s filesystem to archive."
-          type: "string"
-      tags: ["Container"]
-    put:
-      summary: "Extract an archive of files or folders to a directory in a container"
-      description: |
-        Upload a tar archive to be extracted to a path in the filesystem of container id.
-        `path` parameter is asserted to be a directory. If it exists as a file, 400 error
-        will be returned with message "not a directory".
-      operationId: "PutContainerArchive"
-      consumes: ["application/x-tar", "application/octet-stream"]
-      responses:
-        200:
-          description: "The content was extracted successfully"
-        400:
-          description: "Bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "not a directory"
-        403:
-          description: "Permission denied, the volume or container rootfs is marked as read-only."
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "No such container or path does not exist inside the container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the container"
-          type: "string"
-        - name: "path"
-          in: "query"
-          required: true
-          description: "Path to a directory in the container to extract the archive’s contents into. "
-          type: "string"
-        - name: "noOverwriteDirNonDir"
-          in: "query"
-          description: |
-            If `1`, `true`, or `True` then it will be an error if unpacking the
-            given content would cause an existing directory to be replaced with
-            a non-directory and vice versa.
-          type: "string"
-        - name: "copyUIDGID"
-          in: "query"
-          description: |
-            If `1`, `true`, then it will copy UID/GID maps to the dest file or
-            dir
-          type: "string"
-        - name: "inputStream"
-          in: "body"
-          required: true
-          description: |
-            The input stream must be a tar archive compressed with one of the
-            following algorithms: `identity` (no compression), `gzip`, `bzip2`,
-            or `xz`.
-          schema:
-            type: "string"
-            format: "binary"
-      tags: ["Container"]
-  /containers/prune:
-    post:
-      summary: "Delete stopped containers"
-      produces:
-        - "application/json"
-      operationId: "ContainerPrune"
-      parameters:
-        - name: "filters"
-          in: "query"
-          description: |
-            Filters to process on the prune list, encoded as JSON (a `map[string][]string`).
-
-            Available filters:
-            - `until=<timestamp>` Prune containers created before this timestamp. The `<timestamp>` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time.
-            - `label` (`label=<key>`, `label=<key>=<value>`, `label!=<key>`, or `label!=<key>=<value>`) Prune containers with (or without, in case `label!=...` is used) the specified labels.
-          type: "string"
-      responses:
-        200:
-          description: "No error"
-          schema:
-            type: "object"
-            title: "ContainerPruneResponse"
-            properties:
-              ContainersDeleted:
-                description: "Container IDs that were deleted"
-                type: "array"
-                items:
-                  type: "string"
-              SpaceReclaimed:
-                description: "Disk space reclaimed in bytes"
-                type: "integer"
-                format: "int64"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Container"]
-  /images/json:
-    get:
-      summary: "List Images"
-      description: "Returns a list of images on the server. Note that it uses a different, smaller representation of an image than inspecting a single image."
-      operationId: "ImageList"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "Summary image data for the images matching the query"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/ImageSummary"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "all"
-          in: "query"
-          description: "Show all images. Only images from a final layer (no children) are shown by default."
-          type: "boolean"
-          default: false
-        - name: "filters"
-          in: "query"
-          description: |
-            A JSON encoded value of the filters (a `map[string][]string`) to
-            process on the images list.
-
-            Available filters:
-
-            - `before`=(`<image-name>[:<tag>]`,  `<image id>` or `<image@digest>`)
-            - `dangling=true`
-            - `label=key` or `label="key=value"` of an image label
-            - `reference`=(`<image-name>[:<tag>]`)
-            - `since`=(`<image-name>[:<tag>]`,  `<image id>` or `<image@digest>`)
-            - `until=<timestamp>`
-          type: "string"
-        - name: "shared-size"
-          in: "query"
-          description: "Compute and show shared size as a `SharedSize` field on each image."
-          type: "boolean"
-          default: false
-        - name: "digests"
-          in: "query"
-          description: "Show digest information as a `RepoDigests` field on each image."
-          type: "boolean"
-          default: false
-        - name: "manifests"
-          in: "query"
-          description: "Include `Manifests` in the image summary."
-          type: "boolean"
-          default: false
-      tags: ["Image"]
-  /build:
-    post:
-      summary: "Build an image"
-      description: |
-        Build an image from a tar archive with a `Dockerfile` in it.
-
-        The `Dockerfile` specifies how the image is built from the tar archive. It is typically in the archive's root, but can be at a different path or have a different name by specifying the `dockerfile` parameter. [See the `Dockerfile` reference for more information](https://docs.docker.com/engine/reference/builder/).
-
-        The Docker daemon performs a preliminary validation of the `Dockerfile` before starting the build, and returns an error if the syntax is incorrect. After that, each instruction is run one-by-one until the ID of the new image is output.
-
-        The build is canceled if the client drops the connection by quitting or being killed.
-      operationId: "ImageBuild"
-      consumes:
-        - "application/octet-stream"
-      produces:
-        - "application/json"
-      parameters:
-        - name: "inputStream"
-          in: "body"
-          description: "A tar archive compressed with one of the following algorithms: identity (no compression), gzip, bzip2, xz."
-          schema:
-            type: "string"
-            format: "binary"
-        - name: "dockerfile"
-          in: "query"
-          description: "Path within the build context to the `Dockerfile`. This is ignored if `remote` is specified and points to an external `Dockerfile`."
-          type: "string"
-          default: "Dockerfile"
-        - name: "t"
-          in: "query"
-          description: "A name and optional tag to apply to the image in the `name:tag` format. If you omit the tag the default `latest` value is assumed. You can provide several `t` parameters."
-          type: "string"
-        - name: "extrahosts"
-          in: "query"
-          description: "Extra hosts to add to /etc/hosts"
-          type: "string"
-        - name: "remote"
-          in: "query"
-          description: "A Git repository URI or HTTP/HTTPS context URI. If the URI points to a single text file, the file’s contents are placed into a file called `Dockerfile` and the image is built from that file. If the URI points to a tarball, the file is downloaded by the daemon and the contents therein used as the context for the build. If the URI points to a tarball and the `dockerfile` parameter is also specified, there must be a file with the corresponding path inside the tarball."
-          type: "string"
-        - name: "q"
-          in: "query"
-          description: "Suppress verbose build output."
-          type: "boolean"
-          default: false
-        - name: "nocache"
-          in: "query"
-          description: "Do not use the cache when building the image."
-          type: "boolean"
-          default: false
-        - name: "cachefrom"
-          in: "query"
-          description: "JSON array of images used for build cache resolution."
-          type: "string"
-        - name: "pull"
-          in: "query"
-          description: "Attempt to pull the image even if an older image exists locally."
-          type: "string"
-        - name: "rm"
-          in: "query"
-          description: "Remove intermediate containers after a successful build."
-          type: "boolean"
-          default: true
-        - name: "forcerm"
-          in: "query"
-          description: "Always remove intermediate containers, even upon failure."
-          type: "boolean"
-          default: false
-        - name: "memory"
-          in: "query"
-          description: "Set memory limit for build."
-          type: "integer"
-        - name: "memswap"
-          in: "query"
-          description: "Total memory (memory + swap). Set as `-1` to disable swap."
-          type: "integer"
-        - name: "cpushares"
-          in: "query"
-          description: "CPU shares (relative weight)."
-          type: "integer"
-        - name: "cpusetcpus"
-          in: "query"
-          description: "CPUs in which to allow execution (e.g., `0-3`, `0,1`)."
-          type: "string"
-        - name: "cpuperiod"
-          in: "query"
-          description: "The length of a CPU period in microseconds."
-          type: "integer"
-        - name: "cpuquota"
-          in: "query"
-          description: "Microseconds of CPU time that the container can get in a CPU period."
-          type: "integer"
-        - name: "buildargs"
-          in: "query"
-          description: >
-            JSON map of string pairs for build-time variables. Users pass these values at build-time. Docker
-            uses the buildargs as the environment context for commands run via the `Dockerfile` RUN
-            instruction, or for variable expansion in other `Dockerfile` instructions. This is not meant for
-            passing secret values.
-
-
-            For example, the build arg `FOO=bar` would become `{"FOO":"bar"}` in JSON. This would result in the
-            query parameter `buildargs={"FOO":"bar"}`. Note that `{"FOO":"bar"}` should be URI component encoded.
-
-
-            [Read more about the buildargs instruction.](https://docs.docker.com/engine/reference/builder/#arg)
-          type: "string"
-        - name: "shmsize"
-          in: "query"
-          description: "Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB."
-          type: "integer"
-        - name: "squash"
-          in: "query"
-          description: "Squash the resulting images layers into a single layer. *(Experimental release only.)*"
-          type: "boolean"
-        - name: "labels"
-          in: "query"
-          description: "Arbitrary key/value labels to set on the image, as a JSON map of string pairs."
-          type: "string"
-        - name: "networkmode"
-          in: "query"
-          description: |
-            Sets the networking mode for the run commands during build. Supported
-            standard values are: `bridge`, `host`, `none`, and `container:<name|id>`.
-            Any other value is taken as a custom network's name or ID to which this
-            container should connect to.
-          type: "string"
-        - name: "Content-type"
-          in: "header"
-          type: "string"
-          enum:
-            - "application/x-tar"
-          default: "application/x-tar"
-        - name: "X-Registry-Config"
-          in: "header"
-          description: |
-            This is a base64-encoded JSON object with auth configurations for multiple registries that a build may refer to.
-
-            The key is a registry URL, and the value is an auth configuration object, [as described in the authentication section](#section/Authentication). For example:
-
-            ```
-            {
-              "docker.example.com": {
-                "username": "janedoe",
-                "password": "hunter2"
-              },
-              "https://index.docker.io/v1/": {
-                "username": "mobydock",
-                "password": "conta1n3rize14"
-              }
-            }
-            ```
-
-            Only the registry domain name (and port if not the default 443) are required. However, for legacy reasons, the Docker Hub registry must be specified with both a `https://` prefix and a `/v1/` suffix even though Docker will prefer to use the v2 registry API.
-          type: "string"
-        - name: "platform"
-          in: "query"
-          description: "Platform in the format os[/arch[/variant]]"
-          type: "string"
-          default: ""
-        - name: "target"
-          in: "query"
-          description: "Target build stage"
-          type: "string"
-          default: ""
-        - name: "outputs"
-          in: "query"
-          description: "BuildKit output configuration"
-          type: "string"
-          default: ""
-        - name: "version"
-          in: "query"
-          type: "string"
-          default: "1"
-          enum: ["1", "2"]
-          description: |
-            Version of the builder backend to use.
-
-            - `1` is the first generation classic (deprecated) builder in the Docker daemon (default)
-            - `2` is [BuildKit](https://github.com/moby/buildkit)
-      responses:
-        200:
-          description: "no error"
-        400:
-          description: "Bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Image"]
-  /build/prune:
-    post:
-      summary: "Delete builder cache"
-      produces:
-        - "application/json"
-      operationId: "BuildPrune"
-      parameters:
-        - name: "keep-storage"
-          in: "query"
-          description: "Amount of disk space in bytes to keep for cache"
-          type: "integer"
-          format: "int64"
-        - name: "all"
-          in: "query"
-          type: "boolean"
-          description: "Remove all types of build cache"
-        - name: "filters"
-          in: "query"
-          type: "string"
-          description: |
-            A JSON encoded value of the filters (a `map[string][]string`) to
-            process on the list of build cache objects.
-
-            Available filters:
-
-            - `until=<timestamp>` remove cache older than `<timestamp>`. The `<timestamp>` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon's local time.
-            - `id=<id>`
-            - `parent=<id>`
-            - `type=<string>`
-            - `description=<string>`
-            - `inuse`
-            - `shared`
-            - `private`
-      responses:
-        200:
-          description: "No error"
-          schema:
-            type: "object"
-            title: "BuildPruneResponse"
-            properties:
-              CachesDeleted:
-                type: "array"
-                items:
-                  description: "ID of build cache object"
-                  type: "string"
-              SpaceReclaimed:
-                description: "Disk space reclaimed in bytes"
-                type: "integer"
-                format: "int64"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Image"]
-  /images/create:
-    post:
-      summary: "Create an image"
-      description: "Pull or import an image."
-      operationId: "ImageCreate"
-      consumes:
-        - "text/plain"
-        - "application/octet-stream"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "no error"
-        404:
-          description: "repository does not exist or no read access"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "fromImage"
-          in: "query"
-          description: "Name of the image to pull. The name may include a tag or digest. This parameter may only be used when pulling an image. The pull is cancelled if the HTTP connection is closed."
-          type: "string"
-        - name: "fromSrc"
-          in: "query"
-          description: "Source to import. The value may be a URL from which the image can be retrieved or `-` to read the image from the request body. This parameter may only be used when importing an image."
-          type: "string"
-        - name: "repo"
-          in: "query"
-          description: "Repository name given to an image when it is imported. The repo may include a tag. This parameter may only be used when importing an image."
-          type: "string"
-        - name: "tag"
-          in: "query"
-          description: "Tag or digest. If empty when pulling an image, this causes all tags for the given image to be pulled."
-          type: "string"
-        - name: "message"
-          in: "query"
-          description: "Set commit message for imported image."
-          type: "string"
-        - name: "inputImage"
-          in: "body"
-          description: "Image content if the value `-` has been specified in fromSrc query parameter"
-          schema:
-            type: "string"
-          required: false
-        - name: "X-Registry-Auth"
-          in: "header"
-          description: |
-            A base64url-encoded auth configuration.
-
-            Refer to the [authentication section](#section/Authentication) for
-            details.
-          type: "string"
-        - name: "changes"
-          in: "query"
-          description: |
-            Apply `Dockerfile` instructions to the image that is created,
-            for example: `changes=ENV DEBUG=true`.
-            Note that `ENV DEBUG=true` should be URI component encoded.
-
-            Supported `Dockerfile` instructions:
-            `CMD`|`ENTRYPOINT`|`ENV`|`EXPOSE`|`ONBUILD`|`USER`|`VOLUME`|`WORKDIR`
-          type: "array"
-          items:
-            type: "string"
-        - name: "platform"
-          in: "query"
-          description: |
-            Platform in the format os[/arch[/variant]].
-
-            When used in combination with the `fromImage` option, the daemon checks
-            if the given image is present in the local image cache with the given
-            OS and Architecture, and otherwise attempts to pull the image. If the
-            option is not set, the host's native OS and Architecture are used.
-            If the given image does not exist in the local image cache, the daemon
-            attempts to pull the image with the host's native OS and Architecture.
-            If the given image does exists in the local image cache, but its OS or
-            architecture does not match, a warning is produced.
-
-            When used with the `fromSrc` option to import an image from an archive,
-            this option sets the platform information for the imported image. If
-            the option is not set, the host's native OS and Architecture are used
-            for the imported image.
-          type: "string"
-          default: ""
-      tags: ["Image"]
-  /images/{name}/json:
-    get:
-      summary: "Inspect an image"
-      description: "Return low-level information about an image."
-      operationId: "ImageInspect"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "No error"
-          schema:
-            $ref: "#/definitions/ImageInspect"
-        404:
-          description: "No such image"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such image: someimage (tag: latest)"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: "Image name or id"
-          type: "string"
-          required: true
-      tags: ["Image"]
-  /images/{name}/history:
-    get:
-      summary: "Get the history of an image"
-      description: "Return parent layers of an image."
-      operationId: "ImageHistory"
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "List of image layers"
-          schema:
-            type: "array"
-            items:
-              type: "object"
-              x-go-name: HistoryResponseItem
-              title: "HistoryResponseItem"
-              description: "individual image layer information in response to ImageHistory operation"
-              required: [Id, Created, CreatedBy, Tags, Size, Comment]
-              properties:
-                Id:
-                  type: "string"
-                  x-nullable: false
-                Created:
-                  type: "integer"
-                  format: "int64"
-                  x-nullable: false
-                CreatedBy:
-                  type: "string"
-                  x-nullable: false
-                Tags:
-                  type: "array"
-                  items:
-                    type: "string"
-                Size:
-                  type: "integer"
-                  format: "int64"
-                  x-nullable: false
-                Comment:
-                  type: "string"
-                  x-nullable: false
-          examples:
-            application/json:
-              - Id: "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710"
-                Created: 1398108230
-                CreatedBy: "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /"
-                Tags:
-                  - "ubuntu:lucid"
-                  - "ubuntu:10.04"
-                Size: 182964289
-                Comment: ""
-              - Id: "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8"
-                Created: 1398108222
-                CreatedBy: "/bin/sh -c #(nop) MAINTAINER Tianon Gravi <admwiggin@gmail.com> - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/"
-                Tags: []
-                Size: 0
-                Comment: ""
-              - Id: "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158"
-                Created: 1371157430
-                CreatedBy: ""
-                Tags:
-                  - "scratch12:latest"
-                  - "scratch:latest"
-                Size: 0
-                Comment: "Imported from -"
-        404:
-          description: "No such image"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: "Image name or ID"
-          type: "string"
-          required: true
-      tags: ["Image"]
-  /images/{name}/push:
-    post:
-      summary: "Push an image"
-      description: |
-        Push an image to a registry.
-
-        If you wish to push an image on to a private registry, that image must
-        already have a tag which references the registry. For example,
-        `registry.example.com/myimage:latest`.
-
-        The push is cancelled if the HTTP connection is closed.
-      operationId: "ImagePush"
-      consumes:
-        - "application/octet-stream"
-      responses:
-        200:
-          description: "No error"
-        404:
-          description: "No such image"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: |
-            Name of the image to push. For example, `registry.example.com/myimage`.
-            The image must be present in the local image store with the same name.
-
-            The name should be provided without tag; if a tag is provided, it
-            is ignored. For example, `registry.example.com/myimage:latest` is
-            considered equivalent to `registry.example.com/myimage`.
-
-            Use the `tag` parameter to specify the tag to push.
-          type: "string"
-          required: true
-        - name: "tag"
-          in: "query"
-          description: |
-            Tag of the image to push. For example, `latest`. If no tag is provided,
-            all tags of the given image that are present in the local image store
-            are pushed.
-          type: "string"
-        - name: "platform"
-          type: "string"
-          in: "query"
-          description: |
-            JSON-encoded OCI platform to select the platform-variant to push.
-            If not provided, all available variants will attempt to be pushed.
-
-            If the daemon provides a multi-platform image store, this selects
-            the platform-variant to push to the registry. If the image is
-            a single-platform image, or if the multi-platform image does not
-            provide a variant matching the given platform, an error is returned.
-
-            Example: `{"os": "linux", "architecture": "arm", "variant": "v5"}`
-        - name: "X-Registry-Auth"
-          in: "header"
-          description: |
-            A base64url-encoded auth configuration.
-
-            Refer to the [authentication section](#section/Authentication) for
-            details.
-          type: "string"
-          required: true
-      tags: ["Image"]
-  /images/{name}/tag:
-    post:
-      summary: "Tag an image"
-      description: "Tag an image so that it becomes part of a repository."
-      operationId: "ImageTag"
-      responses:
-        201:
-          description: "No error"
-        400:
-          description: "Bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "No such image"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        409:
-          description: "Conflict"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: "Image name or ID to tag."
-          type: "string"
-          required: true
-        - name: "repo"
-          in: "query"
-          description: "The repository to tag in. For example, `someuser/someimage`."
-          type: "string"
-        - name: "tag"
-          in: "query"
-          description: "The name of the new tag."
-          type: "string"
-      tags: ["Image"]
-  /images/{name}:
-    delete:
-      summary: "Remove an image"
-      description: |
-        Remove an image, along with any untagged parent images that were
-        referenced by that image.
-
-        Images can't be removed if they have descendant images, are being
-        used by a running container or are being used by a build.
-      operationId: "ImageDelete"
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "The image was deleted successfully"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/ImageDeleteResponseItem"
-          examples:
-            application/json:
-              - Untagged: "3e2f21a89f"
-              - Deleted: "3e2f21a89f"
-              - Deleted: "53b4f83ac9"
-        404:
-          description: "No such image"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        409:
-          description: "Conflict"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: "Image name or ID"
-          type: "string"
-          required: true
-        - name: "force"
-          in: "query"
-          description: "Remove the image even if it is being used by stopped containers or has other tags"
-          type: "boolean"
-          default: false
-        - name: "noprune"
-          in: "query"
-          description: "Do not delete untagged parent images"
-          type: "boolean"
-          default: false
-      tags: ["Image"]
-  /images/search:
-    get:
-      summary: "Search images"
-      description: "Search for an image on Docker Hub."
-      operationId: "ImageSearch"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "No error"
-          schema:
-            type: "array"
-            items:
-              type: "object"
-              title: "ImageSearchResponseItem"
-              properties:
-                description:
-                  type: "string"
-                is_official:
-                  type: "boolean"
-                is_automated:
-                  description: |
-                    Whether this repository has automated builds enabled.
-
-                    <p><br /></p>
-
-                    > **Deprecated**: This field is deprecated and will always be "false".
-                  type: "boolean"
-                  example: false
-                name:
-                  type: "string"
-                star_count:
-                  type: "integer"
-          examples:
-            application/json:
-              - description: "A minimal Docker image based on Alpine Linux with a complete package index and only 5 MB in size!"
-                is_official: true
-                is_automated: false
-                name: "alpine"
-                star_count: 10093
-              - description: "Busybox base image."
-                is_official: true
-                is_automated: false
-                name: "Busybox base image."
-                star_count: 3037
-              - description: "The PostgreSQL object-relational database system provides reliability and data integrity."
-                is_official: true
-                is_automated: false
-                name: "postgres"
-                star_count: 12408
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "term"
-          in: "query"
-          description: "Term to search"
-          type: "string"
-          required: true
-        - name: "limit"
-          in: "query"
-          description: "Maximum number of results to return"
-          type: "integer"
-        - name: "filters"
-          in: "query"
-          description: |
-            A JSON encoded value of the filters (a `map[string][]string`) to process on the images list. Available filters:
-
-            - `is-official=(true|false)`
-            - `stars=<number>` Matches images that has at least 'number' stars.
-          type: "string"
-      tags: ["Image"]
-  /images/prune:
-    post:
-      summary: "Delete unused images"
-      produces:
-        - "application/json"
-      operationId: "ImagePrune"
-      parameters:
-        - name: "filters"
-          in: "query"
-          description: |
-            Filters to process on the prune list, encoded as JSON (a `map[string][]string`). Available filters:
-
-            - `dangling=<boolean>` When set to `true` (or `1`), prune only
-               unused *and* untagged images. When set to `false`
-               (or `0`), all unused images are pruned.
-            - `until=<string>` Prune images created before this timestamp. The `<timestamp>` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time.
-            - `label` (`label=<key>`, `label=<key>=<value>`, `label!=<key>`, or `label!=<key>=<value>`) Prune images with (or without, in case `label!=...` is used) the specified labels.
-          type: "string"
-      responses:
-        200:
-          description: "No error"
-          schema:
-            type: "object"
-            title: "ImagePruneResponse"
-            properties:
-              ImagesDeleted:
-                description: "Images that were deleted"
-                type: "array"
-                items:
-                  $ref: "#/definitions/ImageDeleteResponseItem"
-              SpaceReclaimed:
-                description: "Disk space reclaimed in bytes"
-                type: "integer"
-                format: "int64"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Image"]
-  /auth:
-    post:
-      summary: "Check auth configuration"
-      description: |
-        Validate credentials for a registry and, if available, get an identity
-        token for accessing the registry without password.
-      operationId: "SystemAuth"
-      consumes: ["application/json"]
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "An identity token was generated successfully."
-          schema:
-            type: "object"
-            title: "SystemAuthResponse"
-            required: [Status]
-            properties:
-              Status:
-                description: "The status of the authentication"
-                type: "string"
-                x-nullable: false
-              IdentityToken:
-                description: "An opaque token used to authenticate a user after a successful login"
-                type: "string"
-                x-nullable: false
-          examples:
-            application/json:
-              Status: "Login Succeeded"
-              IdentityToken: "9cbaf023786cd7..."
-        204:
-          description: "No error"
-        401:
-          description: "Auth error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "authConfig"
-          in: "body"
-          description: "Authentication to check"
-          schema:
-            $ref: "#/definitions/AuthConfig"
-      tags: ["System"]
-  /info:
-    get:
-      summary: "Get system information"
-      operationId: "SystemInfo"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "No error"
-          schema:
-            $ref: "#/definitions/SystemInfo"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["System"]
-  /version:
-    get:
-      summary: "Get version"
-      description: "Returns the version of Docker that is running and various information about the system that Docker is running on."
-      operationId: "SystemVersion"
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/SystemVersion"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["System"]
-  /_ping:
-    get:
-      summary: "Ping"
-      description: "This is a dummy endpoint you can use to test if the server is accessible."
-      operationId: "SystemPing"
-      produces: ["text/plain"]
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "string"
-            example: "OK"
-          headers:
-            Api-Version:
-              type: "string"
-              description: "Max API Version the server supports"
-            Builder-Version:
-              type: "string"
-              description: |
-                Default version of docker image builder
-
-                The default on Linux is version "2" (BuildKit), but the daemon
-                can be configured to recommend version "1" (classic Builder).
-                Windows does not yet support BuildKit for native Windows images,
-                and uses "1" (classic builder) as a default.
-
-                This value is a recommendation as advertised by the daemon, and
-                it is up to the client to choose which builder to use.
-              default: "2"
-            Docker-Experimental:
-              type: "boolean"
-              description: "If the server is running with experimental mode enabled"
-            Swarm:
-              type: "string"
-              enum: ["inactive", "pending", "error", "locked", "active/worker", "active/manager"]
-              description: |
-                Contains information about Swarm status of the daemon,
-                and if the daemon is acting as a manager or worker node.
-              default: "inactive"
-            Cache-Control:
-              type: "string"
-              default: "no-cache, no-store, must-revalidate"
-            Pragma:
-              type: "string"
-              default: "no-cache"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          headers:
-            Cache-Control:
-              type: "string"
-              default: "no-cache, no-store, must-revalidate"
-            Pragma:
-              type: "string"
-              default: "no-cache"
-      tags: ["System"]
-    head:
-      summary: "Ping"
-      description: "This is a dummy endpoint you can use to test if the server is accessible."
-      operationId: "SystemPingHead"
-      produces: ["text/plain"]
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "string"
-            example: "(empty)"
-          headers:
-            Api-Version:
-              type: "string"
-              description: "Max API Version the server supports"
-            Builder-Version:
-              type: "string"
-              description: "Default version of docker image builder"
-            Docker-Experimental:
-              type: "boolean"
-              description: "If the server is running with experimental mode enabled"
-            Swarm:
-              type: "string"
-              enum: ["inactive", "pending", "error", "locked", "active/worker", "active/manager"]
-              description: |
-                Contains information about Swarm status of the daemon,
-                and if the daemon is acting as a manager or worker node.
-              default: "inactive"
-            Cache-Control:
-              type: "string"
-              default: "no-cache, no-store, must-revalidate"
-            Pragma:
-              type: "string"
-              default: "no-cache"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["System"]
-  /commit:
-    post:
-      summary: "Create a new image from a container"
-      operationId: "ImageCommit"
-      consumes:
-        - "application/json"
-      produces:
-        - "application/json"
-      responses:
-        201:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/IdResponse"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "containerConfig"
-          in: "body"
-          description: "The container configuration"
-          schema:
-            $ref: "#/definitions/ContainerConfig"
-        - name: "container"
-          in: "query"
-          description: "The ID or name of the container to commit"
-          type: "string"
-        - name: "repo"
-          in: "query"
-          description: "Repository name for the created image"
-          type: "string"
-        - name: "tag"
-          in: "query"
-          description: "Tag name for the create image"
-          type: "string"
-        - name: "comment"
-          in: "query"
-          description: "Commit message"
-          type: "string"
-        - name: "author"
-          in: "query"
-          description: "Author of the image (e.g., `John Hannibal Smith <hannibal@a-team.com>`)"
-          type: "string"
-        - name: "pause"
-          in: "query"
-          description: "Whether to pause the container before committing"
-          type: "boolean"
-          default: true
-        - name: "changes"
-          in: "query"
-          description: "`Dockerfile` instructions to apply while committing"
-          type: "string"
-      tags: ["Image"]
-  /events:
-    get:
-      summary: "Monitor events"
-      description: |
-        Stream real-time events from the server.
-
-        Various objects within Docker report events when something happens to them.
-
-        Containers report these events: `attach`, `commit`, `copy`, `create`, `destroy`, `detach`, `die`, `exec_create`, `exec_detach`, `exec_start`, `exec_die`, `export`, `health_status`, `kill`, `oom`, `pause`, `rename`, `resize`, `restart`, `start`, `stop`, `top`, `unpause`, `update`, and `prune`
-
-        Images report these events: `create`, `delete`, `import`, `load`, `pull`, `push`, `save`, `tag`, `untag`, and `prune`
-
-        Volumes report these events: `create`, `mount`, `unmount`, `destroy`, and `prune`
-
-        Networks report these events: `create`, `connect`, `disconnect`, `destroy`, `update`, `remove`, and `prune`
-
-        The Docker daemon reports these events: `reload`
-
-        Services report these events: `create`, `update`, and `remove`
-
-        Nodes report these events: `create`, `update`, and `remove`
-
-        Secrets report these events: `create`, `update`, and `remove`
-
-        Configs report these events: `create`, `update`, and `remove`
-
-        The Builder reports `prune` events
-
-      operationId: "SystemEvents"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/EventMessage"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "since"
-          in: "query"
-          description: "Show events created since this timestamp then stream new events."
-          type: "string"
-        - name: "until"
-          in: "query"
-          description: "Show events created until this timestamp then stop streaming."
-          type: "string"
-        - name: "filters"
-          in: "query"
-          description: |
-            A JSON encoded value of filters (a `map[string][]string`) to process on the event list. Available filters:
-
-            - `config=<string>` config name or ID
-            - `container=<string>` container name or ID
-            - `daemon=<string>` daemon name or ID
-            - `event=<string>` event type
-            - `image=<string>` image name or ID
-            - `label=<string>` image or container label
-            - `network=<string>` network name or ID
-            - `node=<string>` node ID
-            - `plugin`=<string> plugin name or ID
-            - `scope`=<string> local or swarm
-            - `secret=<string>` secret name or ID
-            - `service=<string>` service name or ID
-            - `type=<string>` object to filter by, one of `container`, `image`, `volume`, `network`, `daemon`, `plugin`, `node`, `service`, `secret` or `config`
-            - `volume=<string>` volume name
-          type: "string"
-      tags: ["System"]
-  /system/df:
-    get:
-      summary: "Get data usage information"
-      operationId: "SystemDataUsage"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "object"
-            title: "SystemDataUsageResponse"
-            properties:
-              LayersSize:
-                type: "integer"
-                format: "int64"
-              Images:
-                type: "array"
-                items:
-                  $ref: "#/definitions/ImageSummary"
-              Containers:
-                type: "array"
-                items:
-                  $ref: "#/definitions/ContainerSummary"
-              Volumes:
-                type: "array"
-                items:
-                  $ref: "#/definitions/Volume"
-              BuildCache:
-                type: "array"
-                items:
-                  $ref: "#/definitions/BuildCache"
-            example:
-              LayersSize: 1092588
-              Images:
-                -
-                  Id: "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749"
-                  ParentId: ""
-                  RepoTags:
-                    - "busybox:latest"
-                  RepoDigests:
-                    - "busybox@sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6"
-                  Created: 1466724217
-                  Size: 1092588
-                  SharedSize: 0
-                  Labels: {}
-                  Containers: 1
-              Containers:
-                -
-                  Id: "e575172ed11dc01bfce087fb27bee502db149e1a0fad7c296ad300bbff178148"
-                  Names:
-                    - "/top"
-                  Image: "busybox"
-                  ImageID: "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749"
-                  Command: "top"
-                  Created: 1472592424
-                  Ports: []
-                  SizeRootFs: 1092588
-                  Labels: {}
-                  State: "exited"
-                  Status: "Exited (0) 56 minutes ago"
-                  HostConfig:
-                    NetworkMode: "default"
-                  NetworkSettings:
-                    Networks:
-                      bridge:
-                        IPAMConfig: null
-                        Links: null
-                        Aliases: null
-                        NetworkID: "d687bc59335f0e5c9ee8193e5612e8aee000c8c62ea170cfb99c098f95899d92"
-                        EndpointID: "8ed5115aeaad9abb174f68dcf135b49f11daf597678315231a32ca28441dec6a"
-                        Gateway: "172.18.0.1"
-                        IPAddress: "172.18.0.2"
-                        IPPrefixLen: 16
-                        IPv6Gateway: ""
-                        GlobalIPv6Address: ""
-                        GlobalIPv6PrefixLen: 0
-                        MacAddress: "02:42:ac:12:00:02"
-                  Mounts: []
-              Volumes:
-                -
-                  Name: "my-volume"
-                  Driver: "local"
-                  Mountpoint: "/var/lib/docker/volumes/my-volume/_data"
-                  Labels: null
-                  Scope: "local"
-                  Options: null
-                  UsageData:
-                    Size: 10920104
-                    RefCount: 2
-              BuildCache:
-                -
-                  ID: "hw53o5aio51xtltp5xjp8v7fx"
-                  Parents: []
-                  Type: "regular"
-                  Description: "pulled from docker.io/library/debian@sha256:234cb88d3020898631af0ccbbcca9a66ae7306ecd30c9720690858c1b007d2a0"
-                  InUse: false
-                  Shared: true
-                  Size: 0
-                  CreatedAt: "2021-06-28T13:31:01.474619385Z"
-                  LastUsedAt: "2021-07-07T22:02:32.738075951Z"
-                  UsageCount: 26
-                -
-                  ID: "ndlpt0hhvkqcdfkputsk4cq9c"
-                  Parents: ["ndlpt0hhvkqcdfkputsk4cq9c"]
-                  Type: "regular"
-                  Description: "mount / from exec /bin/sh -c echo 'Binary::apt::APT::Keep-Downloaded-Packages \"true\";' > /etc/apt/apt.conf.d/keep-cache"
-                  InUse: false
-                  Shared: true
-                  Size: 51
-                  CreatedAt: "2021-06-28T13:31:03.002625487Z"
-                  LastUsedAt: "2021-07-07T22:02:32.773909517Z"
-                  UsageCount: 26
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "type"
-          in: "query"
-          description: |
-            Object types, for which to compute and return data.
-          type: "array"
-          collectionFormat: multi
-          items:
-            type: "string"
-            enum: ["container", "image", "volume", "build-cache"]
-      tags: ["System"]
-  /images/{name}/get:
-    get:
-      summary: "Export an image"
-      description: |
-        Get a tarball containing all images and metadata for a repository.
-
-        If `name` is a specific name and tag (e.g. `ubuntu:latest`), then only that image (and its parents) are returned. If `name` is an image ID, similarly only that image (and its parents) are returned, but with the exclusion of the `repositories` file in the tarball, as there were no image names referenced.
-
-        ### Image tarball format
-
-        An image tarball contains one directory per image layer (named using its long ID), each containing these files:
-
-        - `VERSION`: currently `1.0` - the file format version
-        - `json`: detailed layer information, similar to `docker inspect layer_id`
-        - `layer.tar`: A tarfile containing the filesystem changes in this layer
-
-        The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories for storing attribute changes and deletions.
-
-        If the tarball defines a repository, the tarball should also include a `repositories` file at the root that contains a list of repository and tag names mapped to layer IDs.
-
-        ```json
-        {
-          "hello-world": {
-            "latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"
-          }
-        }
-        ```
-      operationId: "ImageGet"
-      produces:
-        - "application/x-tar"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "string"
-            format: "binary"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: "Image name or ID"
-          type: "string"
-          required: true
-      tags: ["Image"]
-  /images/get:
-    get:
-      summary: "Export several images"
-      description: |
-        Get a tarball containing all images and metadata for several image
-        repositories.
-
-        For each value of the `names` parameter: if it is a specific name and
-        tag (e.g. `ubuntu:latest`), then only that image (and its parents) are
-        returned; if it is an image ID, similarly only that image (and its parents)
-        are returned and there would be no names referenced in the 'repositories'
-        file for this image ID.
-
-        For details on the format, see the [export image endpoint](#operation/ImageGet).
-      operationId: "ImageGetAll"
-      produces:
-        - "application/x-tar"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "string"
-            format: "binary"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "names"
-          in: "query"
-          description: "Image names to filter by"
-          type: "array"
-          items:
-            type: "string"
-      tags: ["Image"]
-  /images/load:
-    post:
-      summary: "Import images"
-      description: |
-        Load a set of images and tags into a repository.
-
-        For details on the format, see the [export image endpoint](#operation/ImageGet).
-      operationId: "ImageLoad"
-      consumes:
-        - "application/x-tar"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "no error"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "imagesTarball"
-          in: "body"
-          description: "Tar archive containing images"
-          schema:
-            type: "string"
-            format: "binary"
-        - name: "quiet"
-          in: "query"
-          description: "Suppress progress details during load."
-          type: "boolean"
-          default: false
-      tags: ["Image"]
-  /containers/{id}/exec:
-    post:
-      summary: "Create an exec instance"
-      description: "Run a command inside a running container."
-      operationId: "ContainerExec"
-      consumes:
-        - "application/json"
-      produces:
-        - "application/json"
-      responses:
-        201:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/IdResponse"
-        404:
-          description: "no such container"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such container: c2ada9df5af8"
-        409:
-          description: "container is paused"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "execConfig"
-          in: "body"
-          description: "Exec configuration"
-          schema:
-            type: "object"
-            title: "ExecConfig"
-            properties:
-              AttachStdin:
-                type: "boolean"
-                description: "Attach to `stdin` of the exec command."
-              AttachStdout:
-                type: "boolean"
-                description: "Attach to `stdout` of the exec command."
-              AttachStderr:
-                type: "boolean"
-                description: "Attach to `stderr` of the exec command."
-              ConsoleSize:
-                type: "array"
-                description: "Initial console size, as an `[height, width]` array."
-                x-nullable: true
-                minItems: 2
-                maxItems: 2
-                items:
-                  type: "integer"
-                  minimum: 0
-              DetachKeys:
-                type: "string"
-                description: |
-                  Override the key sequence for detaching a container. Format is
-                  a single character `[a-Z]` or `ctrl-<value>` where `<value>`
-                  is one of: `a-z`, `@`, `^`, `[`, `,` or `_`.
-              Tty:
-                type: "boolean"
-                description: "Allocate a pseudo-TTY."
-              Env:
-                description: |
-                  A list of environment variables in the form `["VAR=value", ...]`.
-                type: "array"
-                items:
-                  type: "string"
-              Cmd:
-                type: "array"
-                description: "Command to run, as a string or array of strings."
-                items:
-                  type: "string"
-              Privileged:
-                type: "boolean"
-                description: "Runs the exec process with extended privileges."
-                default: false
-              User:
-                type: "string"
-                description: |
-                  The user, and optionally, group to run the exec process inside
-                  the container. Format is one of: `user`, `user:group`, `uid`,
-                  or `uid:gid`.
-              WorkingDir:
-                type: "string"
-                description: |
-                  The working directory for the exec process inside the container.
-            example:
-              AttachStdin: false
-              AttachStdout: true
-              AttachStderr: true
-              DetachKeys: "ctrl-p,ctrl-q"
-              Tty: false
-              Cmd:
-                - "date"
-              Env:
-                - "FOO=bar"
-                - "BAZ=quux"
-          required: true
-        - name: "id"
-          in: "path"
-          description: "ID or name of container"
-          type: "string"
-          required: true
-      tags: ["Exec"]
-  /exec/{id}/start:
-    post:
-      summary: "Start an exec instance"
-      description: |
-        Starts a previously set up exec instance. If detach is true, this endpoint
-        returns immediately after starting the command. Otherwise, it sets up an
-        interactive session with the command.
-      operationId: "ExecStart"
-      consumes:
-        - "application/json"
-      produces:
-        - "application/vnd.docker.raw-stream"
-        - "application/vnd.docker.multiplexed-stream"
-      responses:
-        200:
-          description: "No error"
-        404:
-          description: "No such exec instance"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        409:
-          description: "Container is stopped or paused"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "execStartConfig"
-          in: "body"
-          schema:
-            type: "object"
-            title: "ExecStartConfig"
-            properties:
-              Detach:
-                type: "boolean"
-                description: "Detach from the command."
-              Tty:
-                type: "boolean"
-                description: "Allocate a pseudo-TTY."
-              ConsoleSize:
-                type: "array"
-                description: "Initial console size, as an `[height, width]` array."
-                x-nullable: true
-                minItems: 2
-                maxItems: 2
-                items:
-                  type: "integer"
-                  minimum: 0
-            example:
-              Detach: false
-              Tty: true
-              ConsoleSize: [80, 64]
-        - name: "id"
-          in: "path"
-          description: "Exec instance ID"
-          required: true
-          type: "string"
-      tags: ["Exec"]
-  /exec/{id}/resize:
-    post:
-      summary: "Resize an exec instance"
-      description: |
-        Resize the TTY session used by an exec instance. This endpoint only works
-        if `tty` was specified as part of creating and starting the exec instance.
-      operationId: "ExecResize"
-      responses:
-        200:
-          description: "No error"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "No such exec instance"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "Exec instance ID"
-          required: true
-          type: "string"
-        - name: "h"
-          in: "query"
-          required: true
-          description: "Height of the TTY session in characters"
-          type: "integer"
-        - name: "w"
-          in: "query"
-          required: true
-          description: "Width of the TTY session in characters"
-          type: "integer"
-      tags: ["Exec"]
-  /exec/{id}/json:
-    get:
-      summary: "Inspect an exec instance"
-      description: "Return low-level information about an exec instance."
-      operationId: "ExecInspect"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "No error"
-          schema:
-            type: "object"
-            title: "ExecInspectResponse"
-            properties:
-              CanRemove:
-                type: "boolean"
-              DetachKeys:
-                type: "string"
-              ID:
-                type: "string"
-              Running:
-                type: "boolean"
-              ExitCode:
-                type: "integer"
-              ProcessConfig:
-                $ref: "#/definitions/ProcessConfig"
-              OpenStdin:
-                type: "boolean"
-              OpenStderr:
-                type: "boolean"
-              OpenStdout:
-                type: "boolean"
-              ContainerID:
-                type: "string"
-              Pid:
-                type: "integer"
-                description: "The system process ID for the exec process."
-          examples:
-            application/json:
-              CanRemove: false
-              ContainerID: "b53ee82b53a40c7dca428523e34f741f3abc51d9f297a14ff874bf761b995126"
-              DetachKeys: ""
-              ExitCode: 2
-              ID: "f33bbfb39f5b142420f4759b2348913bd4a8d1a6d7fd56499cb41a1bb91d7b3b"
-              OpenStderr: true
-              OpenStdin: true
-              OpenStdout: true
-              ProcessConfig:
-                arguments:
-                  - "-c"
-                  - "exit 2"
-                entrypoint: "sh"
-                privileged: false
-                tty: true
-                user: "1000"
-              Running: false
-              Pid: 42000
-        404:
-          description: "No such exec instance"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "Exec instance ID"
-          required: true
-          type: "string"
-      tags: ["Exec"]
-
-  /volumes:
-    get:
-      summary: "List volumes"
-      operationId: "VolumeList"
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "Summary volume data that matches the query"
-          schema:
-            $ref: "#/definitions/VolumeListResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "filters"
-          in: "query"
-          description: |
-            JSON encoded value of the filters (a `map[string][]string`) to
-            process on the volumes list. Available filters:
-
-            - `dangling=<boolean>` When set to `true` (or `1`), returns all
-               volumes that are not in use by a container. When set to `false`
-               (or `0`), only volumes that are in use by one or more
-               containers are returned.
-            - `driver=<volume-driver-name>` Matches volumes based on their driver.
-            - `label=<key>` or `label=<key>:<value>` Matches volumes based on
-               the presence of a `label` alone or a `label` and a value.
-            - `name=<volume-name>` Matches all or part of a volume name.
-          type: "string"
-          format: "json"
-      tags: ["Volume"]
-
-  /volumes/create:
-    post:
-      summary: "Create a volume"
-      operationId: "VolumeCreate"
-      consumes: ["application/json"]
-      produces: ["application/json"]
-      responses:
-        201:
-          description: "The volume was created successfully"
-          schema:
-            $ref: "#/definitions/Volume"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "volumeConfig"
-          in: "body"
-          required: true
-          description: "Volume configuration"
-          schema:
-            $ref: "#/definitions/VolumeCreateOptions"
-      tags: ["Volume"]
-
-  /volumes/{name}:
-    get:
-      summary: "Inspect a volume"
-      operationId: "VolumeInspect"
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "No error"
-          schema:
-            $ref: "#/definitions/Volume"
-        404:
-          description: "No such volume"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          required: true
-          description: "Volume name or ID"
-          type: "string"
-      tags: ["Volume"]
-
-    put:
-      summary: |
-        "Update a volume. Valid only for Swarm cluster volumes"
-      operationId: "VolumeUpdate"
-      consumes: ["application/json"]
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "no error"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "no such volume"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: "The name or ID of the volume"
-          type: "string"
-          required: true
-        - name: "body"
-          in: "body"
-          schema:
-            # though the schema for is an object that contains only a
-            # ClusterVolumeSpec, wrapping the ClusterVolumeSpec in this object
-            # means that if, later on, we support things like changing the
-            # labels, we can do so without duplicating that information to the
-            # ClusterVolumeSpec.
-            type: "object"
-            description: "Volume configuration"
-            properties:
-              Spec:
-                $ref: "#/definitions/ClusterVolumeSpec"
-          description: |
-            The spec of the volume to update. Currently, only Availability may
-            change. All other fields must remain unchanged.
-        - name: "version"
-          in: "query"
-          description: |
-            The version number of the volume being updated. This is required to
-            avoid conflicting writes. Found in the volume's `ClusterVolume`
-            field.
-          type: "integer"
-          format: "int64"
-          required: true
-      tags: ["Volume"]
-
-    delete:
-      summary: "Remove a volume"
-      description: "Instruct the driver to remove the volume."
-      operationId: "VolumeDelete"
-      responses:
-        204:
-          description: "The volume was removed"
-        404:
-          description: "No such volume or volume driver"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        409:
-          description: "Volume is in use and cannot be removed"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          required: true
-          description: "Volume name or ID"
-          type: "string"
-        - name: "force"
-          in: "query"
-          description: "Force the removal of the volume"
-          type: "boolean"
-          default: false
-      tags: ["Volume"]
-
-  /volumes/prune:
-    post:
-      summary: "Delete unused volumes"
-      produces:
-        - "application/json"
-      operationId: "VolumePrune"
-      parameters:
-        - name: "filters"
-          in: "query"
-          description: |
-            Filters to process on the prune list, encoded as JSON (a `map[string][]string`).
-
-            Available filters:
-            - `label` (`label=<key>`, `label=<key>=<value>`, `label!=<key>`, or `label!=<key>=<value>`) Prune volumes with (or without, in case `label!=...` is used) the specified labels.
-            - `all` (`all=true`) - Consider all (local) volumes for pruning and not just anonymous volumes.
-          type: "string"
-      responses:
-        200:
-          description: "No error"
-          schema:
-            type: "object"
-            title: "VolumePruneResponse"
-            properties:
-              VolumesDeleted:
-                description: "Volumes that were deleted"
-                type: "array"
-                items:
-                  type: "string"
-              SpaceReclaimed:
-                description: "Disk space reclaimed in bytes"
-                type: "integer"
-                format: "int64"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Volume"]
-  /networks:
-    get:
-      summary: "List networks"
-      description: |
-        Returns a list of networks. For details on the format, see the
-        [network inspect endpoint](#operation/NetworkInspect).
-
-        Note that it uses a different, smaller representation of a network than
-        inspecting a single network. For example, the list of containers attached
-        to the network is not propagated in API versions 1.28 and up.
-      operationId: "NetworkList"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "No error"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/Network"
-          examples:
-            application/json:
-              - Name: "bridge"
-                Id: "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566"
-                Created: "2016-10-19T06:21:00.416543526Z"
-                Scope: "local"
-                Driver: "bridge"
-                EnableIPv6: false
-                Internal: false
-                Attachable: false
-                Ingress: false
-                IPAM:
-                  Driver: "default"
-                  Config:
-                    -
-                      Subnet: "172.17.0.0/16"
-                Options:
-                  com.docker.network.bridge.default_bridge: "true"
-                  com.docker.network.bridge.enable_icc: "true"
-                  com.docker.network.bridge.enable_ip_masquerade: "true"
-                  com.docker.network.bridge.host_binding_ipv4: "0.0.0.0"
-                  com.docker.network.bridge.name: "docker0"
-                  com.docker.network.driver.mtu: "1500"
-              - Name: "none"
-                Id: "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794"
-                Created: "0001-01-01T00:00:00Z"
-                Scope: "local"
-                Driver: "null"
-                EnableIPv6: false
-                Internal: false
-                Attachable: false
-                Ingress: false
-                IPAM:
-                  Driver: "default"
-                  Config: []
-                Containers: {}
-                Options: {}
-              - Name: "host"
-                Id: "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e"
-                Created: "0001-01-01T00:00:00Z"
-                Scope: "local"
-                Driver: "host"
-                EnableIPv6: false
-                Internal: false
-                Attachable: false
-                Ingress: false
-                IPAM:
-                  Driver: "default"
-                  Config: []
-                Containers: {}
-                Options: {}
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "filters"
-          in: "query"
-          description: |
-            JSON encoded value of the filters (a `map[string][]string`) to process
-            on the networks list.
-
-            Available filters:
-
-            - `dangling=<boolean>` When set to `true` (or `1`), returns all
-               networks that are not in use by a container. When set to `false`
-               (or `0`), only networks that are in use by one or more
-               containers are returned.
-            - `driver=<driver-name>` Matches a network's driver.
-            - `id=<network-id>` Matches all or part of a network ID.
-            - `label=<key>` or `label=<key>=<value>` of a network label.
-            - `name=<network-name>` Matches all or part of a network name.
-            - `scope=["swarm"|"global"|"local"]` Filters networks by scope (`swarm`, `global`, or `local`).
-            - `type=["custom"|"builtin"]` Filters networks by type. The `custom` keyword returns all user-defined networks.
-          type: "string"
-      tags: ["Network"]
-
-  /networks/{id}:
-    get:
-      summary: "Inspect a network"
-      operationId: "NetworkInspect"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "No error"
-          schema:
-            $ref: "#/definitions/Network"
-        404:
-          description: "Network not found"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "Network ID or name"
-          required: true
-          type: "string"
-        - name: "verbose"
-          in: "query"
-          description: "Detailed inspect output for troubleshooting"
-          type: "boolean"
-          default: false
-        - name: "scope"
-          in: "query"
-          description: "Filter the network by scope (swarm, global, or local)"
-          type: "string"
-      tags: ["Network"]
-
-    delete:
-      summary: "Remove a network"
-      operationId: "NetworkDelete"
-      responses:
-        204:
-          description: "No error"
-        403:
-          description: "operation not supported for pre-defined networks"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "no such network"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "Network ID or name"
-          required: true
-          type: "string"
-      tags: ["Network"]
-
-  /networks/create:
-    post:
-      summary: "Create a network"
-      operationId: "NetworkCreate"
-      consumes:
-        - "application/json"
-      produces:
-        - "application/json"
-      responses:
-        201:
-          description: "Network created successfully"
-          schema:
-            $ref: "#/definitions/NetworkCreateResponse"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        403:
-          description: |
-            Forbidden operation. This happens when trying to create a network named after a pre-defined network,
-            or when trying to create an overlay network on a daemon which is not part of a Swarm cluster.
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "plugin not found"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "networkConfig"
-          in: "body"
-          description: "Network configuration"
-          required: true
-          schema:
-            type: "object"
-            title: "NetworkCreateRequest"
-            required: ["Name"]
-            properties:
-              Name:
-                description: "The network's name."
-                type: "string"
-                example: "my_network"
-              Driver:
-                description: "Name of the network driver plugin to use."
-                type: "string"
-                default: "bridge"
-                example: "bridge"
-              Scope:
-                description: |
-                  The level at which the network exists (e.g. `swarm` for cluster-wide
-                  or `local` for machine level).
-                type: "string"
-              Internal:
-                description: "Restrict external access to the network."
-                type: "boolean"
-              Attachable:
-                description: |
-                  Globally scoped network is manually attachable by regular
-                  containers from workers in swarm mode.
-                type: "boolean"
-                example: true
-              Ingress:
-                description: |
-                  Ingress network is the network which provides the routing-mesh
-                  in swarm mode.
-                type: "boolean"
-                example: false
-              ConfigOnly:
-                description: |
-                  Creates a config-only network. Config-only networks are placeholder
-                  networks for network configurations to be used by other networks.
-                  Config-only networks cannot be used directly to run containers
-                  or services.
-                type: "boolean"
-                default: false
-                example: false
-              ConfigFrom:
-                description: |
-                  Specifies the source which will provide the configuration for
-                  this network. The specified network must be an existing
-                  config-only network; see ConfigOnly.
-                $ref: "#/definitions/ConfigReference"
-              IPAM:
-                description: "Optional custom IP scheme for the network."
-                $ref: "#/definitions/IPAM"
-              EnableIPv6:
-                description: "Enable IPv6 on the network."
-                type: "boolean"
-                example: true
-              Options:
-                description: "Network specific options to be used by the drivers."
-                type: "object"
-                additionalProperties:
-                  type: "string"
-                example:
-                  com.docker.network.bridge.default_bridge: "true"
-                  com.docker.network.bridge.enable_icc: "true"
-                  com.docker.network.bridge.enable_ip_masquerade: "true"
-                  com.docker.network.bridge.host_binding_ipv4: "0.0.0.0"
-                  com.docker.network.bridge.name: "docker0"
-                  com.docker.network.driver.mtu: "1500"
-              Labels:
-                description: "User-defined key/value metadata."
-                type: "object"
-                additionalProperties:
-                  type: "string"
-                example:
-                  com.example.some-label: "some-value"
-                  com.example.some-other-label: "some-other-value"
-      tags: ["Network"]
-
-  /networks/{id}/connect:
-    post:
-      summary: "Connect a container to a network"
-      description: "The network must be either a local-scoped network or a swarm-scoped network with the `attachable` option set. A network cannot be re-attached to a running container"
-      operationId: "NetworkConnect"
-      consumes:
-        - "application/json"
-      responses:
-        200:
-          description: "No error"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        403:
-          description: "Operation forbidden"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "Network or container not found"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "Network ID or name"
-          required: true
-          type: "string"
-        - name: "container"
-          in: "body"
-          required: true
-          schema:
-            type: "object"
-            title: "NetworkConnectRequest"
-            properties:
-              Container:
-                type: "string"
-                description: "The ID or name of the container to connect to the network."
-              EndpointConfig:
-                $ref: "#/definitions/EndpointSettings"
-            example:
-              Container: "3613f73ba0e4"
-              EndpointConfig:
-                IPAMConfig:
-                  IPv4Address: "172.24.56.89"
-                  IPv6Address: "2001:db8::5689"
-                MacAddress: "02:42:ac:12:05:02"
-      tags: ["Network"]
-
-  /networks/{id}/disconnect:
-    post:
-      summary: "Disconnect a container from a network"
-      operationId: "NetworkDisconnect"
-      consumes:
-        - "application/json"
-      responses:
-        200:
-          description: "No error"
-        403:
-          description: "Operation not supported for swarm scoped networks"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "Network or container not found"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "Network ID or name"
-          required: true
-          type: "string"
-        - name: "container"
-          in: "body"
-          required: true
-          schema:
-            type: "object"
-            title: "NetworkDisconnectRequest"
-            properties:
-              Container:
-                type: "string"
-                description: |
-                  The ID or name of the container to disconnect from the network.
-              Force:
-                type: "boolean"
-                description: |
-                  Force the container to disconnect from the network.
-      tags: ["Network"]
-  /networks/prune:
-    post:
-      summary: "Delete unused networks"
-      produces:
-        - "application/json"
-      operationId: "NetworkPrune"
-      parameters:
-        - name: "filters"
-          in: "query"
-          description: |
-            Filters to process on the prune list, encoded as JSON (a `map[string][]string`).
-
-            Available filters:
-            - `until=<timestamp>` Prune networks created before this timestamp. The `<timestamp>` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time.
-            - `label` (`label=<key>`, `label=<key>=<value>`, `label!=<key>`, or `label!=<key>=<value>`) Prune networks with (or without, in case `label!=...` is used) the specified labels.
-          type: "string"
-      responses:
-        200:
-          description: "No error"
-          schema:
-            type: "object"
-            title: "NetworkPruneResponse"
-            properties:
-              NetworksDeleted:
-                description: "Networks that were deleted"
-                type: "array"
-                items:
-                  type: "string"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Network"]
-  /plugins:
-    get:
-      summary: "List plugins"
-      operationId: "PluginList"
-      description: "Returns information about installed plugins."
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "No error"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/Plugin"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "filters"
-          in: "query"
-          type: "string"
-          description: |
-            A JSON encoded value of the filters (a `map[string][]string`) to
-            process on the plugin list.
-
-            Available filters:
-
-            - `capability=<capability name>`
-            - `enable=<true>|<false>`
-      tags: ["Plugin"]
-
-  /plugins/privileges:
-    get:
-      summary: "Get plugin privileges"
-      operationId: "GetPluginPrivileges"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/PluginPrivilege"
-            example:
-              - Name: "network"
-                Description: ""
-                Value:
-                  - "host"
-              - Name: "mount"
-                Description: ""
-                Value:
-                  - "/data"
-              - Name: "device"
-                Description: ""
-                Value:
-                  - "/dev/cpu_dma_latency"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "remote"
-          in: "query"
-          description: |
-            The name of the plugin. The `:latest` tag is optional, and is the
-            default if omitted.
-          required: true
-          type: "string"
-      tags:
-        - "Plugin"
-
-  /plugins/pull:
-    post:
-      summary: "Install a plugin"
-      operationId: "PluginPull"
-      description: |
-        Pulls and installs a plugin. After the plugin is installed, it can be
-        enabled using the [`POST /plugins/{name}/enable` endpoint](#operation/PostPluginsEnable).
-      produces:
-        - "application/json"
-      responses:
-        204:
-          description: "no error"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "remote"
-          in: "query"
-          description: |
-            Remote reference for plugin to install.
-
-            The `:latest` tag is optional, and is used as the default if omitted.
-          required: true
-          type: "string"
-        - name: "name"
-          in: "query"
-          description: |
-            Local name for the pulled plugin.
-
-            The `:latest` tag is optional, and is used as the default if omitted.
-          required: false
-          type: "string"
-        - name: "X-Registry-Auth"
-          in: "header"
-          description: |
-            A base64url-encoded auth configuration to use when pulling a plugin
-            from a registry.
-
-            Refer to the [authentication section](#section/Authentication) for
-            details.
-          type: "string"
-        - name: "body"
-          in: "body"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/PluginPrivilege"
-            example:
-              - Name: "network"
-                Description: ""
-                Value:
-                  - "host"
-              - Name: "mount"
-                Description: ""
-                Value:
-                  - "/data"
-              - Name: "device"
-                Description: ""
-                Value:
-                  - "/dev/cpu_dma_latency"
-      tags: ["Plugin"]
-  /plugins/{name}/json:
-    get:
-      summary: "Inspect a plugin"
-      operationId: "PluginInspect"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/Plugin"
-        404:
-          description: "plugin is not installed"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: |
-            The name of the plugin. The `:latest` tag is optional, and is the
-            default if omitted.
-          required: true
-          type: "string"
-      tags: ["Plugin"]
-  /plugins/{name}:
-    delete:
-      summary: "Remove a plugin"
-      operationId: "PluginDelete"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/Plugin"
-        404:
-          description: "plugin is not installed"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: |
-            The name of the plugin. The `:latest` tag is optional, and is the
-            default if omitted.
-          required: true
-          type: "string"
-        - name: "force"
-          in: "query"
-          description: |
-            Disable the plugin before removing. This may result in issues if the
-            plugin is in use by a container.
-          type: "boolean"
-          default: false
-      tags: ["Plugin"]
-  /plugins/{name}/enable:
-    post:
-      summary: "Enable a plugin"
-      operationId: "PluginEnable"
-      responses:
-        200:
-          description: "no error"
-        404:
-          description: "plugin is not installed"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: |
-            The name of the plugin. The `:latest` tag is optional, and is the
-            default if omitted.
-          required: true
-          type: "string"
-        - name: "timeout"
-          in: "query"
-          description: "Set the HTTP client timeout (in seconds)"
-          type: "integer"
-          default: 0
-      tags: ["Plugin"]
-  /plugins/{name}/disable:
-    post:
-      summary: "Disable a plugin"
-      operationId: "PluginDisable"
-      responses:
-        200:
-          description: "no error"
-        404:
-          description: "plugin is not installed"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: |
-            The name of the plugin. The `:latest` tag is optional, and is the
-            default if omitted.
-          required: true
-          type: "string"
-        - name: "force"
-          in: "query"
-          description: |
-            Force disable a plugin even if still in use.
-          required: false
-          type: "boolean"
-      tags: ["Plugin"]
-  /plugins/{name}/upgrade:
-    post:
-      summary: "Upgrade a plugin"
-      operationId: "PluginUpgrade"
-      responses:
-        204:
-          description: "no error"
-        404:
-          description: "plugin not installed"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: |
-            The name of the plugin. The `:latest` tag is optional, and is the
-            default if omitted.
-          required: true
-          type: "string"
-        - name: "remote"
-          in: "query"
-          description: |
-            Remote reference to upgrade to.
-
-            The `:latest` tag is optional, and is used as the default if omitted.
-          required: true
-          type: "string"
-        - name: "X-Registry-Auth"
-          in: "header"
-          description: |
-            A base64url-encoded auth configuration to use when pulling a plugin
-            from a registry.
-
-            Refer to the [authentication section](#section/Authentication) for
-            details.
-          type: "string"
-        - name: "body"
-          in: "body"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/PluginPrivilege"
-            example:
-              - Name: "network"
-                Description: ""
-                Value:
-                  - "host"
-              - Name: "mount"
-                Description: ""
-                Value:
-                  - "/data"
-              - Name: "device"
-                Description: ""
-                Value:
-                  - "/dev/cpu_dma_latency"
-      tags: ["Plugin"]
-  /plugins/create:
-    post:
-      summary: "Create a plugin"
-      operationId: "PluginCreate"
-      consumes:
-        - "application/x-tar"
-      responses:
-        204:
-          description: "no error"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "query"
-          description: |
-            The name of the plugin. The `:latest` tag is optional, and is the
-            default if omitted.
-          required: true
-          type: "string"
-        - name: "tarContext"
-          in: "body"
-          description: "Path to tar containing plugin rootfs and manifest"
-          schema:
-            type: "string"
-            format: "binary"
-      tags: ["Plugin"]
-  /plugins/{name}/push:
-    post:
-      summary: "Push a plugin"
-      operationId: "PluginPush"
-      description: |
-        Push a plugin to the registry.
-      parameters:
-        - name: "name"
-          in: "path"
-          description: |
-            The name of the plugin. The `:latest` tag is optional, and is the
-            default if omitted.
-          required: true
-          type: "string"
-      responses:
-        200:
-          description: "no error"
-        404:
-          description: "plugin not installed"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Plugin"]
-  /plugins/{name}/set:
-    post:
-      summary: "Configure a plugin"
-      operationId: "PluginSet"
-      consumes:
-        - "application/json"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: |
-            The name of the plugin. The `:latest` tag is optional, and is the
-            default if omitted.
-          required: true
-          type: "string"
-        - name: "body"
-          in: "body"
-          schema:
-            type: "array"
-            items:
-              type: "string"
-            example: ["DEBUG=1"]
-      responses:
-        204:
-          description: "No error"
-        404:
-          description: "Plugin not installed"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Plugin"]
-  /nodes:
-    get:
-      summary: "List nodes"
-      operationId: "NodeList"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/Node"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "filters"
-          in: "query"
-          description: |
-            Filters to process on the nodes list, encoded as JSON (a `map[string][]string`).
-
-            Available filters:
-            - `id=<node id>`
-            - `label=<engine label>`
-            - `membership=`(`accepted`|`pending`)`
-            - `name=<node name>`
-            - `node.label=<node label>`
-            - `role=`(`manager`|`worker`)`
-          type: "string"
-      tags: ["Node"]
-  /nodes/{id}:
-    get:
-      summary: "Inspect a node"
-      operationId: "NodeInspect"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/Node"
-        404:
-          description: "no such node"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "The ID or name of the node"
-          type: "string"
-          required: true
-      tags: ["Node"]
-    delete:
-      summary: "Delete a node"
-      operationId: "NodeDelete"
-      responses:
-        200:
-          description: "no error"
-        404:
-          description: "no such node"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "The ID or name of the node"
-          type: "string"
-          required: true
-        - name: "force"
-          in: "query"
-          description: "Force remove a node from the swarm"
-          default: false
-          type: "boolean"
-      tags: ["Node"]
-  /nodes/{id}/update:
-    post:
-      summary: "Update a node"
-      operationId: "NodeUpdate"
-      responses:
-        200:
-          description: "no error"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "no such node"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "The ID of the node"
-          type: "string"
-          required: true
-        - name: "body"
-          in: "body"
-          schema:
-            $ref: "#/definitions/NodeSpec"
-        - name: "version"
-          in: "query"
-          description: |
-            The version number of the node object being updated. This is required
-            to avoid conflicting writes.
-          type: "integer"
-          format: "int64"
-          required: true
-      tags: ["Node"]
-  /swarm:
-    get:
-      summary: "Inspect swarm"
-      operationId: "SwarmInspect"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/Swarm"
-        404:
-          description: "no such swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Swarm"]
-  /swarm/init:
-    post:
-      summary: "Initialize a new swarm"
-      operationId: "SwarmInit"
-      produces:
-        - "application/json"
-        - "text/plain"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            description: "The node ID"
-            type: "string"
-            example: "7v2t30z9blmxuhnyo6s4cpenp"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is already part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "body"
-          in: "body"
-          required: true
-          schema:
-            type: "object"
-            title: "SwarmInitRequest"
-            properties:
-              ListenAddr:
-                description: |
-                  Listen address used for inter-manager communication, as well
-                  as determining the networking interface used for the VXLAN
-                  Tunnel Endpoint (VTEP). This can either be an address/port
-                  combination in the form `192.168.1.1:4567`, or an interface
-                  followed by a port number, like `eth0:4567`. If the port number
-                  is omitted, the default swarm listening port is used.
-                type: "string"
-              AdvertiseAddr:
-                description: |
-                  Externally reachable address advertised to other nodes. This
-                  can either be an address/port combination in the form
-                  `192.168.1.1:4567`, or an interface followed by a port number,
-                  like `eth0:4567`. If the port number is omitted, the port
-                  number from the listen address is used. If `AdvertiseAddr` is
-                  not specified, it will be automatically detected when possible.
-                type: "string"
-              DataPathAddr:
-                description: |
-                  Address or interface to use for data path traffic (format:
-                  `<ip|interface>`), for example,  `192.168.1.1`, or an interface,
-                  like `eth0`. If `DataPathAddr` is unspecified, the same address
-                  as `AdvertiseAddr` is used.
-
-                  The `DataPathAddr` specifies the address that global scope
-                  network drivers will publish towards other  nodes in order to
-                  reach the containers running on this node. Using this parameter
-                  it is possible to separate the container data traffic from the
-                  management traffic of the cluster.
-                type: "string"
-              DataPathPort:
-                description: |
-                  DataPathPort specifies the data path port number for data traffic.
-                  Acceptable port range is 1024 to 49151.
-                  if no port is set or is set to 0, default port 4789 will be used.
-                type: "integer"
-                format: "uint32"
-              DefaultAddrPool:
-                description: |
-                  Default Address Pool specifies default subnet pools for global
-                  scope networks.
-                type: "array"
-                items:
-                  type: "string"
-                  example: ["10.10.0.0/16", "20.20.0.0/16"]
-              ForceNewCluster:
-                description: "Force creation of a new swarm."
-                type: "boolean"
-              SubnetSize:
-                description: |
-                  SubnetSize specifies the subnet size of the networks created
-                  from the default subnet pool.
-                type: "integer"
-                format: "uint32"
-              Spec:
-                $ref: "#/definitions/SwarmSpec"
-            example:
-              ListenAddr: "0.0.0.0:2377"
-              AdvertiseAddr: "192.168.1.1:2377"
-              DataPathPort: 4789
-              DefaultAddrPool: ["10.10.0.0/8", "20.20.0.0/8"]
-              SubnetSize: 24
-              ForceNewCluster: false
-              Spec:
-                Orchestration: {}
-                Raft: {}
-                Dispatcher: {}
-                CAConfig: {}
-                EncryptionConfig:
-                  AutoLockManagers: false
-      tags: ["Swarm"]
-  /swarm/join:
-    post:
-      summary: "Join an existing swarm"
-      operationId: "SwarmJoin"
-      responses:
-        200:
-          description: "no error"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is already part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "body"
-          in: "body"
-          required: true
-          schema:
-            type: "object"
-            title: "SwarmJoinRequest"
-            properties:
-              ListenAddr:
-                description: |
-                  Listen address used for inter-manager communication if the node
-                  gets promoted to manager, as well as determining the networking
-                  interface used for the VXLAN Tunnel Endpoint (VTEP).
-                type: "string"
-              AdvertiseAddr:
-                description: |
-                  Externally reachable address advertised to other nodes. This
-                  can either be an address/port combination in the form
-                  `192.168.1.1:4567`, or an interface followed by a port number,
-                  like `eth0:4567`. If the port number is omitted, the port
-                  number from the listen address is used. If `AdvertiseAddr` is
-                  not specified, it will be automatically detected when possible.
-                type: "string"
-              DataPathAddr:
-                description: |
-                  Address or interface to use for data path traffic (format:
-                  `<ip|interface>`), for example,  `192.168.1.1`, or an interface,
-                  like `eth0`. If `DataPathAddr` is unspecified, the same address
-                  as `AdvertiseAddr` is used.
-
-                  The `DataPathAddr` specifies the address that global scope
-                  network drivers will publish towards other nodes in order to
-                  reach the containers running on this node. Using this parameter
-                  it is possible to separate the container data traffic from the
-                  management traffic of the cluster.
-
-                type: "string"
-              RemoteAddrs:
-                description: |
-                  Addresses of manager nodes already participating in the swarm.
-                type: "array"
-                items:
-                  type: "string"
-              JoinToken:
-                description: "Secret token for joining this swarm."
-                type: "string"
-            example:
-              ListenAddr: "0.0.0.0:2377"
-              AdvertiseAddr: "192.168.1.1:2377"
-              DataPathAddr: "192.168.1.1"
-              RemoteAddrs:
-                - "node1:2377"
-              JoinToken: "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2"
-      tags: ["Swarm"]
-  /swarm/leave:
-    post:
-      summary: "Leave a swarm"
-      operationId: "SwarmLeave"
-      responses:
-        200:
-          description: "no error"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "force"
-          description: |
-            Force leave swarm, even if this is the last manager or that it will
-            break the cluster.
-          in: "query"
-          type: "boolean"
-          default: false
-      tags: ["Swarm"]
-  /swarm/update:
-    post:
-      summary: "Update a swarm"
-      operationId: "SwarmUpdate"
-      responses:
-        200:
-          description: "no error"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "body"
-          in: "body"
-          required: true
-          schema:
-            $ref: "#/definitions/SwarmSpec"
-        - name: "version"
-          in: "query"
-          description: |
-            The version number of the swarm object being updated. This is
-            required to avoid conflicting writes.
-          type: "integer"
-          format: "int64"
-          required: true
-        - name: "rotateWorkerToken"
-          in: "query"
-          description: "Rotate the worker join token."
-          type: "boolean"
-          default: false
-        - name: "rotateManagerToken"
-          in: "query"
-          description: "Rotate the manager join token."
-          type: "boolean"
-          default: false
-        - name: "rotateManagerUnlockKey"
-          in: "query"
-          description: "Rotate the manager unlock key."
-          type: "boolean"
-          default: false
-      tags: ["Swarm"]
-  /swarm/unlockkey:
-    get:
-      summary: "Get the unlock key"
-      operationId: "SwarmUnlockkey"
-      consumes:
-        - "application/json"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "object"
-            title: "UnlockKeyResponse"
-            properties:
-              UnlockKey:
-                description: "The swarm's unlock key."
-                type: "string"
-            example:
-              UnlockKey: "SWMKEY-1-7c37Cc8654o6p38HnroywCi19pllOnGtbdZEgtKxZu8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Swarm"]
-  /swarm/unlock:
-    post:
-      summary: "Unlock a locked manager"
-      operationId: "SwarmUnlock"
-      consumes:
-        - "application/json"
-      produces:
-        - "application/json"
-      parameters:
-        - name: "body"
-          in: "body"
-          required: true
-          schema:
-            type: "object"
-            title: "SwarmUnlockRequest"
-            properties:
-              UnlockKey:
-                description: "The swarm's unlock key."
-                type: "string"
-            example:
-              UnlockKey: "SWMKEY-1-7c37Cc8654o6p38HnroywCi19pllOnGtbdZEgtKxZu8"
-      responses:
-        200:
-          description: "no error"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Swarm"]
-  /services:
-    get:
-      summary: "List services"
-      operationId: "ServiceList"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/Service"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "filters"
-          in: "query"
-          type: "string"
-          description: |
-            A JSON encoded value of the filters (a `map[string][]string`) to
-            process on the services list.
-
-            Available filters:
-
-            - `id=<service id>`
-            - `label=<service label>`
-            - `mode=["replicated"|"global"]`
-            - `name=<service name>`
-        - name: "status"
-          in: "query"
-          type: "boolean"
-          description: |
-            Include service status, with count of running and desired tasks.
-      tags: ["Service"]
-  /services/create:
-    post:
-      summary: "Create a service"
-      operationId: "ServiceCreate"
-      consumes:
-        - "application/json"
-      produces:
-        - "application/json"
-      responses:
-        201:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/ServiceCreateResponse"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        403:
-          description: "network is not eligible for services"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        409:
-          description: "name conflicts with an existing service"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "body"
-          in: "body"
-          required: true
-          schema:
-            allOf:
-              - $ref: "#/definitions/ServiceSpec"
-              - type: "object"
-                example:
-                  Name: "web"
-                  TaskTemplate:
-                    ContainerSpec:
-                      Image: "nginx:alpine"
-                      Mounts:
-                        -
-                          ReadOnly: true
-                          Source: "web-data"
-                          Target: "/usr/share/nginx/html"
-                          Type: "volume"
-                          VolumeOptions:
-                            DriverConfig: {}
-                            Labels:
-                              com.example.something: "something-value"
-                      Hosts: ["10.10.10.10 host1", "ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 host2"]
-                      User: "33"
-                      DNSConfig:
-                        Nameservers: ["8.8.8.8"]
-                        Search: ["example.org"]
-                        Options: ["timeout:3"]
-                      Secrets:
-                        -
-                          File:
-                            Name: "www.example.org.key"
-                            UID: "33"
-                            GID: "33"
-                            Mode: 384
-                          SecretID: "fpjqlhnwb19zds35k8wn80lq9"
-                          SecretName: "example_org_domain_key"
-                      OomScoreAdj: 0
-                    LogDriver:
-                      Name: "json-file"
-                      Options:
-                        max-file: "3"
-                        max-size: "10M"
-                    Placement: {}
-                    Resources:
-                      Limits:
-                        MemoryBytes: 104857600
-                      Reservations: {}
-                    RestartPolicy:
-                      Condition: "on-failure"
-                      Delay: 10000000000
-                      MaxAttempts: 10
-                  Mode:
-                    Replicated:
-                      Replicas: 4
-                  UpdateConfig:
-                    Parallelism: 2
-                    Delay: 1000000000
-                    FailureAction: "pause"
-                    Monitor: 15000000000
-                    MaxFailureRatio: 0.15
-                  RollbackConfig:
-                    Parallelism: 1
-                    Delay: 1000000000
-                    FailureAction: "pause"
-                    Monitor: 15000000000
-                    MaxFailureRatio: 0.15
-                  EndpointSpec:
-                    Ports:
-                      -
-                        Protocol: "tcp"
-                        PublishedPort: 8080
-                        TargetPort: 80
-                  Labels:
-                    foo: "bar"
-        - name: "X-Registry-Auth"
-          in: "header"
-          description: |
-            A base64url-encoded auth configuration for pulling from private
-            registries.
-
-            Refer to the [authentication section](#section/Authentication) for
-            details.
-          type: "string"
-      tags: ["Service"]
-  /services/{id}:
-    get:
-      summary: "Inspect a service"
-      operationId: "ServiceInspect"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/Service"
-        404:
-          description: "no such service"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "ID or name of service."
-          required: true
-          type: "string"
-        - name: "insertDefaults"
-          in: "query"
-          description: "Fill empty fields with default values."
-          type: "boolean"
-          default: false
-      tags: ["Service"]
-    delete:
-      summary: "Delete a service"
-      operationId: "ServiceDelete"
-      responses:
-        200:
-          description: "no error"
-        404:
-          description: "no such service"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "ID or name of service."
-          required: true
-          type: "string"
-      tags: ["Service"]
-  /services/{id}/update:
-    post:
-      summary: "Update a service"
-      operationId: "ServiceUpdate"
-      consumes: ["application/json"]
-      produces: ["application/json"]
-      responses:
-        200:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/ServiceUpdateResponse"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "no such service"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "ID or name of service."
-          required: true
-          type: "string"
-        - name: "body"
-          in: "body"
-          required: true
-          schema:
-            allOf:
-              - $ref: "#/definitions/ServiceSpec"
-              - type: "object"
-                example:
-                  Name: "top"
-                  TaskTemplate:
-                    ContainerSpec:
-                      Image: "busybox"
-                      Args:
-                        - "top"
-                      OomScoreAdj: 0
-                    Resources:
-                      Limits: {}
-                      Reservations: {}
-                    RestartPolicy:
-                      Condition: "any"
-                      MaxAttempts: 0
-                    Placement: {}
-                    ForceUpdate: 0
-                  Mode:
-                    Replicated:
-                      Replicas: 1
-                  UpdateConfig:
-                    Parallelism: 2
-                    Delay: 1000000000
-                    FailureAction: "pause"
-                    Monitor: 15000000000
-                    MaxFailureRatio: 0.15
-                  RollbackConfig:
-                    Parallelism: 1
-                    Delay: 1000000000
-                    FailureAction: "pause"
-                    Monitor: 15000000000
-                    MaxFailureRatio: 0.15
-                  EndpointSpec:
-                    Mode: "vip"
-
-        - name: "version"
-          in: "query"
-          description: |
-            The version number of the service object being updated. This is
-            required to avoid conflicting writes.
-            This version number should be the value as currently set on the
-            service *before* the update. You can find the current version by
-            calling `GET /services/{id}`
-          required: true
-          type: "integer"
-        - name: "registryAuthFrom"
-          in: "query"
-          description: |
-            If the `X-Registry-Auth` header is not specified, this parameter
-            indicates where to find registry authorization credentials.
-          type: "string"
-          enum: ["spec", "previous-spec"]
-          default: "spec"
-        - name: "rollback"
-          in: "query"
-          description: |
-            Set to this parameter to `previous` to cause a server-side rollback
-            to the previous service spec. The supplied spec will be ignored in
-            this case.
-          type: "string"
-        - name: "X-Registry-Auth"
-          in: "header"
-          description: |
-            A base64url-encoded auth configuration for pulling from private
-            registries.
-
-            Refer to the [authentication section](#section/Authentication) for
-            details.
-          type: "string"
-
-      tags: ["Service"]
-  /services/{id}/logs:
-    get:
-      summary: "Get service logs"
-      description: |
-        Get `stdout` and `stderr` logs from a service. See also
-        [`/containers/{id}/logs`](#operation/ContainerLogs).
-
-        **Note**: This endpoint works only for services with the `local`,
-        `json-file` or `journald` logging drivers.
-      produces:
-        - "application/vnd.docker.raw-stream"
-        - "application/vnd.docker.multiplexed-stream"
-      operationId: "ServiceLogs"
-      responses:
-        200:
-          description: "logs returned as a stream in response body"
-          schema:
-            type: "string"
-            format: "binary"
-        404:
-          description: "no such service"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such service: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID or name of the service"
-          type: "string"
-        - name: "details"
-          in: "query"
-          description: "Show service context and extra details provided to logs."
-          type: "boolean"
-          default: false
-        - name: "follow"
-          in: "query"
-          description: "Keep connection after returning logs."
-          type: "boolean"
-          default: false
-        - name: "stdout"
-          in: "query"
-          description: "Return logs from `stdout`"
-          type: "boolean"
-          default: false
-        - name: "stderr"
-          in: "query"
-          description: "Return logs from `stderr`"
-          type: "boolean"
-          default: false
-        - name: "since"
-          in: "query"
-          description: "Only return logs since this time, as a UNIX timestamp"
-          type: "integer"
-          default: 0
-        - name: "timestamps"
-          in: "query"
-          description: "Add timestamps to every log line"
-          type: "boolean"
-          default: false
-        - name: "tail"
-          in: "query"
-          description: |
-            Only return this number of log lines from the end of the logs.
-            Specify as an integer or `all` to output all log lines.
-          type: "string"
-          default: "all"
-      tags: ["Service"]
-  /tasks:
-    get:
-      summary: "List tasks"
-      operationId: "TaskList"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/Task"
-            example:
-              - ID: "0kzzo1i0y4jz6027t0k7aezc7"
-                Version:
-                  Index: 71
-                CreatedAt: "2016-06-07T21:07:31.171892745Z"
-                UpdatedAt: "2016-06-07T21:07:31.376370513Z"
-                Spec:
-                  ContainerSpec:
-                    Image: "redis"
-                  Resources:
-                    Limits: {}
-                    Reservations: {}
-                  RestartPolicy:
-                    Condition: "any"
-                    MaxAttempts: 0
-                  Placement: {}
-                ServiceID: "9mnpnzenvg8p8tdbtq4wvbkcz"
-                Slot: 1
-                NodeID: "60gvrl6tm78dmak4yl7srz94v"
-                Status:
-                  Timestamp: "2016-06-07T21:07:31.290032978Z"
-                  State: "running"
-                  Message: "started"
-                  ContainerStatus:
-                    ContainerID: "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035"
-                    PID: 677
-                DesiredState: "running"
-                NetworksAttachments:
-                  - Network:
-                      ID: "4qvuz4ko70xaltuqbt8956gd1"
-                      Version:
-                        Index: 18
-                      CreatedAt: "2016-06-07T20:31:11.912919752Z"
-                      UpdatedAt: "2016-06-07T21:07:29.955277358Z"
-                      Spec:
-                        Name: "ingress"
-                        Labels:
-                          com.docker.swarm.internal: "true"
-                        DriverConfiguration: {}
-                        IPAMOptions:
-                          Driver: {}
-                          Configs:
-                            - Subnet: "10.255.0.0/16"
-                              Gateway: "10.255.0.1"
-                      DriverState:
-                        Name: "overlay"
-                        Options:
-                          com.docker.network.driver.overlay.vxlanid_list: "256"
-                      IPAMOptions:
-                        Driver:
-                          Name: "default"
-                        Configs:
-                          - Subnet: "10.255.0.0/16"
-                            Gateway: "10.255.0.1"
-                    Addresses:
-                      - "10.255.0.10/16"
-              - ID: "1yljwbmlr8er2waf8orvqpwms"
-                Version:
-                  Index: 30
-                CreatedAt: "2016-06-07T21:07:30.019104782Z"
-                UpdatedAt: "2016-06-07T21:07:30.231958098Z"
-                Name: "hopeful_cori"
-                Spec:
-                  ContainerSpec:
-                    Image: "redis"
-                  Resources:
-                    Limits: {}
-                    Reservations: {}
-                  RestartPolicy:
-                    Condition: "any"
-                    MaxAttempts: 0
-                  Placement: {}
-                ServiceID: "9mnpnzenvg8p8tdbtq4wvbkcz"
-                Slot: 1
-                NodeID: "60gvrl6tm78dmak4yl7srz94v"
-                Status:
-                  Timestamp: "2016-06-07T21:07:30.202183143Z"
-                  State: "shutdown"
-                  Message: "shutdown"
-                  ContainerStatus:
-                    ContainerID: "1cf8d63d18e79668b0004a4be4c6ee58cddfad2dae29506d8781581d0688a213"
-                DesiredState: "shutdown"
-                NetworksAttachments:
-                  - Network:
-                      ID: "4qvuz4ko70xaltuqbt8956gd1"
-                      Version:
-                        Index: 18
-                      CreatedAt: "2016-06-07T20:31:11.912919752Z"
-                      UpdatedAt: "2016-06-07T21:07:29.955277358Z"
-                      Spec:
-                        Name: "ingress"
-                        Labels:
-                          com.docker.swarm.internal: "true"
-                        DriverConfiguration: {}
-                        IPAMOptions:
-                          Driver: {}
-                          Configs:
-                            - Subnet: "10.255.0.0/16"
-                              Gateway: "10.255.0.1"
-                      DriverState:
-                        Name: "overlay"
-                        Options:
-                          com.docker.network.driver.overlay.vxlanid_list: "256"
-                      IPAMOptions:
-                        Driver:
-                          Name: "default"
-                        Configs:
-                          - Subnet: "10.255.0.0/16"
-                            Gateway: "10.255.0.1"
-                    Addresses:
-                      - "10.255.0.5/16"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "filters"
-          in: "query"
-          type: "string"
-          description: |
-            A JSON encoded value of the filters (a `map[string][]string`) to
-            process on the tasks list.
-
-            Available filters:
-
-            - `desired-state=(running | shutdown | accepted)`
-            - `id=<task id>`
-            - `label=key` or `label="key=value"`
-            - `name=<task name>`
-            - `node=<node id or name>`
-            - `service=<service name>`
-      tags: ["Task"]
-  /tasks/{id}:
-    get:
-      summary: "Inspect a task"
-      operationId: "TaskInspect"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/Task"
-        404:
-          description: "no such task"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "ID of the task"
-          required: true
-          type: "string"
-      tags: ["Task"]
-  /tasks/{id}/logs:
-    get:
-      summary: "Get task logs"
-      description: |
-        Get `stdout` and `stderr` logs from a task.
-        See also [`/containers/{id}/logs`](#operation/ContainerLogs).
-
-        **Note**: This endpoint works only for services with the `local`,
-        `json-file` or `journald` logging drivers.
-      operationId: "TaskLogs"
-      produces:
-        - "application/vnd.docker.raw-stream"
-        - "application/vnd.docker.multiplexed-stream"
-      responses:
-        200:
-          description: "logs returned as a stream in response body"
-          schema:
-            type: "string"
-            format: "binary"
-        404:
-          description: "no such task"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such task: c2ada9df5af8"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          description: "ID of the task"
-          type: "string"
-        - name: "details"
-          in: "query"
-          description: "Show task context and extra details provided to logs."
-          type: "boolean"
-          default: false
-        - name: "follow"
-          in: "query"
-          description: "Keep connection after returning logs."
-          type: "boolean"
-          default: false
-        - name: "stdout"
-          in: "query"
-          description: "Return logs from `stdout`"
-          type: "boolean"
-          default: false
-        - name: "stderr"
-          in: "query"
-          description: "Return logs from `stderr`"
-          type: "boolean"
-          default: false
-        - name: "since"
-          in: "query"
-          description: "Only return logs since this time, as a UNIX timestamp"
-          type: "integer"
-          default: 0
-        - name: "timestamps"
-          in: "query"
-          description: "Add timestamps to every log line"
-          type: "boolean"
-          default: false
-        - name: "tail"
-          in: "query"
-          description: |
-            Only return this number of log lines from the end of the logs.
-            Specify as an integer or `all` to output all log lines.
-          type: "string"
-          default: "all"
-      tags: ["Task"]
-  /secrets:
-    get:
-      summary: "List secrets"
-      operationId: "SecretList"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/Secret"
-            example:
-              - ID: "blt1owaxmitz71s9v5zh81zun"
-                Version:
-                  Index: 85
-                CreatedAt: "2017-07-20T13:55:28.678958722Z"
-                UpdatedAt: "2017-07-20T13:55:28.678958722Z"
-                Spec:
-                  Name: "mysql-passwd"
-                  Labels:
-                    some.label: "some.value"
-                  Driver:
-                    Name: "secret-bucket"
-                    Options:
-                      OptionA: "value for driver option A"
-                      OptionB: "value for driver option B"
-              - ID: "ktnbjxoalbkvbvedmg1urrz8h"
-                Version:
-                  Index: 11
-                CreatedAt: "2016-11-05T01:20:17.327670065Z"
-                UpdatedAt: "2016-11-05T01:20:17.327670065Z"
-                Spec:
-                  Name: "app-dev.crt"
-                  Labels:
-                    foo: "bar"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "filters"
-          in: "query"
-          type: "string"
-          description: |
-            A JSON encoded value of the filters (a `map[string][]string`) to
-            process on the secrets list.
-
-            Available filters:
-
-            - `id=<secret id>`
-            - `label=<key> or label=<key>=value`
-            - `name=<secret name>`
-            - `names=<secret name>`
-      tags: ["Secret"]
-  /secrets/create:
-    post:
-      summary: "Create a secret"
-      operationId: "SecretCreate"
-      consumes:
-        - "application/json"
-      produces:
-        - "application/json"
-      responses:
-        201:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/IdResponse"
-        409:
-          description: "name conflicts with an existing object"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "body"
-          in: "body"
-          schema:
-            allOf:
-              - $ref: "#/definitions/SecretSpec"
-              - type: "object"
-                example:
-                  Name: "app-key.crt"
-                  Labels:
-                    foo: "bar"
-                  Data: "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg=="
-                  Driver:
-                    Name: "secret-bucket"
-                    Options:
-                      OptionA: "value for driver option A"
-                      OptionB: "value for driver option B"
-      tags: ["Secret"]
-  /secrets/{id}:
-    get:
-      summary: "Inspect a secret"
-      operationId: "SecretInspect"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/Secret"
-          examples:
-            application/json:
-              ID: "ktnbjxoalbkvbvedmg1urrz8h"
-              Version:
-                Index: 11
-              CreatedAt: "2016-11-05T01:20:17.327670065Z"
-              UpdatedAt: "2016-11-05T01:20:17.327670065Z"
-              Spec:
-                Name: "app-dev.crt"
-                Labels:
-                  foo: "bar"
-                Driver:
-                  Name: "secret-bucket"
-                  Options:
-                    OptionA: "value for driver option A"
-                    OptionB: "value for driver option B"
-
-        404:
-          description: "secret not found"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          type: "string"
-          description: "ID of the secret"
-      tags: ["Secret"]
-    delete:
-      summary: "Delete a secret"
-      operationId: "SecretDelete"
-      produces:
-        - "application/json"
-      responses:
-        204:
-          description: "no error"
-        404:
-          description: "secret not found"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          type: "string"
-          description: "ID of the secret"
-      tags: ["Secret"]
-  /secrets/{id}/update:
-    post:
-      summary: "Update a Secret"
-      operationId: "SecretUpdate"
-      responses:
-        200:
-          description: "no error"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "no such secret"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "The ID or name of the secret"
-          type: "string"
-          required: true
-        - name: "body"
-          in: "body"
-          schema:
-            $ref: "#/definitions/SecretSpec"
-          description: |
-            The spec of the secret to update. Currently, only the Labels field
-            can be updated. All other fields must remain unchanged from the
-            [SecretInspect endpoint](#operation/SecretInspect) response values.
-        - name: "version"
-          in: "query"
-          description: |
-            The version number of the secret object being updated. This is
-            required to avoid conflicting writes.
-          type: "integer"
-          format: "int64"
-          required: true
-      tags: ["Secret"]
-  /configs:
-    get:
-      summary: "List configs"
-      operationId: "ConfigList"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            type: "array"
-            items:
-              $ref: "#/definitions/Config"
-            example:
-              - ID: "ktnbjxoalbkvbvedmg1urrz8h"
-                Version:
-                  Index: 11
-                CreatedAt: "2016-11-05T01:20:17.327670065Z"
-                UpdatedAt: "2016-11-05T01:20:17.327670065Z"
-                Spec:
-                  Name: "server.conf"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "filters"
-          in: "query"
-          type: "string"
-          description: |
-            A JSON encoded value of the filters (a `map[string][]string`) to
-            process on the configs list.
-
-            Available filters:
-
-            - `id=<config id>`
-            - `label=<key> or label=<key>=value`
-            - `name=<config name>`
-            - `names=<config name>`
-      tags: ["Config"]
-  /configs/create:
-    post:
-      summary: "Create a config"
-      operationId: "ConfigCreate"
-      consumes:
-        - "application/json"
-      produces:
-        - "application/json"
-      responses:
-        201:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/IdResponse"
-        409:
-          description: "name conflicts with an existing object"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "body"
-          in: "body"
-          schema:
-            allOf:
-              - $ref: "#/definitions/ConfigSpec"
-              - type: "object"
-                example:
-                  Name: "server.conf"
-                  Labels:
-                    foo: "bar"
-                  Data: "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg=="
-      tags: ["Config"]
-  /configs/{id}:
-    get:
-      summary: "Inspect a config"
-      operationId: "ConfigInspect"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "no error"
-          schema:
-            $ref: "#/definitions/Config"
-          examples:
-            application/json:
-              ID: "ktnbjxoalbkvbvedmg1urrz8h"
-              Version:
-                Index: 11
-              CreatedAt: "2016-11-05T01:20:17.327670065Z"
-              UpdatedAt: "2016-11-05T01:20:17.327670065Z"
-              Spec:
-                Name: "app-dev.crt"
-        404:
-          description: "config not found"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          type: "string"
-          description: "ID of the config"
-      tags: ["Config"]
-    delete:
-      summary: "Delete a config"
-      operationId: "ConfigDelete"
-      produces:
-        - "application/json"
-      responses:
-        204:
-          description: "no error"
-        404:
-          description: "config not found"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          required: true
-          type: "string"
-          description: "ID of the config"
-      tags: ["Config"]
-  /configs/{id}/update:
-    post:
-      summary: "Update a Config"
-      operationId: "ConfigUpdate"
-      responses:
-        200:
-          description: "no error"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        404:
-          description: "no such config"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        503:
-          description: "node is not part of a swarm"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "id"
-          in: "path"
-          description: "The ID or name of the config"
-          type: "string"
-          required: true
-        - name: "body"
-          in: "body"
-          schema:
-            $ref: "#/definitions/ConfigSpec"
-          description: |
-            The spec of the config to update. Currently, only the Labels field
-            can be updated. All other fields must remain unchanged from the
-            [ConfigInspect endpoint](#operation/ConfigInspect) response values.
-        - name: "version"
-          in: "query"
-          description: |
-            The version number of the config object being updated. This is
-            required to avoid conflicting writes.
-          type: "integer"
-          format: "int64"
-          required: true
-      tags: ["Config"]
-  /distribution/{name}/json:
-    get:
-      summary: "Get image information from the registry"
-      description: |
-        Return image digest and platform information by contacting the registry.
-      operationId: "DistributionInspect"
-      produces:
-        - "application/json"
-      responses:
-        200:
-          description: "descriptor and platform information"
-          schema:
-            $ref: "#/definitions/DistributionInspect"
-        401:
-          description: "Failed authentication or no image found"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-          examples:
-            application/json:
-              message: "No such image: someimage (tag: latest)"
-        500:
-          description: "Server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      parameters:
-        - name: "name"
-          in: "path"
-          description: "Image name or id"
-          type: "string"
-          required: true
-      tags: ["Distribution"]
-  /session:
-    post:
-      summary: "Initialize interactive session"
-      description: |
-        Start a new interactive session with a server. Session allows server to
-        call back to the client for advanced capabilities.
-
-        ### Hijacking
-
-        This endpoint hijacks the HTTP connection to HTTP2 transport that allows
-        the client to expose gPRC services on that connection.
-
-        For example, the client sends this request to upgrade the connection:
-
-        ```
-        POST /session HTTP/1.1
-        Upgrade: h2c
-        Connection: Upgrade
-        ```
-
-        The Docker daemon responds with a `101 UPGRADED` response follow with
-        the raw stream:
-
-        ```
-        HTTP/1.1 101 UPGRADED
-        Connection: Upgrade
-        Upgrade: h2c
-        ```
-      operationId: "Session"
-      produces:
-        - "application/vnd.docker.raw-stream"
-      responses:
-        101:
-          description: "no error, hijacking successful"
-        400:
-          description: "bad parameter"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-        500:
-          description: "server error"
-          schema:
-            $ref: "#/definitions/ErrorResponse"
-      tags: ["Session"]
diff --git a/vendor/github.com/docker/docker/api/types/blkiodev/blkio.go b/vendor/github.com/docker/docker/api/types/blkiodev/blkio.go
deleted file mode 100644
index bf3463b90..000000000
--- a/vendor/github.com/docker/docker/api/types/blkiodev/blkio.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package blkiodev // import "github.com/docker/docker/api/types/blkiodev"
-
-import "fmt"
-
-// WeightDevice is a structure that holds device:weight pair
-type WeightDevice struct {
-	Path   string
-	Weight uint16
-}
-
-func (w *WeightDevice) String() string {
-	return fmt.Sprintf("%s:%d", w.Path, w.Weight)
-}
-
-// ThrottleDevice is a structure that holds device:rate_per_second pair
-type ThrottleDevice struct {
-	Path string
-	Rate uint64
-}
-
-func (t *ThrottleDevice) String() string {
-	return fmt.Sprintf("%s:%d", t.Path, t.Rate)
-}
diff --git a/vendor/github.com/docker/docker/api/types/checkpoint/list.go b/vendor/github.com/docker/docker/api/types/checkpoint/list.go
deleted file mode 100644
index 94a9c0a47..000000000
--- a/vendor/github.com/docker/docker/api/types/checkpoint/list.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package checkpoint
-
-// Summary represents the details of a checkpoint when listing endpoints.
-type Summary struct {
-	// Name is the name of the checkpoint.
-	Name string
-}
diff --git a/vendor/github.com/docker/docker/api/types/checkpoint/options.go b/vendor/github.com/docker/docker/api/types/checkpoint/options.go
deleted file mode 100644
index 9477458c2..000000000
--- a/vendor/github.com/docker/docker/api/types/checkpoint/options.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package checkpoint
-
-// CreateOptions holds parameters to create a checkpoint from a container.
-type CreateOptions struct {
-	CheckpointID  string
-	CheckpointDir string
-	Exit          bool
-}
-
-// ListOptions holds parameters to list checkpoints for a container.
-type ListOptions struct {
-	CheckpointDir string
-}
-
-// DeleteOptions holds parameters to delete a checkpoint from a container.
-type DeleteOptions struct {
-	CheckpointID  string
-	CheckpointDir string
-}
diff --git a/vendor/github.com/docker/docker/api/types/client.go b/vendor/github.com/docker/docker/api/types/client.go
deleted file mode 100644
index df791f02a..000000000
--- a/vendor/github.com/docker/docker/api/types/client.go
+++ /dev/null
@@ -1,257 +0,0 @@
-package types // import "github.com/docker/docker/api/types"
-
-import (
-	"bufio"
-	"context"
-	"io"
-	"net"
-
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/registry"
-)
-
-// NewHijackedResponse intializes a HijackedResponse type
-func NewHijackedResponse(conn net.Conn, mediaType string) HijackedResponse {
-	return HijackedResponse{Conn: conn, Reader: bufio.NewReader(conn), mediaType: mediaType}
-}
-
-// HijackedResponse holds connection information for a hijacked request.
-type HijackedResponse struct {
-	mediaType string
-	Conn      net.Conn
-	Reader    *bufio.Reader
-}
-
-// Close closes the hijacked connection and reader.
-func (h *HijackedResponse) Close() {
-	h.Conn.Close()
-}
-
-// MediaType let client know if HijackedResponse hold a raw or multiplexed stream.
-// returns false if HTTP Content-Type is not relevant, and container must be inspected
-func (h *HijackedResponse) MediaType() (string, bool) {
-	if h.mediaType == "" {
-		return "", false
-	}
-	return h.mediaType, true
-}
-
-// CloseWriter is an interface that implements structs
-// that close input streams to prevent from writing.
-type CloseWriter interface {
-	CloseWrite() error
-}
-
-// CloseWrite closes a readWriter for writing.
-func (h *HijackedResponse) CloseWrite() error {
-	if conn, ok := h.Conn.(CloseWriter); ok {
-		return conn.CloseWrite()
-	}
-	return nil
-}
-
-// ImageBuildOptions holds the information
-// necessary to build images.
-type ImageBuildOptions struct {
-	Tags           []string
-	SuppressOutput bool
-	RemoteContext  string
-	NoCache        bool
-	Remove         bool
-	ForceRemove    bool
-	PullParent     bool
-	Isolation      container.Isolation
-	CPUSetCPUs     string
-	CPUSetMems     string
-	CPUShares      int64
-	CPUQuota       int64
-	CPUPeriod      int64
-	Memory         int64
-	MemorySwap     int64
-	CgroupParent   string
-	NetworkMode    string
-	ShmSize        int64
-	Dockerfile     string
-	Ulimits        []*container.Ulimit
-	// BuildArgs needs to be a *string instead of just a string so that
-	// we can tell the difference between "" (empty string) and no value
-	// at all (nil). See the parsing of buildArgs in
-	// api/server/router/build/build_routes.go for even more info.
-	BuildArgs   map[string]*string
-	AuthConfigs map[string]registry.AuthConfig
-	Context     io.Reader
-	Labels      map[string]string
-	// squash the resulting image's layers to the parent
-	// preserves the original image and creates a new one from the parent with all
-	// the changes applied to a single layer
-	Squash bool
-	// CacheFrom specifies images that are used for matching cache. Images
-	// specified here do not need to have a valid parent chain to match cache.
-	CacheFrom   []string
-	SecurityOpt []string
-	ExtraHosts  []string // List of extra hosts
-	Target      string
-	SessionID   string
-	Platform    string
-	// Version specifies the version of the underlying builder to use
-	Version BuilderVersion
-	// BuildID is an optional identifier that can be passed together with the
-	// build request. The same identifier can be used to gracefully cancel the
-	// build with the cancel request.
-	BuildID string
-	// Outputs defines configurations for exporting build results. Only supported
-	// in BuildKit mode
-	Outputs []ImageBuildOutput
-}
-
-// ImageBuildOutput defines configuration for exporting a build result
-type ImageBuildOutput struct {
-	Type  string
-	Attrs map[string]string
-}
-
-// BuilderVersion sets the version of underlying builder to use
-type BuilderVersion string
-
-const (
-	// BuilderV1 is the first generation builder in docker daemon
-	BuilderV1 BuilderVersion = "1"
-	// BuilderBuildKit is builder based on moby/buildkit project
-	BuilderBuildKit BuilderVersion = "2"
-)
-
-// ImageBuildResponse holds information
-// returned by a server after building
-// an image.
-type ImageBuildResponse struct {
-	Body   io.ReadCloser
-	OSType string
-}
-
-// RequestPrivilegeFunc is a function interface that
-// clients can supply to retry operations after
-// getting an authorization error.
-// This function returns the registry authentication
-// header value in base 64 format, or an error
-// if the privilege request fails.
-type RequestPrivilegeFunc func(context.Context) (string, error)
-
-// NodeListOptions holds parameters to list nodes with.
-type NodeListOptions struct {
-	Filters filters.Args
-}
-
-// NodeRemoveOptions holds parameters to remove nodes with.
-type NodeRemoveOptions struct {
-	Force bool
-}
-
-// ServiceCreateOptions contains the options to use when creating a service.
-type ServiceCreateOptions struct {
-	// EncodedRegistryAuth is the encoded registry authorization credentials to
-	// use when updating the service.
-	//
-	// This field follows the format of the X-Registry-Auth header.
-	EncodedRegistryAuth string
-
-	// QueryRegistry indicates whether the service update requires
-	// contacting a registry. A registry may be contacted to retrieve
-	// the image digest and manifest, which in turn can be used to update
-	// platform or other information about the service.
-	QueryRegistry bool
-}
-
-// Values for RegistryAuthFrom in ServiceUpdateOptions
-const (
-	RegistryAuthFromSpec         = "spec"
-	RegistryAuthFromPreviousSpec = "previous-spec"
-)
-
-// ServiceUpdateOptions contains the options to be used for updating services.
-type ServiceUpdateOptions struct {
-	// EncodedRegistryAuth is the encoded registry authorization credentials to
-	// use when updating the service.
-	//
-	// This field follows the format of the X-Registry-Auth header.
-	EncodedRegistryAuth string
-
-	// TODO(stevvooe): Consider moving the version parameter of ServiceUpdate
-	// into this field. While it does open API users up to racy writes, most
-	// users may not need that level of consistency in practice.
-
-	// RegistryAuthFrom specifies where to find the registry authorization
-	// credentials if they are not given in EncodedRegistryAuth. Valid
-	// values are "spec" and "previous-spec".
-	RegistryAuthFrom string
-
-	// Rollback indicates whether a server-side rollback should be
-	// performed. When this is set, the provided spec will be ignored.
-	// The valid values are "previous" and "none". An empty value is the
-	// same as "none".
-	Rollback string
-
-	// QueryRegistry indicates whether the service update requires
-	// contacting a registry. A registry may be contacted to retrieve
-	// the image digest and manifest, which in turn can be used to update
-	// platform or other information about the service.
-	QueryRegistry bool
-}
-
-// ServiceListOptions holds parameters to list services with.
-type ServiceListOptions struct {
-	Filters filters.Args
-
-	// Status indicates whether the server should include the service task
-	// count of running and desired tasks.
-	Status bool
-}
-
-// ServiceInspectOptions holds parameters related to the "service inspect"
-// operation.
-type ServiceInspectOptions struct {
-	InsertDefaults bool
-}
-
-// TaskListOptions holds parameters to list tasks with.
-type TaskListOptions struct {
-	Filters filters.Args
-}
-
-// PluginRemoveOptions holds parameters to remove plugins.
-type PluginRemoveOptions struct {
-	Force bool
-}
-
-// PluginEnableOptions holds parameters to enable plugins.
-type PluginEnableOptions struct {
-	Timeout int
-}
-
-// PluginDisableOptions holds parameters to disable plugins.
-type PluginDisableOptions struct {
-	Force bool
-}
-
-// PluginInstallOptions holds parameters to install a plugin.
-type PluginInstallOptions struct {
-	Disabled              bool
-	AcceptAllPermissions  bool
-	RegistryAuth          string // RegistryAuth is the base64 encoded credentials for the registry
-	RemoteRef             string // RemoteRef is the plugin name on the registry
-	PrivilegeFunc         RequestPrivilegeFunc
-	AcceptPermissionsFunc func(context.Context, PluginPrivileges) (bool, error)
-	Args                  []string
-}
-
-// SwarmUnlockKeyResponse contains the response for Engine API:
-// GET /swarm/unlockkey
-type SwarmUnlockKeyResponse struct {
-	// UnlockKey is the unlock key in ASCII-armored format.
-	UnlockKey string
-}
-
-// PluginCreateOptions hold all options to plugin create.
-type PluginCreateOptions struct {
-	RepoName string
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/change_type.go b/vendor/github.com/docker/docker/api/types/container/change_type.go
deleted file mode 100644
index fe8d6d369..000000000
--- a/vendor/github.com/docker/docker/api/types/container/change_type.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package container
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// ChangeType Kind of change
-//
-// Can be one of:
-//
-// - `0`: Modified ("C")
-// - `1`: Added ("A")
-// - `2`: Deleted ("D")
-//
-// swagger:model ChangeType
-type ChangeType uint8
diff --git a/vendor/github.com/docker/docker/api/types/container/change_types.go b/vendor/github.com/docker/docker/api/types/container/change_types.go
deleted file mode 100644
index 3a3a83866..000000000
--- a/vendor/github.com/docker/docker/api/types/container/change_types.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package container
-
-const (
-	// ChangeModify represents the modify operation.
-	ChangeModify ChangeType = 0
-	// ChangeAdd represents the add operation.
-	ChangeAdd ChangeType = 1
-	// ChangeDelete represents the delete operation.
-	ChangeDelete ChangeType = 2
-)
-
-func (ct ChangeType) String() string {
-	switch ct {
-	case ChangeModify:
-		return "C"
-	case ChangeAdd:
-		return "A"
-	case ChangeDelete:
-		return "D"
-	default:
-		return ""
-	}
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/config.go b/vendor/github.com/docker/docker/api/types/container/config.go
deleted file mode 100644
index d6b03e8b2..000000000
--- a/vendor/github.com/docker/docker/api/types/container/config.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package container // import "github.com/docker/docker/api/types/container"
-
-import (
-	"time"
-
-	"github.com/docker/docker/api/types/strslice"
-	"github.com/docker/go-connections/nat"
-	dockerspec "github.com/moby/docker-image-spec/specs-go/v1"
-)
-
-// MinimumDuration puts a minimum on user configured duration.
-// This is to prevent API error on time unit. For example, API may
-// set 3 as healthcheck interval with intention of 3 seconds, but
-// Docker interprets it as 3 nanoseconds.
-const MinimumDuration = 1 * time.Millisecond
-
-// StopOptions holds the options to stop or restart a container.
-type StopOptions struct {
-	// Signal (optional) is the signal to send to the container to (gracefully)
-	// stop it before forcibly terminating the container with SIGKILL after the
-	// timeout expires. If not value is set, the default (SIGTERM) is used.
-	Signal string `json:",omitempty"`
-
-	// Timeout (optional) is the timeout (in seconds) to wait for the container
-	// to stop gracefully before forcibly terminating it with SIGKILL.
-	//
-	// - Use nil to use the default timeout (10 seconds).
-	// - Use '-1' to wait indefinitely.
-	// - Use '0' to not wait for the container to exit gracefully, and
-	//   immediately proceeds to forcibly terminating the container.
-	// - Other positive values are used as timeout (in seconds).
-	Timeout *int `json:",omitempty"`
-}
-
-// HealthConfig holds configuration settings for the HEALTHCHECK feature.
-type HealthConfig = dockerspec.HealthcheckConfig
-
-// Config contains the configuration data about a container.
-// It should hold only portable information about the container.
-// Here, "portable" means "independent from the host we are running on".
-// Non-portable information *should* appear in HostConfig.
-// All fields added to this struct must be marked `omitempty` to keep getting
-// predictable hashes from the old `v1Compatibility` configuration.
-type Config struct {
-	Hostname        string              // Hostname
-	Domainname      string              // Domainname
-	User            string              // User that will run the command(s) inside the container, also support user:group
-	AttachStdin     bool                // Attach the standard input, makes possible user interaction
-	AttachStdout    bool                // Attach the standard output
-	AttachStderr    bool                // Attach the standard error
-	ExposedPorts    nat.PortSet         `json:",omitempty"` // List of exposed ports
-	Tty             bool                // Attach standard streams to a tty, including stdin if it is not closed.
-	OpenStdin       bool                // Open stdin
-	StdinOnce       bool                // If true, close stdin after the 1 attached client disconnects.
-	Env             []string            // List of environment variable to set in the container
-	Cmd             strslice.StrSlice   // Command to run when starting the container
-	Healthcheck     *HealthConfig       `json:",omitempty"` // Healthcheck describes how to check the container is healthy
-	ArgsEscaped     bool                `json:",omitempty"` // True if command is already escaped (meaning treat as a command line) (Windows specific).
-	Image           string              // Name of the image as it was passed by the operator (e.g. could be symbolic)
-	Volumes         map[string]struct{} // List of volumes (mounts) used for the container
-	WorkingDir      string              // Current directory (PWD) in the command will be launched
-	Entrypoint      strslice.StrSlice   // Entrypoint to run when starting the container
-	NetworkDisabled bool                `json:",omitempty"` // Is network disabled
-	// Mac Address of the container.
-	//
-	// Deprecated: this field is deprecated since API v1.44. Use EndpointSettings.MacAddress instead.
-	MacAddress  string            `json:",omitempty"`
-	OnBuild     []string          // ONBUILD metadata that were defined on the image Dockerfile
-	Labels      map[string]string // List of labels set to this container
-	StopSignal  string            `json:",omitempty"` // Signal to stop a container
-	StopTimeout *int              `json:",omitempty"` // Timeout (in seconds) to stop a container
-	Shell       strslice.StrSlice `json:",omitempty"` // Shell for shell-form of RUN, CMD, ENTRYPOINT
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/container.go b/vendor/github.com/docker/docker/api/types/container/container.go
deleted file mode 100644
index 711af12c9..000000000
--- a/vendor/github.com/docker/docker/api/types/container/container.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package container
-
-import (
-	"io"
-	"os"
-	"time"
-)
-
-// PruneReport contains the response for Engine API:
-// POST "/containers/prune"
-type PruneReport struct {
-	ContainersDeleted []string
-	SpaceReclaimed    uint64
-}
-
-// PathStat is used to encode the header from
-// GET "/containers/{name:.*}/archive"
-// "Name" is the file or directory name.
-type PathStat struct {
-	Name       string      `json:"name"`
-	Size       int64       `json:"size"`
-	Mode       os.FileMode `json:"mode"`
-	Mtime      time.Time   `json:"mtime"`
-	LinkTarget string      `json:"linkTarget"`
-}
-
-// CopyToContainerOptions holds information
-// about files to copy into a container
-type CopyToContainerOptions struct {
-	AllowOverwriteDirWithFile bool
-	CopyUIDGID                bool
-}
-
-// StatsResponseReader wraps an io.ReadCloser to read (a stream of) stats
-// for a container, as produced by the GET "/stats" endpoint.
-//
-// The OSType field is set to the server's platform to allow
-// platform-specific handling of the response.
-//
-// TODO(thaJeztah): remove this wrapper, and make OSType part of [StatsResponse].
-type StatsResponseReader struct {
-	Body   io.ReadCloser `json:"body"`
-	OSType string        `json:"ostype"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/container_top.go b/vendor/github.com/docker/docker/api/types/container/container_top.go
deleted file mode 100644
index 63381da36..000000000
--- a/vendor/github.com/docker/docker/api/types/container/container_top.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package container // import "github.com/docker/docker/api/types/container"
-
-// ----------------------------------------------------------------------------
-// Code generated by `swagger generate operation`. DO NOT EDIT.
-//
-// See hack/generate-swagger-api.sh
-// ----------------------------------------------------------------------------
-
-// ContainerTopOKBody OK response to ContainerTop operation
-// swagger:model ContainerTopOKBody
-type ContainerTopOKBody struct {
-
-	// Each process running in the container, where each is process
-	// is an array of values corresponding to the titles.
-	//
-	// Required: true
-	Processes [][]string `json:"Processes"`
-
-	// The ps column titles
-	// Required: true
-	Titles []string `json:"Titles"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/container_update.go b/vendor/github.com/docker/docker/api/types/container/container_update.go
deleted file mode 100644
index c10f175ea..000000000
--- a/vendor/github.com/docker/docker/api/types/container/container_update.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package container // import "github.com/docker/docker/api/types/container"
-
-// ----------------------------------------------------------------------------
-// Code generated by `swagger generate operation`. DO NOT EDIT.
-//
-// See hack/generate-swagger-api.sh
-// ----------------------------------------------------------------------------
-
-// ContainerUpdateOKBody OK response to ContainerUpdate operation
-// swagger:model ContainerUpdateOKBody
-type ContainerUpdateOKBody struct {
-
-	// warnings
-	// Required: true
-	Warnings []string `json:"Warnings"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/create_request.go b/vendor/github.com/docker/docker/api/types/container/create_request.go
deleted file mode 100644
index e98dd6ad4..000000000
--- a/vendor/github.com/docker/docker/api/types/container/create_request.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package container
-
-import "github.com/docker/docker/api/types/network"
-
-// CreateRequest is the request message sent to the server for container
-// create calls. It is a config wrapper that holds the container [Config]
-// (portable) and the corresponding [HostConfig] (non-portable) and
-// [network.NetworkingConfig].
-type CreateRequest struct {
-	*Config
-	HostConfig       *HostConfig               `json:"HostConfig,omitempty"`
-	NetworkingConfig *network.NetworkingConfig `json:"NetworkingConfig,omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/create_response.go b/vendor/github.com/docker/docker/api/types/container/create_response.go
deleted file mode 100644
index aa0e7f7d0..000000000
--- a/vendor/github.com/docker/docker/api/types/container/create_response.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package container
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// CreateResponse ContainerCreateResponse
-//
-// OK response to ContainerCreate operation
-// swagger:model CreateResponse
-type CreateResponse struct {
-
-	// The ID of the created container
-	// Required: true
-	ID string `json:"Id"`
-
-	// Warnings encountered when creating the container
-	// Required: true
-	Warnings []string `json:"Warnings"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/errors.go b/vendor/github.com/docker/docker/api/types/container/errors.go
deleted file mode 100644
index 32c978037..000000000
--- a/vendor/github.com/docker/docker/api/types/container/errors.go
+++ /dev/null
@@ -1,9 +0,0 @@
-package container
-
-type errInvalidParameter struct{ error }
-
-func (e *errInvalidParameter) InvalidParameter() {}
-
-func (e *errInvalidParameter) Unwrap() error {
-	return e.error
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/exec.go b/vendor/github.com/docker/docker/api/types/container/exec.go
deleted file mode 100644
index 96093eb5c..000000000
--- a/vendor/github.com/docker/docker/api/types/container/exec.go
+++ /dev/null
@@ -1,43 +0,0 @@
-package container
-
-// ExecOptions is a small subset of the Config struct that holds the configuration
-// for the exec feature of docker.
-type ExecOptions struct {
-	User         string   // User that will run the command
-	Privileged   bool     // Is the container in privileged mode
-	Tty          bool     // Attach standard streams to a tty.
-	ConsoleSize  *[2]uint `json:",omitempty"` // Initial console size [height, width]
-	AttachStdin  bool     // Attach the standard input, makes possible user interaction
-	AttachStderr bool     // Attach the standard error
-	AttachStdout bool     // Attach the standard output
-	Detach       bool     // Execute in detach mode
-	DetachKeys   string   // Escape keys for detach
-	Env          []string // Environment variables
-	WorkingDir   string   // Working directory
-	Cmd          []string // Execution commands and args
-}
-
-// ExecStartOptions is a temp struct used by execStart
-// Config fields is part of ExecConfig in runconfig package
-type ExecStartOptions struct {
-	// ExecStart will first check if it's detached
-	Detach bool
-	// Check if there's a tty
-	Tty bool
-	// Terminal size [height, width], unused if Tty == false
-	ConsoleSize *[2]uint `json:",omitempty"`
-}
-
-// ExecAttachOptions is a temp struct used by execAttach.
-//
-// TODO(thaJeztah): make this a separate type; ContainerExecAttach does not use the Detach option, and cannot run detached.
-type ExecAttachOptions = ExecStartOptions
-
-// ExecInspect holds information returned by exec inspect.
-type ExecInspect struct {
-	ExecID      string `json:"ID"`
-	ContainerID string
-	Running     bool
-	ExitCode    int
-	Pid         int
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/filesystem_change.go b/vendor/github.com/docker/docker/api/types/container/filesystem_change.go
deleted file mode 100644
index 9e9c2ad1d..000000000
--- a/vendor/github.com/docker/docker/api/types/container/filesystem_change.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package container
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// FilesystemChange Change in the container's filesystem.
-//
-// swagger:model FilesystemChange
-type FilesystemChange struct {
-
-	// kind
-	// Required: true
-	Kind ChangeType `json:"Kind"`
-
-	// Path to file or directory that has changed.
-	//
-	// Required: true
-	Path string `json:"Path"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/hostconfig.go b/vendor/github.com/docker/docker/api/types/container/hostconfig.go
deleted file mode 100644
index 83198305e..000000000
--- a/vendor/github.com/docker/docker/api/types/container/hostconfig.go
+++ /dev/null
@@ -1,501 +0,0 @@
-package container // import "github.com/docker/docker/api/types/container"
-
-import (
-	"errors"
-	"fmt"
-	"strings"
-
-	"github.com/docker/docker/api/types/blkiodev"
-	"github.com/docker/docker/api/types/mount"
-	"github.com/docker/docker/api/types/network"
-	"github.com/docker/docker/api/types/strslice"
-	"github.com/docker/go-connections/nat"
-	"github.com/docker/go-units"
-)
-
-// CgroupnsMode represents the cgroup namespace mode of the container
-type CgroupnsMode string
-
-// cgroup namespace modes for containers
-const (
-	CgroupnsModeEmpty   CgroupnsMode = ""
-	CgroupnsModePrivate CgroupnsMode = "private"
-	CgroupnsModeHost    CgroupnsMode = "host"
-)
-
-// IsPrivate indicates whether the container uses its own private cgroup namespace
-func (c CgroupnsMode) IsPrivate() bool {
-	return c == CgroupnsModePrivate
-}
-
-// IsHost indicates whether the container shares the host's cgroup namespace
-func (c CgroupnsMode) IsHost() bool {
-	return c == CgroupnsModeHost
-}
-
-// IsEmpty indicates whether the container cgroup namespace mode is unset
-func (c CgroupnsMode) IsEmpty() bool {
-	return c == CgroupnsModeEmpty
-}
-
-// Valid indicates whether the cgroup namespace mode is valid
-func (c CgroupnsMode) Valid() bool {
-	return c.IsEmpty() || c.IsPrivate() || c.IsHost()
-}
-
-// Isolation represents the isolation technology of a container. The supported
-// values are platform specific
-type Isolation string
-
-// Isolation modes for containers
-const (
-	IsolationEmpty   Isolation = ""        // IsolationEmpty is unspecified (same behavior as default)
-	IsolationDefault Isolation = "default" // IsolationDefault is the default isolation mode on current daemon
-	IsolationProcess Isolation = "process" // IsolationProcess is process isolation mode
-	IsolationHyperV  Isolation = "hyperv"  // IsolationHyperV is HyperV isolation mode
-)
-
-// IsDefault indicates the default isolation technology of a container. On Linux this
-// is the native driver. On Windows, this is a Windows Server Container.
-func (i Isolation) IsDefault() bool {
-	// TODO consider making isolation-mode strict (case-sensitive)
-	v := Isolation(strings.ToLower(string(i)))
-	return v == IsolationDefault || v == IsolationEmpty
-}
-
-// IsHyperV indicates the use of a Hyper-V partition for isolation
-func (i Isolation) IsHyperV() bool {
-	// TODO consider making isolation-mode strict (case-sensitive)
-	return Isolation(strings.ToLower(string(i))) == IsolationHyperV
-}
-
-// IsProcess indicates the use of process isolation
-func (i Isolation) IsProcess() bool {
-	// TODO consider making isolation-mode strict (case-sensitive)
-	return Isolation(strings.ToLower(string(i))) == IsolationProcess
-}
-
-// IpcMode represents the container ipc stack.
-type IpcMode string
-
-// IpcMode constants
-const (
-	IPCModeNone      IpcMode = "none"
-	IPCModeHost      IpcMode = "host"
-	IPCModeContainer IpcMode = "container"
-	IPCModePrivate   IpcMode = "private"
-	IPCModeShareable IpcMode = "shareable"
-)
-
-// IsPrivate indicates whether the container uses its own private ipc namespace which can not be shared.
-func (n IpcMode) IsPrivate() bool {
-	return n == IPCModePrivate
-}
-
-// IsHost indicates whether the container shares the host's ipc namespace.
-func (n IpcMode) IsHost() bool {
-	return n == IPCModeHost
-}
-
-// IsShareable indicates whether the container's ipc namespace can be shared with another container.
-func (n IpcMode) IsShareable() bool {
-	return n == IPCModeShareable
-}
-
-// IsContainer indicates whether the container uses another container's ipc namespace.
-func (n IpcMode) IsContainer() bool {
-	_, ok := containerID(string(n))
-	return ok
-}
-
-// IsNone indicates whether container IpcMode is set to "none".
-func (n IpcMode) IsNone() bool {
-	return n == IPCModeNone
-}
-
-// IsEmpty indicates whether container IpcMode is empty
-func (n IpcMode) IsEmpty() bool {
-	return n == ""
-}
-
-// Valid indicates whether the ipc mode is valid.
-func (n IpcMode) Valid() bool {
-	// TODO(thaJeztah): align with PidMode, and consider container-mode without a container name/ID to be invalid.
-	return n.IsEmpty() || n.IsNone() || n.IsPrivate() || n.IsHost() || n.IsShareable() || n.IsContainer()
-}
-
-// Container returns the name of the container ipc stack is going to be used.
-func (n IpcMode) Container() (idOrName string) {
-	idOrName, _ = containerID(string(n))
-	return idOrName
-}
-
-// NetworkMode represents the container network stack.
-type NetworkMode string
-
-// IsNone indicates whether container isn't using a network stack.
-func (n NetworkMode) IsNone() bool {
-	return n == network.NetworkNone
-}
-
-// IsDefault indicates whether container uses the default network stack.
-func (n NetworkMode) IsDefault() bool {
-	return n == network.NetworkDefault
-}
-
-// IsPrivate indicates whether container uses its private network stack.
-func (n NetworkMode) IsPrivate() bool {
-	return !(n.IsHost() || n.IsContainer())
-}
-
-// IsContainer indicates whether container uses a container network stack.
-func (n NetworkMode) IsContainer() bool {
-	_, ok := containerID(string(n))
-	return ok
-}
-
-// ConnectedContainer is the id of the container which network this container is connected to.
-func (n NetworkMode) ConnectedContainer() (idOrName string) {
-	idOrName, _ = containerID(string(n))
-	return idOrName
-}
-
-// UserDefined indicates user-created network
-func (n NetworkMode) UserDefined() string {
-	if n.IsUserDefined() {
-		return string(n)
-	}
-	return ""
-}
-
-// UsernsMode represents userns mode in the container.
-type UsernsMode string
-
-// IsHost indicates whether the container uses the host's userns.
-func (n UsernsMode) IsHost() bool {
-	return n == "host"
-}
-
-// IsPrivate indicates whether the container uses the a private userns.
-func (n UsernsMode) IsPrivate() bool {
-	return !n.IsHost()
-}
-
-// Valid indicates whether the userns is valid.
-func (n UsernsMode) Valid() bool {
-	return n == "" || n.IsHost()
-}
-
-// CgroupSpec represents the cgroup to use for the container.
-type CgroupSpec string
-
-// IsContainer indicates whether the container is using another container cgroup
-func (c CgroupSpec) IsContainer() bool {
-	_, ok := containerID(string(c))
-	return ok
-}
-
-// Valid indicates whether the cgroup spec is valid.
-func (c CgroupSpec) Valid() bool {
-	// TODO(thaJeztah): align with PidMode, and consider container-mode without a container name/ID to be invalid.
-	return c == "" || c.IsContainer()
-}
-
-// Container returns the ID or name of the container whose cgroup will be used.
-func (c CgroupSpec) Container() (idOrName string) {
-	idOrName, _ = containerID(string(c))
-	return idOrName
-}
-
-// UTSMode represents the UTS namespace of the container.
-type UTSMode string
-
-// IsPrivate indicates whether the container uses its private UTS namespace.
-func (n UTSMode) IsPrivate() bool {
-	return !n.IsHost()
-}
-
-// IsHost indicates whether the container uses the host's UTS namespace.
-func (n UTSMode) IsHost() bool {
-	return n == "host"
-}
-
-// Valid indicates whether the UTS namespace is valid.
-func (n UTSMode) Valid() bool {
-	return n == "" || n.IsHost()
-}
-
-// PidMode represents the pid namespace of the container.
-type PidMode string
-
-// IsPrivate indicates whether the container uses its own new pid namespace.
-func (n PidMode) IsPrivate() bool {
-	return !(n.IsHost() || n.IsContainer())
-}
-
-// IsHost indicates whether the container uses the host's pid namespace.
-func (n PidMode) IsHost() bool {
-	return n == "host"
-}
-
-// IsContainer indicates whether the container uses a container's pid namespace.
-func (n PidMode) IsContainer() bool {
-	_, ok := containerID(string(n))
-	return ok
-}
-
-// Valid indicates whether the pid namespace is valid.
-func (n PidMode) Valid() bool {
-	return n == "" || n.IsHost() || validContainer(string(n))
-}
-
-// Container returns the name of the container whose pid namespace is going to be used.
-func (n PidMode) Container() (idOrName string) {
-	idOrName, _ = containerID(string(n))
-	return idOrName
-}
-
-// DeviceRequest represents a request for devices from a device driver.
-// Used by GPU device drivers.
-type DeviceRequest struct {
-	Driver       string            // Name of device driver
-	Count        int               // Number of devices to request (-1 = All)
-	DeviceIDs    []string          // List of device IDs as recognizable by the device driver
-	Capabilities [][]string        // An OR list of AND lists of device capabilities (e.g. "gpu")
-	Options      map[string]string // Options to pass onto the device driver
-}
-
-// DeviceMapping represents the device mapping between the host and the container.
-type DeviceMapping struct {
-	PathOnHost        string
-	PathInContainer   string
-	CgroupPermissions string
-}
-
-// RestartPolicy represents the restart policies of the container.
-type RestartPolicy struct {
-	Name              RestartPolicyMode
-	MaximumRetryCount int
-}
-
-type RestartPolicyMode string
-
-const (
-	RestartPolicyDisabled      RestartPolicyMode = "no"
-	RestartPolicyAlways        RestartPolicyMode = "always"
-	RestartPolicyOnFailure     RestartPolicyMode = "on-failure"
-	RestartPolicyUnlessStopped RestartPolicyMode = "unless-stopped"
-)
-
-// IsNone indicates whether the container has the "no" restart policy.
-// This means the container will not automatically restart when exiting.
-func (rp *RestartPolicy) IsNone() bool {
-	return rp.Name == RestartPolicyDisabled || rp.Name == ""
-}
-
-// IsAlways indicates whether the container has the "always" restart policy.
-// This means the container will automatically restart regardless of the exit status.
-func (rp *RestartPolicy) IsAlways() bool {
-	return rp.Name == RestartPolicyAlways
-}
-
-// IsOnFailure indicates whether the container has the "on-failure" restart policy.
-// This means the container will automatically restart of exiting with a non-zero exit status.
-func (rp *RestartPolicy) IsOnFailure() bool {
-	return rp.Name == RestartPolicyOnFailure
-}
-
-// IsUnlessStopped indicates whether the container has the
-// "unless-stopped" restart policy. This means the container will
-// automatically restart unless user has put it to stopped state.
-func (rp *RestartPolicy) IsUnlessStopped() bool {
-	return rp.Name == RestartPolicyUnlessStopped
-}
-
-// IsSame compares two RestartPolicy to see if they are the same
-func (rp *RestartPolicy) IsSame(tp *RestartPolicy) bool {
-	return rp.Name == tp.Name && rp.MaximumRetryCount == tp.MaximumRetryCount
-}
-
-// ValidateRestartPolicy validates the given RestartPolicy.
-func ValidateRestartPolicy(policy RestartPolicy) error {
-	switch policy.Name {
-	case RestartPolicyAlways, RestartPolicyUnlessStopped, RestartPolicyDisabled:
-		if policy.MaximumRetryCount != 0 {
-			msg := "invalid restart policy: maximum retry count can only be used with 'on-failure'"
-			if policy.MaximumRetryCount < 0 {
-				msg += " and cannot be negative"
-			}
-			return &errInvalidParameter{errors.New(msg)}
-		}
-		return nil
-	case RestartPolicyOnFailure:
-		if policy.MaximumRetryCount < 0 {
-			return &errInvalidParameter{errors.New("invalid restart policy: maximum retry count cannot be negative")}
-		}
-		return nil
-	case "":
-		// Versions before v25.0.0 created an empty restart-policy "name" as
-		// default. Allow an empty name with "any" MaximumRetryCount for
-		// backward-compatibility.
-		return nil
-	default:
-		return &errInvalidParameter{fmt.Errorf("invalid restart policy: unknown policy '%s'; use one of '%s', '%s', '%s', or '%s'", policy.Name, RestartPolicyDisabled, RestartPolicyAlways, RestartPolicyOnFailure, RestartPolicyUnlessStopped)}
-	}
-}
-
-// LogMode is a type to define the available modes for logging
-// These modes affect how logs are handled when log messages start piling up.
-type LogMode string
-
-// Available logging modes
-const (
-	LogModeUnset    LogMode = ""
-	LogModeBlocking LogMode = "blocking"
-	LogModeNonBlock LogMode = "non-blocking"
-)
-
-// LogConfig represents the logging configuration of the container.
-type LogConfig struct {
-	Type   string
-	Config map[string]string
-}
-
-// Ulimit is an alias for [units.Ulimit], which may be moving to a different
-// location or become a local type. This alias is to help transitioning.
-//
-// Users are recommended to use this alias instead of using [units.Ulimit] directly.
-type Ulimit = units.Ulimit
-
-// Resources contains container's resources (cgroups config, ulimits...)
-type Resources struct {
-	// Applicable to all platforms
-	CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers)
-	Memory    int64 // Memory limit (in bytes)
-	NanoCPUs  int64 `json:"NanoCpus"` // CPU quota in units of 10<sup>-9</sup> CPUs.
-
-	// Applicable to UNIX platforms
-	CgroupParent         string // Parent cgroup.
-	BlkioWeight          uint16 // Block IO weight (relative weight vs. other containers)
-	BlkioWeightDevice    []*blkiodev.WeightDevice
-	BlkioDeviceReadBps   []*blkiodev.ThrottleDevice
-	BlkioDeviceWriteBps  []*blkiodev.ThrottleDevice
-	BlkioDeviceReadIOps  []*blkiodev.ThrottleDevice
-	BlkioDeviceWriteIOps []*blkiodev.ThrottleDevice
-	CPUPeriod            int64           `json:"CpuPeriod"`          // CPU CFS (Completely Fair Scheduler) period
-	CPUQuota             int64           `json:"CpuQuota"`           // CPU CFS (Completely Fair Scheduler) quota
-	CPURealtimePeriod    int64           `json:"CpuRealtimePeriod"`  // CPU real-time period
-	CPURealtimeRuntime   int64           `json:"CpuRealtimeRuntime"` // CPU real-time runtime
-	CpusetCpus           string          // CpusetCpus 0-2, 0,1
-	CpusetMems           string          // CpusetMems 0-2, 0,1
-	Devices              []DeviceMapping // List of devices to map inside the container
-	DeviceCgroupRules    []string        // List of rule to be added to the device cgroup
-	DeviceRequests       []DeviceRequest // List of device requests for device drivers
-
-	// KernelMemory specifies the kernel memory limit (in bytes) for the container.
-	// Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes.
-	KernelMemory      int64     `json:",omitempty"`
-	KernelMemoryTCP   int64     `json:",omitempty"` // Hard limit for kernel TCP buffer memory (in bytes)
-	MemoryReservation int64     // Memory soft limit (in bytes)
-	MemorySwap        int64     // Total memory usage (memory + swap); set `-1` to enable unlimited swap
-	MemorySwappiness  *int64    // Tuning container memory swappiness behaviour
-	OomKillDisable    *bool     // Whether to disable OOM Killer or not
-	PidsLimit         *int64    // Setting PIDs limit for a container; Set `0` or `-1` for unlimited, or `null` to not change.
-	Ulimits           []*Ulimit // List of ulimits to be set in the container
-
-	// Applicable to Windows
-	CPUCount           int64  `json:"CpuCount"`   // CPU count
-	CPUPercent         int64  `json:"CpuPercent"` // CPU percent
-	IOMaximumIOps      uint64 // Maximum IOps for the container system drive
-	IOMaximumBandwidth uint64 // Maximum IO in bytes per second for the container system drive
-}
-
-// UpdateConfig holds the mutable attributes of a Container.
-// Those attributes can be updated at runtime.
-type UpdateConfig struct {
-	// Contains container's resources (cgroups, ulimits)
-	Resources
-	RestartPolicy RestartPolicy
-}
-
-// HostConfig the non-portable Config structure of a container.
-// Here, "non-portable" means "dependent of the host we are running on".
-// Portable information *should* appear in Config.
-type HostConfig struct {
-	// Applicable to all platforms
-	Binds           []string          // List of volume bindings for this container
-	ContainerIDFile string            // File (path) where the containerId is written
-	LogConfig       LogConfig         // Configuration of the logs for this container
-	NetworkMode     NetworkMode       // Network mode to use for the container
-	PortBindings    nat.PortMap       // Port mapping between the exposed port (container) and the host
-	RestartPolicy   RestartPolicy     // Restart policy to be used for the container
-	AutoRemove      bool              // Automatically remove container when it exits
-	VolumeDriver    string            // Name of the volume driver used to mount volumes
-	VolumesFrom     []string          // List of volumes to take from other container
-	ConsoleSize     [2]uint           // Initial console size (height,width)
-	Annotations     map[string]string `json:",omitempty"` // Arbitrary non-identifying metadata attached to container and provided to the runtime
-
-	// Applicable to UNIX platforms
-	CapAdd          strslice.StrSlice // List of kernel capabilities to add to the container
-	CapDrop         strslice.StrSlice // List of kernel capabilities to remove from the container
-	CgroupnsMode    CgroupnsMode      // Cgroup namespace mode to use for the container
-	DNS             []string          `json:"Dns"`        // List of DNS server to lookup
-	DNSOptions      []string          `json:"DnsOptions"` // List of DNSOption to look for
-	DNSSearch       []string          `json:"DnsSearch"`  // List of DNSSearch to look for
-	ExtraHosts      []string          // List of extra hosts
-	GroupAdd        []string          // List of additional groups that the container process will run as
-	IpcMode         IpcMode           // IPC namespace to use for the container
-	Cgroup          CgroupSpec        // Cgroup to use for the container
-	Links           []string          // List of links (in the name:alias form)
-	OomScoreAdj     int               // Container preference for OOM-killing
-	PidMode         PidMode           // PID namespace to use for the container
-	Privileged      bool              // Is the container in privileged mode
-	PublishAllPorts bool              // Should docker publish all exposed port for the container
-	ReadonlyRootfs  bool              // Is the container root filesystem in read-only
-	SecurityOpt     []string          // List of string values to customize labels for MLS systems, such as SELinux.
-	StorageOpt      map[string]string `json:",omitempty"` // Storage driver options per container.
-	Tmpfs           map[string]string `json:",omitempty"` // List of tmpfs (mounts) used for the container
-	UTSMode         UTSMode           // UTS namespace to use for the container
-	UsernsMode      UsernsMode        // The user namespace to use for the container
-	ShmSize         int64             // Total shm memory usage
-	Sysctls         map[string]string `json:",omitempty"` // List of Namespaced sysctls used for the container
-	Runtime         string            `json:",omitempty"` // Runtime to use with this container
-
-	// Applicable to Windows
-	Isolation Isolation // Isolation technology of the container (e.g. default, hyperv)
-
-	// Contains container's resources (cgroups, ulimits)
-	Resources
-
-	// Mounts specs used by the container
-	Mounts []mount.Mount `json:",omitempty"`
-
-	// MaskedPaths is the list of paths to be masked inside the container (this overrides the default set of paths)
-	MaskedPaths []string
-
-	// ReadonlyPaths is the list of paths to be set as read-only inside the container (this overrides the default set of paths)
-	ReadonlyPaths []string
-
-	// Run a custom init inside the container, if null, use the daemon's configured settings
-	Init *bool `json:",omitempty"`
-}
-
-// containerID splits "container:<ID|name>" values. It returns the container
-// ID or name, and whether an ID/name was found. It returns an empty string and
-// a "false" if the value does not have a "container:" prefix. Further validation
-// of the returned, including checking if the value is empty, should be handled
-// by the caller.
-func containerID(val string) (idOrName string, ok bool) {
-	k, v, hasSep := strings.Cut(val, ":")
-	if !hasSep || k != "container" {
-		return "", false
-	}
-	return v, true
-}
-
-// validContainer checks if the given value is a "container:" mode with
-// a non-empty name/ID.
-func validContainer(val string) bool {
-	id, ok := containerID(val)
-	return ok && id != ""
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go b/vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go
deleted file mode 100644
index cdee49ea3..000000000
--- a/vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go
+++ /dev/null
@@ -1,45 +0,0 @@
-//go:build !windows
-
-package container // import "github.com/docker/docker/api/types/container"
-
-import "github.com/docker/docker/api/types/network"
-
-// IsValid indicates if an isolation technology is valid
-func (i Isolation) IsValid() bool {
-	return i.IsDefault()
-}
-
-// IsBridge indicates whether container uses the bridge network stack
-func (n NetworkMode) IsBridge() bool {
-	return n == network.NetworkBridge
-}
-
-// IsHost indicates whether container uses the host network stack.
-func (n NetworkMode) IsHost() bool {
-	return n == network.NetworkHost
-}
-
-// IsUserDefined indicates user-created network
-func (n NetworkMode) IsUserDefined() bool {
-	return !n.IsDefault() && !n.IsBridge() && !n.IsHost() && !n.IsNone() && !n.IsContainer()
-}
-
-// NetworkName returns the name of the network stack.
-func (n NetworkMode) NetworkName() string {
-	switch {
-	case n.IsDefault():
-		return network.NetworkDefault
-	case n.IsBridge():
-		return network.NetworkBridge
-	case n.IsHost():
-		return network.NetworkHost
-	case n.IsNone():
-		return network.NetworkNone
-	case n.IsContainer():
-		return "container"
-	case n.IsUserDefined():
-		return n.UserDefined()
-	default:
-		return ""
-	}
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go b/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go
deleted file mode 100644
index f08545542..000000000
--- a/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package container // import "github.com/docker/docker/api/types/container"
-
-import "github.com/docker/docker/api/types/network"
-
-// IsValid indicates if an isolation technology is valid
-func (i Isolation) IsValid() bool {
-	return i.IsDefault() || i.IsHyperV() || i.IsProcess()
-}
-
-// IsBridge indicates whether container uses the bridge network stack
-// in windows it is given the name NAT
-func (n NetworkMode) IsBridge() bool {
-	return n == network.NetworkNat
-}
-
-// IsHost indicates whether container uses the host network stack.
-// returns false as this is not supported by windows
-func (n NetworkMode) IsHost() bool {
-	return false
-}
-
-// IsUserDefined indicates user-created network
-func (n NetworkMode) IsUserDefined() bool {
-	return !n.IsDefault() && !n.IsNone() && !n.IsBridge() && !n.IsContainer()
-}
-
-// NetworkName returns the name of the network stack.
-func (n NetworkMode) NetworkName() string {
-	switch {
-	case n.IsDefault():
-		return network.NetworkDefault
-	case n.IsBridge():
-		return network.NetworkNat
-	case n.IsHost():
-		// Windows currently doesn't support host network-mode, so
-		// this would currently never happen..
-		return network.NetworkHost
-	case n.IsNone():
-		return network.NetworkNone
-	case n.IsContainer():
-		return "container"
-	case n.IsUserDefined():
-		return n.UserDefined()
-	default:
-		return ""
-	}
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/options.go b/vendor/github.com/docker/docker/api/types/container/options.go
deleted file mode 100644
index 7a2300576..000000000
--- a/vendor/github.com/docker/docker/api/types/container/options.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package container
-
-import "github.com/docker/docker/api/types/filters"
-
-// ResizeOptions holds parameters to resize a TTY.
-// It can be used to resize container TTYs and
-// exec process TTYs too.
-type ResizeOptions struct {
-	Height uint
-	Width  uint
-}
-
-// AttachOptions holds parameters to attach to a container.
-type AttachOptions struct {
-	Stream     bool
-	Stdin      bool
-	Stdout     bool
-	Stderr     bool
-	DetachKeys string
-	Logs       bool
-}
-
-// CommitOptions holds parameters to commit changes into a container.
-type CommitOptions struct {
-	Reference string
-	Comment   string
-	Author    string
-	Changes   []string
-	Pause     bool
-	Config    *Config
-}
-
-// RemoveOptions holds parameters to remove containers.
-type RemoveOptions struct {
-	RemoveVolumes bool
-	RemoveLinks   bool
-	Force         bool
-}
-
-// StartOptions holds parameters to start containers.
-type StartOptions struct {
-	CheckpointID  string
-	CheckpointDir string
-}
-
-// ListOptions holds parameters to list containers with.
-type ListOptions struct {
-	Size    bool
-	All     bool
-	Latest  bool
-	Since   string
-	Before  string
-	Limit   int
-	Filters filters.Args
-}
-
-// LogsOptions holds parameters to filter logs with.
-type LogsOptions struct {
-	ShowStdout bool
-	ShowStderr bool
-	Since      string
-	Until      string
-	Timestamps bool
-	Follow     bool
-	Tail       string
-	Details    bool
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/stats.go b/vendor/github.com/docker/docker/api/types/container/stats.go
deleted file mode 100644
index 3b3fb131a..000000000
--- a/vendor/github.com/docker/docker/api/types/container/stats.go
+++ /dev/null
@@ -1,181 +0,0 @@
-package container
-
-import "time"
-
-// ThrottlingData stores CPU throttling stats of one running container.
-// Not used on Windows.
-type ThrottlingData struct {
-	// Number of periods with throttling active
-	Periods uint64 `json:"periods"`
-	// Number of periods when the container hits its throttling limit.
-	ThrottledPeriods uint64 `json:"throttled_periods"`
-	// Aggregate time the container was throttled for in nanoseconds.
-	ThrottledTime uint64 `json:"throttled_time"`
-}
-
-// CPUUsage stores All CPU stats aggregated since container inception.
-type CPUUsage struct {
-	// Total CPU time consumed.
-	// Units: nanoseconds (Linux)
-	// Units: 100's of nanoseconds (Windows)
-	TotalUsage uint64 `json:"total_usage"`
-
-	// Total CPU time consumed per core (Linux). Not used on Windows.
-	// Units: nanoseconds.
-	PercpuUsage []uint64 `json:"percpu_usage,omitempty"`
-
-	// Time spent by tasks of the cgroup in kernel mode (Linux).
-	// Time spent by all container processes in kernel mode (Windows).
-	// Units: nanoseconds (Linux).
-	// Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers.
-	UsageInKernelmode uint64 `json:"usage_in_kernelmode"`
-
-	// Time spent by tasks of the cgroup in user mode (Linux).
-	// Time spent by all container processes in user mode (Windows).
-	// Units: nanoseconds (Linux).
-	// Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers
-	UsageInUsermode uint64 `json:"usage_in_usermode"`
-}
-
-// CPUStats aggregates and wraps all CPU related info of container
-type CPUStats struct {
-	// CPU Usage. Linux and Windows.
-	CPUUsage CPUUsage `json:"cpu_usage"`
-
-	// System Usage. Linux only.
-	SystemUsage uint64 `json:"system_cpu_usage,omitempty"`
-
-	// Online CPUs. Linux only.
-	OnlineCPUs uint32 `json:"online_cpus,omitempty"`
-
-	// Throttling Data. Linux only.
-	ThrottlingData ThrottlingData `json:"throttling_data,omitempty"`
-}
-
-// MemoryStats aggregates all memory stats since container inception on Linux.
-// Windows returns stats for commit and private working set only.
-type MemoryStats struct {
-	// Linux Memory Stats
-
-	// current res_counter usage for memory
-	Usage uint64 `json:"usage,omitempty"`
-	// maximum usage ever recorded.
-	MaxUsage uint64 `json:"max_usage,omitempty"`
-	// TODO(vishh): Export these as stronger types.
-	// all the stats exported via memory.stat.
-	Stats map[string]uint64 `json:"stats,omitempty"`
-	// number of times memory usage hits limits.
-	Failcnt uint64 `json:"failcnt,omitempty"`
-	Limit   uint64 `json:"limit,omitempty"`
-
-	// Windows Memory Stats
-	// See https://technet.microsoft.com/en-us/magazine/ff382715.aspx
-
-	// committed bytes
-	Commit uint64 `json:"commitbytes,omitempty"`
-	// peak committed bytes
-	CommitPeak uint64 `json:"commitpeakbytes,omitempty"`
-	// private working set
-	PrivateWorkingSet uint64 `json:"privateworkingset,omitempty"`
-}
-
-// BlkioStatEntry is one small entity to store a piece of Blkio stats
-// Not used on Windows.
-type BlkioStatEntry struct {
-	Major uint64 `json:"major"`
-	Minor uint64 `json:"minor"`
-	Op    string `json:"op"`
-	Value uint64 `json:"value"`
-}
-
-// BlkioStats stores All IO service stats for data read and write.
-// This is a Linux specific structure as the differences between expressing
-// block I/O on Windows and Linux are sufficiently significant to make
-// little sense attempting to morph into a combined structure.
-type BlkioStats struct {
-	// number of bytes transferred to and from the block device
-	IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive"`
-	IoServicedRecursive     []BlkioStatEntry `json:"io_serviced_recursive"`
-	IoQueuedRecursive       []BlkioStatEntry `json:"io_queue_recursive"`
-	IoServiceTimeRecursive  []BlkioStatEntry `json:"io_service_time_recursive"`
-	IoWaitTimeRecursive     []BlkioStatEntry `json:"io_wait_time_recursive"`
-	IoMergedRecursive       []BlkioStatEntry `json:"io_merged_recursive"`
-	IoTimeRecursive         []BlkioStatEntry `json:"io_time_recursive"`
-	SectorsRecursive        []BlkioStatEntry `json:"sectors_recursive"`
-}
-
-// StorageStats is the disk I/O stats for read/write on Windows.
-type StorageStats struct {
-	ReadCountNormalized  uint64 `json:"read_count_normalized,omitempty"`
-	ReadSizeBytes        uint64 `json:"read_size_bytes,omitempty"`
-	WriteCountNormalized uint64 `json:"write_count_normalized,omitempty"`
-	WriteSizeBytes       uint64 `json:"write_size_bytes,omitempty"`
-}
-
-// NetworkStats aggregates the network stats of one container
-type NetworkStats struct {
-	// Bytes received. Windows and Linux.
-	RxBytes uint64 `json:"rx_bytes"`
-	// Packets received. Windows and Linux.
-	RxPackets uint64 `json:"rx_packets"`
-	// Received errors. Not used on Windows. Note that we don't `omitempty` this
-	// field as it is expected in the >=v1.21 API stats structure.
-	RxErrors uint64 `json:"rx_errors"`
-	// Incoming packets dropped. Windows and Linux.
-	RxDropped uint64 `json:"rx_dropped"`
-	// Bytes sent. Windows and Linux.
-	TxBytes uint64 `json:"tx_bytes"`
-	// Packets sent. Windows and Linux.
-	TxPackets uint64 `json:"tx_packets"`
-	// Sent errors. Not used on Windows. Note that we don't `omitempty` this
-	// field as it is expected in the >=v1.21 API stats structure.
-	TxErrors uint64 `json:"tx_errors"`
-	// Outgoing packets dropped. Windows and Linux.
-	TxDropped uint64 `json:"tx_dropped"`
-	// Endpoint ID. Not used on Linux.
-	EndpointID string `json:"endpoint_id,omitempty"`
-	// Instance ID. Not used on Linux.
-	InstanceID string `json:"instance_id,omitempty"`
-}
-
-// PidsStats contains the stats of a container's pids
-type PidsStats struct {
-	// Current is the number of pids in the cgroup
-	Current uint64 `json:"current,omitempty"`
-	// Limit is the hard limit on the number of pids in the cgroup.
-	// A "Limit" of 0 means that there is no limit.
-	Limit uint64 `json:"limit,omitempty"`
-}
-
-// Stats is Ultimate struct aggregating all types of stats of one container
-type Stats struct {
-	// Common stats
-	Read    time.Time `json:"read"`
-	PreRead time.Time `json:"preread"`
-
-	// Linux specific stats, not populated on Windows.
-	PidsStats  PidsStats  `json:"pids_stats,omitempty"`
-	BlkioStats BlkioStats `json:"blkio_stats,omitempty"`
-
-	// Windows specific stats, not populated on Linux.
-	NumProcs     uint32       `json:"num_procs"`
-	StorageStats StorageStats `json:"storage_stats,omitempty"`
-
-	// Shared stats
-	CPUStats    CPUStats    `json:"cpu_stats,omitempty"`
-	PreCPUStats CPUStats    `json:"precpu_stats,omitempty"` // "Pre"="Previous"
-	MemoryStats MemoryStats `json:"memory_stats,omitempty"`
-}
-
-// StatsResponse is newly used Networks.
-//
-// TODO(thaJeztah): unify with [Stats]. This wrapper was to account for pre-api v1.21 changes, see https://github.com/moby/moby/commit/d3379946ec96fb6163cb8c4517d7d5a067045801
-type StatsResponse struct {
-	Stats
-
-	Name string `json:"name,omitempty"`
-	ID   string `json:"id,omitempty"`
-
-	// Networks request version >=1.21
-	Networks map[string]NetworkStats `json:"networks,omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/wait_exit_error.go b/vendor/github.com/docker/docker/api/types/container/wait_exit_error.go
deleted file mode 100644
index ab56d4eed..000000000
--- a/vendor/github.com/docker/docker/api/types/container/wait_exit_error.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package container
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// WaitExitError container waiting error, if any
-// swagger:model WaitExitError
-type WaitExitError struct {
-
-	// Details of an error
-	Message string `json:"Message,omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/wait_response.go b/vendor/github.com/docker/docker/api/types/container/wait_response.go
deleted file mode 100644
index 84fc6afdd..000000000
--- a/vendor/github.com/docker/docker/api/types/container/wait_response.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package container
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// WaitResponse ContainerWaitResponse
-//
-// OK response to ContainerWait operation
-// swagger:model WaitResponse
-type WaitResponse struct {
-
-	// error
-	Error *WaitExitError `json:"Error,omitempty"`
-
-	// Exit code of the container
-	// Required: true
-	StatusCode int64 `json:"StatusCode"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/container/waitcondition.go b/vendor/github.com/docker/docker/api/types/container/waitcondition.go
deleted file mode 100644
index cd8311f99..000000000
--- a/vendor/github.com/docker/docker/api/types/container/waitcondition.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package container // import "github.com/docker/docker/api/types/container"
-
-// WaitCondition is a type used to specify a container state for which
-// to wait.
-type WaitCondition string
-
-// Possible WaitCondition Values.
-//
-// WaitConditionNotRunning (default) is used to wait for any of the non-running
-// states: "created", "exited", "dead", "removing", or "removed".
-//
-// WaitConditionNextExit is used to wait for the next time the state changes
-// to a non-running state. If the state is currently "created" or "exited",
-// this would cause Wait() to block until either the container runs and exits
-// or is removed.
-//
-// WaitConditionRemoved is used to wait for the container to be removed.
-const (
-	WaitConditionNotRunning WaitCondition = "not-running"
-	WaitConditionNextExit   WaitCondition = "next-exit"
-	WaitConditionRemoved    WaitCondition = "removed"
-)
diff --git a/vendor/github.com/docker/docker/api/types/error_response.go b/vendor/github.com/docker/docker/api/types/error_response.go
deleted file mode 100644
index dc942d9d9..000000000
--- a/vendor/github.com/docker/docker/api/types/error_response.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package types
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// ErrorResponse Represents an error.
-// swagger:model ErrorResponse
-type ErrorResponse struct {
-
-	// The error message.
-	// Required: true
-	Message string `json:"message"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/error_response_ext.go b/vendor/github.com/docker/docker/api/types/error_response_ext.go
deleted file mode 100644
index f84f034cd..000000000
--- a/vendor/github.com/docker/docker/api/types/error_response_ext.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package types
-
-// Error returns the error message
-func (e ErrorResponse) Error() string {
-	return e.Message
-}
diff --git a/vendor/github.com/docker/docker/api/types/events/events.go b/vendor/github.com/docker/docker/api/types/events/events.go
deleted file mode 100644
index e225df4ec..000000000
--- a/vendor/github.com/docker/docker/api/types/events/events.go
+++ /dev/null
@@ -1,135 +0,0 @@
-package events // import "github.com/docker/docker/api/types/events"
-import "github.com/docker/docker/api/types/filters"
-
-// Type is used for event-types.
-type Type string
-
-// List of known event types.
-const (
-	BuilderEventType   Type = "builder"   // BuilderEventType is the event type that the builder generates.
-	ConfigEventType    Type = "config"    // ConfigEventType is the event type that configs generate.
-	ContainerEventType Type = "container" // ContainerEventType is the event type that containers generate.
-	DaemonEventType    Type = "daemon"    // DaemonEventType is the event type that daemon generate.
-	ImageEventType     Type = "image"     // ImageEventType is the event type that images generate.
-	NetworkEventType   Type = "network"   // NetworkEventType is the event type that networks generate.
-	NodeEventType      Type = "node"      // NodeEventType is the event type that nodes generate.
-	PluginEventType    Type = "plugin"    // PluginEventType is the event type that plugins generate.
-	SecretEventType    Type = "secret"    // SecretEventType is the event type that secrets generate.
-	ServiceEventType   Type = "service"   // ServiceEventType is the event type that services generate.
-	VolumeEventType    Type = "volume"    // VolumeEventType is the event type that volumes generate.
-)
-
-// Action is used for event-actions.
-type Action string
-
-const (
-	ActionCreate       Action = "create"
-	ActionStart        Action = "start"
-	ActionRestart      Action = "restart"
-	ActionStop         Action = "stop"
-	ActionCheckpoint   Action = "checkpoint"
-	ActionPause        Action = "pause"
-	ActionUnPause      Action = "unpause"
-	ActionAttach       Action = "attach"
-	ActionDetach       Action = "detach"
-	ActionResize       Action = "resize"
-	ActionUpdate       Action = "update"
-	ActionRename       Action = "rename"
-	ActionKill         Action = "kill"
-	ActionDie          Action = "die"
-	ActionOOM          Action = "oom"
-	ActionDestroy      Action = "destroy"
-	ActionRemove       Action = "remove"
-	ActionCommit       Action = "commit"
-	ActionTop          Action = "top"
-	ActionCopy         Action = "copy"
-	ActionArchivePath  Action = "archive-path"
-	ActionExtractToDir Action = "extract-to-dir"
-	ActionExport       Action = "export"
-	ActionImport       Action = "import"
-	ActionSave         Action = "save"
-	ActionLoad         Action = "load"
-	ActionTag          Action = "tag"
-	ActionUnTag        Action = "untag"
-	ActionPush         Action = "push"
-	ActionPull         Action = "pull"
-	ActionPrune        Action = "prune"
-	ActionDelete       Action = "delete"
-	ActionEnable       Action = "enable"
-	ActionDisable      Action = "disable"
-	ActionConnect      Action = "connect"
-	ActionDisconnect   Action = "disconnect"
-	ActionReload       Action = "reload"
-	ActionMount        Action = "mount"
-	ActionUnmount      Action = "unmount"
-
-	// ActionExecCreate is the prefix used for exec_create events. These
-	// event-actions are commonly followed by a colon and space (": "),
-	// and the command that's defined for the exec, for example:
-	//
-	//	exec_create: /bin/sh -c 'echo hello'
-	//
-	// This is far from ideal; it's a compromise to allow filtering and
-	// to preserve backward-compatibility.
-	ActionExecCreate Action = "exec_create"
-	// ActionExecStart is the prefix used for exec_create events. These
-	// event-actions are commonly followed by a colon and space (": "),
-	// and the command that's defined for the exec, for example:
-	//
-	//	exec_start: /bin/sh -c 'echo hello'
-	//
-	// This is far from ideal; it's a compromise to allow filtering and
-	// to preserve backward-compatibility.
-	ActionExecStart  Action = "exec_start"
-	ActionExecDie    Action = "exec_die"
-	ActionExecDetach Action = "exec_detach"
-
-	// ActionHealthStatus is the prefix to use for health_status events.
-	//
-	// Health-status events can either have a pre-defined status, in which
-	// case the "health_status" action is followed by a colon, or can be
-	// "free-form", in which case they're followed by the output of the
-	// health-check output.
-	//
-	// This is far form ideal, and a compromise to allow filtering, and
-	// to preserve backward-compatibility.
-	ActionHealthStatus          Action = "health_status"
-	ActionHealthStatusRunning   Action = "health_status: running"
-	ActionHealthStatusHealthy   Action = "health_status: healthy"
-	ActionHealthStatusUnhealthy Action = "health_status: unhealthy"
-)
-
-// Actor describes something that generates events,
-// like a container, or a network, or a volume.
-// It has a defined name and a set of attributes.
-// The container attributes are its labels, other actors
-// can generate these attributes from other properties.
-type Actor struct {
-	ID         string
-	Attributes map[string]string
-}
-
-// Message represents the information an event contains
-type Message struct {
-	// Deprecated information from JSONMessage.
-	// With data only in container events.
-	Status string `json:"status,omitempty"` // Deprecated: use Action instead.
-	ID     string `json:"id,omitempty"`     // Deprecated: use Actor.ID instead.
-	From   string `json:"from,omitempty"`   // Deprecated: use Actor.Attributes["image"] instead.
-
-	Type   Type
-	Action Action
-	Actor  Actor
-	// Engine events are local scope. Cluster events are swarm scope.
-	Scope string `json:"scope,omitempty"`
-
-	Time     int64 `json:"time,omitempty"`
-	TimeNano int64 `json:"timeNano,omitempty"`
-}
-
-// ListOptions holds parameters to filter events with.
-type ListOptions struct {
-	Since   string
-	Until   string
-	Filters filters.Args
-}
diff --git a/vendor/github.com/docker/docker/api/types/filters/errors.go b/vendor/github.com/docker/docker/api/types/filters/errors.go
deleted file mode 100644
index f52f69440..000000000
--- a/vendor/github.com/docker/docker/api/types/filters/errors.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package filters
-
-import "fmt"
-
-// invalidFilter indicates that the provided filter or its value is invalid
-type invalidFilter struct {
-	Filter string
-	Value  []string
-}
-
-func (e invalidFilter) Error() string {
-	msg := "invalid filter"
-	if e.Filter != "" {
-		msg += " '" + e.Filter
-		if e.Value != nil {
-			msg = fmt.Sprintf("%s=%s", msg, e.Value)
-		}
-		msg += "'"
-	}
-	return msg
-}
-
-// InvalidParameter marks this error as ErrInvalidParameter
-func (e invalidFilter) InvalidParameter() {}
-
-// unreachableCode is an error indicating that the code path was not expected to be reached.
-type unreachableCode struct {
-	Filter string
-	Value  []string
-}
-
-// System marks this error as ErrSystem
-func (e unreachableCode) System() {}
-
-func (e unreachableCode) Error() string {
-	return fmt.Sprintf("unreachable code reached for filter: %q with values: %s", e.Filter, e.Value)
-}
diff --git a/vendor/github.com/docker/docker/api/types/filters/parse.go b/vendor/github.com/docker/docker/api/types/filters/parse.go
deleted file mode 100644
index 0914b2a44..000000000
--- a/vendor/github.com/docker/docker/api/types/filters/parse.go
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
-Package filters provides tools for encoding a mapping of keys to a set of
-multiple values.
-*/
-package filters // import "github.com/docker/docker/api/types/filters"
-
-import (
-	"encoding/json"
-	"regexp"
-	"strings"
-
-	"github.com/docker/docker/api/types/versions"
-)
-
-// Args stores a mapping of keys to a set of multiple values.
-type Args struct {
-	fields map[string]map[string]bool
-}
-
-// KeyValuePair are used to initialize a new Args
-type KeyValuePair struct {
-	Key   string
-	Value string
-}
-
-// Arg creates a new KeyValuePair for initializing Args
-func Arg(key, value string) KeyValuePair {
-	return KeyValuePair{Key: key, Value: value}
-}
-
-// NewArgs returns a new Args populated with the initial args
-func NewArgs(initialArgs ...KeyValuePair) Args {
-	args := Args{fields: map[string]map[string]bool{}}
-	for _, arg := range initialArgs {
-		args.Add(arg.Key, arg.Value)
-	}
-	return args
-}
-
-// Keys returns all the keys in list of Args
-func (args Args) Keys() []string {
-	keys := make([]string, 0, len(args.fields))
-	for k := range args.fields {
-		keys = append(keys, k)
-	}
-	return keys
-}
-
-// MarshalJSON returns a JSON byte representation of the Args
-func (args Args) MarshalJSON() ([]byte, error) {
-	if len(args.fields) == 0 {
-		return []byte("{}"), nil
-	}
-	return json.Marshal(args.fields)
-}
-
-// ToJSON returns the Args as a JSON encoded string
-func ToJSON(a Args) (string, error) {
-	if a.Len() == 0 {
-		return "", nil
-	}
-	buf, err := json.Marshal(a)
-	return string(buf), err
-}
-
-// ToParamWithVersion encodes Args as a JSON string. If version is less than 1.22
-// then the encoded format will use an older legacy format where the values are a
-// list of strings, instead of a set.
-//
-// Deprecated: do not use in any new code; use ToJSON instead
-func ToParamWithVersion(version string, a Args) (string, error) {
-	if a.Len() == 0 {
-		return "", nil
-	}
-
-	if version != "" && versions.LessThan(version, "1.22") {
-		buf, err := json.Marshal(convertArgsToSlice(a.fields))
-		return string(buf), err
-	}
-
-	return ToJSON(a)
-}
-
-// FromJSON decodes a JSON encoded string into Args
-func FromJSON(p string) (Args, error) {
-	args := NewArgs()
-
-	if p == "" {
-		return args, nil
-	}
-
-	raw := []byte(p)
-	err := json.Unmarshal(raw, &args)
-	if err == nil {
-		return args, nil
-	}
-
-	// Fallback to parsing arguments in the legacy slice format
-	deprecated := map[string][]string{}
-	if legacyErr := json.Unmarshal(raw, &deprecated); legacyErr != nil {
-		return args, &invalidFilter{}
-	}
-
-	args.fields = deprecatedArgs(deprecated)
-	return args, nil
-}
-
-// UnmarshalJSON populates the Args from JSON encode bytes
-func (args Args) UnmarshalJSON(raw []byte) error {
-	return json.Unmarshal(raw, &args.fields)
-}
-
-// Get returns the list of values associated with the key
-func (args Args) Get(key string) []string {
-	values := args.fields[key]
-	if values == nil {
-		return make([]string, 0)
-	}
-	slice := make([]string, 0, len(values))
-	for key := range values {
-		slice = append(slice, key)
-	}
-	return slice
-}
-
-// Add a new value to the set of values
-func (args Args) Add(key, value string) {
-	if _, ok := args.fields[key]; ok {
-		args.fields[key][value] = true
-	} else {
-		args.fields[key] = map[string]bool{value: true}
-	}
-}
-
-// Del removes a value from the set
-func (args Args) Del(key, value string) {
-	if _, ok := args.fields[key]; ok {
-		delete(args.fields[key], value)
-		if len(args.fields[key]) == 0 {
-			delete(args.fields, key)
-		}
-	}
-}
-
-// Len returns the number of keys in the mapping
-func (args Args) Len() int {
-	return len(args.fields)
-}
-
-// MatchKVList returns true if all the pairs in sources exist as key=value
-// pairs in the mapping at key, or if there are no values at key.
-func (args Args) MatchKVList(key string, sources map[string]string) bool {
-	fieldValues := args.fields[key]
-
-	// do not filter if there is no filter set or cannot determine filter
-	if len(fieldValues) == 0 {
-		return true
-	}
-
-	if len(sources) == 0 {
-		return false
-	}
-
-	for value := range fieldValues {
-		testK, testV, hasValue := strings.Cut(value, "=")
-
-		v, ok := sources[testK]
-		if !ok {
-			return false
-		}
-		if hasValue && testV != v {
-			return false
-		}
-	}
-
-	return true
-}
-
-// Match returns true if any of the values at key match the source string
-func (args Args) Match(field, source string) bool {
-	if args.ExactMatch(field, source) {
-		return true
-	}
-
-	fieldValues := args.fields[field]
-	for name2match := range fieldValues {
-		match, err := regexp.MatchString(name2match, source)
-		if err != nil {
-			continue
-		}
-		if match {
-			return true
-		}
-	}
-	return false
-}
-
-// GetBoolOrDefault returns a boolean value of the key if the key is present
-// and is interpretable as a boolean value. Otherwise the default value is returned.
-// Error is not nil only if the filter values are not valid boolean or are conflicting.
-func (args Args) GetBoolOrDefault(key string, defaultValue bool) (bool, error) {
-	fieldValues, ok := args.fields[key]
-
-	if !ok {
-		return defaultValue, nil
-	}
-
-	if len(fieldValues) == 0 {
-		return defaultValue, &invalidFilter{key, nil}
-	}
-
-	isFalse := fieldValues["0"] || fieldValues["false"]
-	isTrue := fieldValues["1"] || fieldValues["true"]
-
-	conflicting := isFalse && isTrue
-	invalid := !isFalse && !isTrue
-
-	if conflicting || invalid {
-		return defaultValue, &invalidFilter{key, args.Get(key)}
-	} else if isFalse {
-		return false, nil
-	} else if isTrue {
-		return true, nil
-	}
-
-	// This code shouldn't be reached.
-	return defaultValue, &unreachableCode{Filter: key, Value: args.Get(key)}
-}
-
-// ExactMatch returns true if the source matches exactly one of the values.
-func (args Args) ExactMatch(key, source string) bool {
-	fieldValues, ok := args.fields[key]
-	// do not filter if there is no filter set or cannot determine filter
-	if !ok || len(fieldValues) == 0 {
-		return true
-	}
-
-	// try to match full name value to avoid O(N) regular expression matching
-	return fieldValues[source]
-}
-
-// UniqueExactMatch returns true if there is only one value and the source
-// matches exactly the value.
-func (args Args) UniqueExactMatch(key, source string) bool {
-	fieldValues := args.fields[key]
-	// do not filter if there is no filter set or cannot determine filter
-	if len(fieldValues) == 0 {
-		return true
-	}
-	if len(args.fields[key]) != 1 {
-		return false
-	}
-
-	// try to match full name value to avoid O(N) regular expression matching
-	return fieldValues[source]
-}
-
-// FuzzyMatch returns true if the source matches exactly one value,  or the
-// source has one of the values as a prefix.
-func (args Args) FuzzyMatch(key, source string) bool {
-	if args.ExactMatch(key, source) {
-		return true
-	}
-
-	fieldValues := args.fields[key]
-	for prefix := range fieldValues {
-		if strings.HasPrefix(source, prefix) {
-			return true
-		}
-	}
-	return false
-}
-
-// Contains returns true if the key exists in the mapping
-func (args Args) Contains(field string) bool {
-	_, ok := args.fields[field]
-	return ok
-}
-
-// Validate compared the set of accepted keys against the keys in the mapping.
-// An error is returned if any mapping keys are not in the accepted set.
-func (args Args) Validate(accepted map[string]bool) error {
-	for name := range args.fields {
-		if !accepted[name] {
-			return &invalidFilter{name, nil}
-		}
-	}
-	return nil
-}
-
-// WalkValues iterates over the list of values for a key in the mapping and calls
-// op() for each value. If op returns an error the iteration stops and the
-// error is returned.
-func (args Args) WalkValues(field string, op func(value string) error) error {
-	if _, ok := args.fields[field]; !ok {
-		return nil
-	}
-	for v := range args.fields[field] {
-		if err := op(v); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// Clone returns a copy of args.
-func (args Args) Clone() (newArgs Args) {
-	newArgs.fields = make(map[string]map[string]bool, len(args.fields))
-	for k, m := range args.fields {
-		var mm map[string]bool
-		if m != nil {
-			mm = make(map[string]bool, len(m))
-			for kk, v := range m {
-				mm[kk] = v
-			}
-		}
-		newArgs.fields[k] = mm
-	}
-	return newArgs
-}
-
-func deprecatedArgs(d map[string][]string) map[string]map[string]bool {
-	m := map[string]map[string]bool{}
-	for k, v := range d {
-		values := map[string]bool{}
-		for _, vv := range v {
-			values[vv] = true
-		}
-		m[k] = values
-	}
-	return m
-}
-
-func convertArgsToSlice(f map[string]map[string]bool) map[string][]string {
-	m := map[string][]string{}
-	for k, v := range f {
-		values := []string{}
-		for kk := range v {
-			if v[kk] {
-				values = append(values, kk)
-			}
-		}
-		m[k] = values
-	}
-	return m
-}
diff --git a/vendor/github.com/docker/docker/api/types/graph_driver_data.go b/vendor/github.com/docker/docker/api/types/graph_driver_data.go
deleted file mode 100644
index ce3deb331..000000000
--- a/vendor/github.com/docker/docker/api/types/graph_driver_data.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package types
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// GraphDriverData Information about the storage driver used to store the container's and
-// image's filesystem.
-//
-// swagger:model GraphDriverData
-type GraphDriverData struct {
-
-	// Low-level storage metadata, provided as key/value pairs.
-	//
-	// This information is driver-specific, and depends on the storage-driver
-	// in use, and should be used for informational purposes only.
-	//
-	// Required: true
-	Data map[string]string `json:"Data"`
-
-	// Name of the storage driver.
-	// Required: true
-	Name string `json:"Name"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/id_response.go b/vendor/github.com/docker/docker/api/types/id_response.go
deleted file mode 100644
index 7592d2f8b..000000000
--- a/vendor/github.com/docker/docker/api/types/id_response.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package types
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// IDResponse Response to an API call that returns just an Id
-// swagger:model IdResponse
-type IDResponse struct {
-
-	// The id of the newly created object.
-	// Required: true
-	ID string `json:"Id"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/image/delete_response.go b/vendor/github.com/docker/docker/api/types/image/delete_response.go
deleted file mode 100644
index 998620dc6..000000000
--- a/vendor/github.com/docker/docker/api/types/image/delete_response.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package image
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// DeleteResponse delete response
-// swagger:model DeleteResponse
-type DeleteResponse struct {
-
-	// The image ID of an image that was deleted
-	Deleted string `json:"Deleted,omitempty"`
-
-	// The image ID of an image that was untagged
-	Untagged string `json:"Untagged,omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/image/image.go b/vendor/github.com/docker/docker/api/types/image/image.go
deleted file mode 100644
index abb7ffd80..000000000
--- a/vendor/github.com/docker/docker/api/types/image/image.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package image
-
-import (
-	"io"
-	"time"
-)
-
-// Metadata contains engine-local data about the image.
-type Metadata struct {
-	// LastTagTime is the date and time at which the image was last tagged.
-	LastTagTime time.Time `json:",omitempty"`
-}
-
-// PruneReport contains the response for Engine API:
-// POST "/images/prune"
-type PruneReport struct {
-	ImagesDeleted  []DeleteResponse
-	SpaceReclaimed uint64
-}
-
-// LoadResponse returns information to the client about a load process.
-//
-// TODO(thaJeztah): remove this type, and just use an io.ReadCloser
-//
-// This type was added in https://github.com/moby/moby/pull/18878, related
-// to https://github.com/moby/moby/issues/19177;
-//
-// Make docker load to output json when the response content type is json
-// Swarm hijacks the response from docker load and returns JSON rather
-// than plain text like the Engine does. This makes the API library to return
-// information to figure that out.
-//
-// However the "load" endpoint unconditionally returns JSON;
-// https://github.com/moby/moby/blob/7b9d2ef6e5518a3d3f3cc418459f8df786cfbbd1/api/server/router/image/image_routes.go#L248-L255
-//
-// PR https://github.com/moby/moby/pull/21959 made the response-type depend
-// on whether "quiet" was set, but this logic got changed in a follow-up
-// https://github.com/moby/moby/pull/25557, which made the JSON response-type
-// unconditionally, but the output produced depend on whether"quiet" was set.
-//
-// We should deprecated the "quiet" option, as it's really a client
-// responsibility.
-type LoadResponse struct {
-	// Body must be closed to avoid a resource leak
-	Body io.ReadCloser
-	JSON bool
-}
diff --git a/vendor/github.com/docker/docker/api/types/image/image_history.go b/vendor/github.com/docker/docker/api/types/image/image_history.go
deleted file mode 100644
index e302bb0ae..000000000
--- a/vendor/github.com/docker/docker/api/types/image/image_history.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package image // import "github.com/docker/docker/api/types/image"
-
-// ----------------------------------------------------------------------------
-// Code generated by `swagger generate operation`. DO NOT EDIT.
-//
-// See hack/generate-swagger-api.sh
-// ----------------------------------------------------------------------------
-
-// HistoryResponseItem individual image layer information in response to ImageHistory operation
-// swagger:model HistoryResponseItem
-type HistoryResponseItem struct {
-
-	// comment
-	// Required: true
-	Comment string `json:"Comment"`
-
-	// created
-	// Required: true
-	Created int64 `json:"Created"`
-
-	// created by
-	// Required: true
-	CreatedBy string `json:"CreatedBy"`
-
-	// Id
-	// Required: true
-	ID string `json:"Id"`
-
-	// size
-	// Required: true
-	Size int64 `json:"Size"`
-
-	// tags
-	// Required: true
-	Tags []string `json:"Tags"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/image/manifest.go b/vendor/github.com/docker/docker/api/types/image/manifest.go
deleted file mode 100644
index db8a00830..000000000
--- a/vendor/github.com/docker/docker/api/types/image/manifest.go
+++ /dev/null
@@ -1,99 +0,0 @@
-package image
-
-import (
-	"github.com/opencontainers/go-digest"
-	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
-)
-
-type ManifestKind string
-
-const (
-	ManifestKindImage       ManifestKind = "image"
-	ManifestKindAttestation ManifestKind = "attestation"
-	ManifestKindUnknown     ManifestKind = "unknown"
-)
-
-type ManifestSummary struct {
-	// ID is the content-addressable ID of an image and is the same as the
-	// digest of the image manifest.
-	//
-	// Required: true
-	ID string `json:"ID"`
-
-	// Descriptor is the OCI descriptor of the image.
-	//
-	// Required: true
-	Descriptor ocispec.Descriptor `json:"Descriptor"`
-
-	// Indicates whether all the child content (image config, layers) is
-	// fully available locally
-	//
-	// Required: true
-	Available bool `json:"Available"`
-
-	// Size is the size information of the content related to this manifest.
-	// Note: These sizes only take the locally available content into account.
-	//
-	// Required: true
-	Size struct {
-		// Content is the size (in bytes) of all the locally present
-		// content in the content store (e.g. image config, layers)
-		// referenced by this manifest and its children.
-		// This only includes blobs in the content store.
-		Content int64 `json:"Content"`
-
-		// Total is the total size (in bytes) of all the locally present
-		// data (both distributable and non-distributable) that's related to
-		// this manifest and its children.
-		// This equal to the sum of [Content] size AND all the sizes in the
-		// [Size] struct present in the Kind-specific data struct.
-		// For example, for an image kind (Kind == ManifestKindImage),
-		// this would include the size of the image content and unpacked
-		// image snapshots ([Size.Content] + [ImageData.Size.Unpacked]).
-		Total int64 `json:"Total"`
-	} `json:"Size"`
-
-	// Kind is the kind of the image manifest.
-	//
-	// Required: true
-	Kind ManifestKind `json:"Kind"`
-
-	// Fields below are specific to the kind of the image manifest.
-
-	// Present only if Kind == ManifestKindImage.
-	ImageData *ImageProperties `json:"ImageData,omitempty"`
-
-	// Present only if Kind == ManifestKindAttestation.
-	AttestationData *AttestationProperties `json:"AttestationData,omitempty"`
-}
-
-type ImageProperties struct {
-	// Platform is the OCI platform object describing the platform of the image.
-	//
-	// Required: true
-	Platform ocispec.Platform `json:"Platform"`
-
-	Size struct {
-		// Unpacked is the size (in bytes) of the locally unpacked
-		// (uncompressed) image content that's directly usable by the containers
-		// running this image.
-		// It's independent of the distributable content - e.g.
-		// the image might still have an unpacked data that's still used by
-		// some container even when the distributable/compressed content is
-		// already gone.
-		//
-		// Required: true
-		Unpacked int64 `json:"Unpacked"`
-	}
-
-	// Containers is an array containing the IDs of the containers that are
-	// using this image.
-	//
-	// Required: true
-	Containers []string `json:"Containers"`
-}
-
-type AttestationProperties struct {
-	// For is the digest of the image manifest that this attestation is for.
-	For digest.Digest `json:"For"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/image/opts.go b/vendor/github.com/docker/docker/api/types/image/opts.go
deleted file mode 100644
index 923ebe5a0..000000000
--- a/vendor/github.com/docker/docker/api/types/image/opts.go
+++ /dev/null
@@ -1,88 +0,0 @@
-package image
-
-import (
-	"context"
-	"io"
-
-	"github.com/docker/docker/api/types/filters"
-	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
-)
-
-// ImportSource holds source information for ImageImport
-type ImportSource struct {
-	Source     io.Reader // Source is the data to send to the server to create this image from. You must set SourceName to "-" to leverage this.
-	SourceName string    // SourceName is the name of the image to pull. Set to "-" to leverage the Source attribute.
-}
-
-// ImportOptions holds information to import images from the client host.
-type ImportOptions struct {
-	Tag      string   // Tag is the name to tag this image with. This attribute is deprecated.
-	Message  string   // Message is the message to tag the image with
-	Changes  []string // Changes are the raw changes to apply to this image
-	Platform string   // Platform is the target platform of the image
-}
-
-// CreateOptions holds information to create images.
-type CreateOptions struct {
-	RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry.
-	Platform     string // Platform is the target platform of the image if it needs to be pulled from the registry.
-}
-
-// PullOptions holds information to pull images.
-type PullOptions struct {
-	All          bool
-	RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
-
-	// PrivilegeFunc is a function that clients can supply to retry operations
-	// after getting an authorization error. This function returns the registry
-	// authentication header value in base64 encoded format, or an error if the
-	// privilege request fails.
-	//
-	// Also see [github.com/docker/docker/api/types.RequestPrivilegeFunc].
-	PrivilegeFunc func(context.Context) (string, error)
-	Platform      string
-}
-
-// PushOptions holds information to push images.
-type PushOptions struct {
-	All          bool
-	RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
-
-	// PrivilegeFunc is a function that clients can supply to retry operations
-	// after getting an authorization error. This function returns the registry
-	// authentication header value in base64 encoded format, or an error if the
-	// privilege request fails.
-	//
-	// Also see [github.com/docker/docker/api/types.RequestPrivilegeFunc].
-	PrivilegeFunc func(context.Context) (string, error)
-
-	// Platform is an optional field that selects a specific platform to push
-	// when the image is a multi-platform image.
-	// Using this will only push a single platform-specific manifest.
-	Platform *ocispec.Platform `json:",omitempty"`
-}
-
-// ListOptions holds parameters to list images with.
-type ListOptions struct {
-	// All controls whether all images in the graph are filtered, or just
-	// the heads.
-	All bool
-
-	// Filters is a JSON-encoded set of filter arguments.
-	Filters filters.Args
-
-	// SharedSize indicates whether the shared size of images should be computed.
-	SharedSize bool
-
-	// ContainerCount indicates whether container count should be computed.
-	ContainerCount bool
-
-	// Manifests indicates whether the image manifests should be returned.
-	Manifests bool
-}
-
-// RemoveOptions holds parameters to remove images.
-type RemoveOptions struct {
-	Force         bool
-	PruneChildren bool
-}
diff --git a/vendor/github.com/docker/docker/api/types/image/summary.go b/vendor/github.com/docker/docker/api/types/image/summary.go
deleted file mode 100644
index e87e216a2..000000000
--- a/vendor/github.com/docker/docker/api/types/image/summary.go
+++ /dev/null
@@ -1,92 +0,0 @@
-package image
-
-type Summary struct {
-
-	// Number of containers using this image. Includes both stopped and running
-	// containers.
-	//
-	// This size is not calculated by default, and depends on which API endpoint
-	// is used. `-1` indicates that the value has not been set / calculated.
-	//
-	// Required: true
-	Containers int64 `json:"Containers"`
-
-	// Date and time at which the image was created as a Unix timestamp
-	// (number of seconds since EPOCH).
-	//
-	// Required: true
-	Created int64 `json:"Created"`
-
-	// ID is the content-addressable ID of an image.
-	//
-	// This identifier is a content-addressable digest calculated from the
-	// image's configuration (which includes the digests of layers used by
-	// the image).
-	//
-	// Note that this digest differs from the `RepoDigests` below, which
-	// holds digests of image manifests that reference the image.
-	//
-	// Required: true
-	ID string `json:"Id"`
-
-	// User-defined key/value metadata.
-	// Required: true
-	Labels map[string]string `json:"Labels"`
-
-	// ID of the parent image.
-	//
-	// Depending on how the image was created, this field may be empty and
-	// is only set for images that were built/created locally. This field
-	// is empty if the image was pulled from an image registry.
-	//
-	// Required: true
-	ParentID string `json:"ParentId"`
-
-	// Manifests is a list of image manifests available in this image.  It
-	// provides a more detailed view of the platform-specific image manifests or
-	// other image-attached data like build attestations.
-	//
-	// WARNING: This is experimental and may change at any time without any backward
-	// compatibility.
-	Manifests []ManifestSummary `json:"Manifests,omitempty"`
-
-	// List of content-addressable digests of locally available image manifests
-	// that the image is referenced from. Multiple manifests can refer to the
-	// same image.
-	//
-	// These digests are usually only available if the image was either pulled
-	// from a registry, or if the image was pushed to a registry, which is when
-	// the manifest is generated and its digest calculated.
-	//
-	// Required: true
-	RepoDigests []string `json:"RepoDigests"`
-
-	// List of image names/tags in the local image cache that reference this
-	// image.
-	//
-	// Multiple image tags can refer to the same image, and this list may be
-	// empty if no tags reference the image, in which case the image is
-	// "untagged", in which case it can still be referenced by its ID.
-	//
-	// Required: true
-	RepoTags []string `json:"RepoTags"`
-
-	// Total size of image layers that are shared between this image and other
-	// images.
-	//
-	// This size is not calculated by default. `-1` indicates that the value
-	// has not been set / calculated.
-	//
-	// Required: true
-	SharedSize int64 `json:"SharedSize"`
-
-	// Total size of the image including all layers it is composed of.
-	//
-	// Required: true
-	Size int64 `json:"Size"`
-
-	// Total size of the image including all layers it is composed of.
-	//
-	// Deprecated: this field is omitted in API v1.44, but kept for backward compatibility. Use Size instead.
-	VirtualSize int64 `json:"VirtualSize,omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/mount/mount.go b/vendor/github.com/docker/docker/api/types/mount/mount.go
deleted file mode 100644
index c68dcf65b..000000000
--- a/vendor/github.com/docker/docker/api/types/mount/mount.go
+++ /dev/null
@@ -1,150 +0,0 @@
-package mount // import "github.com/docker/docker/api/types/mount"
-
-import (
-	"os"
-)
-
-// Type represents the type of a mount.
-type Type string
-
-// Type constants
-const (
-	// TypeBind is the type for mounting host dir
-	TypeBind Type = "bind"
-	// TypeVolume is the type for remote storage volumes
-	TypeVolume Type = "volume"
-	// TypeTmpfs is the type for mounting tmpfs
-	TypeTmpfs Type = "tmpfs"
-	// TypeNamedPipe is the type for mounting Windows named pipes
-	TypeNamedPipe Type = "npipe"
-	// TypeCluster is the type for Swarm Cluster Volumes.
-	TypeCluster Type = "cluster"
-)
-
-// Mount represents a mount (volume).
-type Mount struct {
-	Type Type `json:",omitempty"`
-	// Source specifies the name of the mount. Depending on mount type, this
-	// may be a volume name or a host path, or even ignored.
-	// Source is not supported for tmpfs (must be an empty value)
-	Source      string      `json:",omitempty"`
-	Target      string      `json:",omitempty"`
-	ReadOnly    bool        `json:",omitempty"` // attempts recursive read-only if possible
-	Consistency Consistency `json:",omitempty"`
-
-	BindOptions    *BindOptions    `json:",omitempty"`
-	VolumeOptions  *VolumeOptions  `json:",omitempty"`
-	TmpfsOptions   *TmpfsOptions   `json:",omitempty"`
-	ClusterOptions *ClusterOptions `json:",omitempty"`
-}
-
-// Propagation represents the propagation of a mount.
-type Propagation string
-
-const (
-	// PropagationRPrivate RPRIVATE
-	PropagationRPrivate Propagation = "rprivate"
-	// PropagationPrivate PRIVATE
-	PropagationPrivate Propagation = "private"
-	// PropagationRShared RSHARED
-	PropagationRShared Propagation = "rshared"
-	// PropagationShared SHARED
-	PropagationShared Propagation = "shared"
-	// PropagationRSlave RSLAVE
-	PropagationRSlave Propagation = "rslave"
-	// PropagationSlave SLAVE
-	PropagationSlave Propagation = "slave"
-)
-
-// Propagations is the list of all valid mount propagations
-var Propagations = []Propagation{
-	PropagationRPrivate,
-	PropagationPrivate,
-	PropagationRShared,
-	PropagationShared,
-	PropagationRSlave,
-	PropagationSlave,
-}
-
-// Consistency represents the consistency requirements of a mount.
-type Consistency string
-
-const (
-	// ConsistencyFull guarantees bind mount-like consistency
-	ConsistencyFull Consistency = "consistent"
-	// ConsistencyCached mounts can cache read data and FS structure
-	ConsistencyCached Consistency = "cached"
-	// ConsistencyDelegated mounts can cache read and written data and structure
-	ConsistencyDelegated Consistency = "delegated"
-	// ConsistencyDefault provides "consistent" behavior unless overridden
-	ConsistencyDefault Consistency = "default"
-)
-
-// BindOptions defines options specific to mounts of type "bind".
-type BindOptions struct {
-	Propagation      Propagation `json:",omitempty"`
-	NonRecursive     bool        `json:",omitempty"`
-	CreateMountpoint bool        `json:",omitempty"`
-	// ReadOnlyNonRecursive makes the mount non-recursively read-only, but still leaves the mount recursive
-	// (unless NonRecursive is set to true in conjunction).
-	ReadOnlyNonRecursive bool `json:",omitempty"`
-	// ReadOnlyForceRecursive raises an error if the mount cannot be made recursively read-only.
-	ReadOnlyForceRecursive bool `json:",omitempty"`
-}
-
-// VolumeOptions represents the options for a mount of type volume.
-type VolumeOptions struct {
-	NoCopy       bool              `json:",omitempty"`
-	Labels       map[string]string `json:",omitempty"`
-	Subpath      string            `json:",omitempty"`
-	DriverConfig *Driver           `json:",omitempty"`
-}
-
-// Driver represents a volume driver.
-type Driver struct {
-	Name    string            `json:",omitempty"`
-	Options map[string]string `json:",omitempty"`
-}
-
-// TmpfsOptions defines options specific to mounts of type "tmpfs".
-type TmpfsOptions struct {
-	// Size sets the size of the tmpfs, in bytes.
-	//
-	// This will be converted to an operating system specific value
-	// depending on the host. For example, on linux, it will be converted to
-	// use a 'k', 'm' or 'g' syntax. BSD, though not widely supported with
-	// docker, uses a straight byte value.
-	//
-	// Percentages are not supported.
-	SizeBytes int64 `json:",omitempty"`
-	// Mode of the tmpfs upon creation
-	Mode os.FileMode `json:",omitempty"`
-	// Options to be passed to the tmpfs mount. An array of arrays. Flag
-	// options should be provided as 1-length arrays. Other types should be
-	// provided as 2-length arrays, where the first item is the key and the
-	// second the value.
-	Options [][]string `json:",omitempty"`
-	// TODO(stevvooe): There are several more tmpfs flags, specified in the
-	// daemon, that are accepted. Only the most basic are added for now.
-	//
-	// From https://github.com/moby/sys/blob/mount/v0.1.1/mount/flags.go#L47-L56
-	//
-	// var validFlags = map[string]bool{
-	// 	"":          true,
-	// 	"size":      true, X
-	// 	"mode":      true, X
-	// 	"uid":       true,
-	// 	"gid":       true,
-	// 	"nr_inodes": true,
-	// 	"nr_blocks": true,
-	// 	"mpol":      true,
-	// }
-	//
-	// Some of these may be straightforward to add, but others, such as
-	// uid/gid have implications in a clustered system.
-}
-
-// ClusterOptions specifies options for a Cluster volume.
-type ClusterOptions struct {
-	// intentionally empty
-}
diff --git a/vendor/github.com/docker/docker/api/types/network/create_response.go b/vendor/github.com/docker/docker/api/types/network/create_response.go
deleted file mode 100644
index c32b35bff..000000000
--- a/vendor/github.com/docker/docker/api/types/network/create_response.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package network
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// CreateResponse NetworkCreateResponse
-//
-// OK response to NetworkCreate operation
-// swagger:model CreateResponse
-type CreateResponse struct {
-
-	// The ID of the created network.
-	// Required: true
-	ID string `json:"Id"`
-
-	// Warnings encountered when creating the container
-	// Required: true
-	Warning string `json:"Warning"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/network/endpoint.go b/vendor/github.com/docker/docker/api/types/network/endpoint.go
deleted file mode 100644
index 0fbb40b35..000000000
--- a/vendor/github.com/docker/docker/api/types/network/endpoint.go
+++ /dev/null
@@ -1,147 +0,0 @@
-package network
-
-import (
-	"errors"
-	"fmt"
-	"net"
-
-	"github.com/docker/docker/internal/multierror"
-)
-
-// EndpointSettings stores the network endpoint details
-type EndpointSettings struct {
-	// Configurations
-	IPAMConfig *EndpointIPAMConfig
-	Links      []string
-	Aliases    []string // Aliases holds the list of extra, user-specified DNS names for this endpoint.
-	// MacAddress may be used to specify a MAC address when the container is created.
-	// Once the container is running, it becomes operational data (it may contain a
-	// generated address).
-	MacAddress string
-	DriverOpts map[string]string
-	// Operational data
-	NetworkID           string
-	EndpointID          string
-	Gateway             string
-	IPAddress           string
-	IPPrefixLen         int
-	IPv6Gateway         string
-	GlobalIPv6Address   string
-	GlobalIPv6PrefixLen int
-	// DNSNames holds all the (non fully qualified) DNS names associated to this endpoint. First entry is used to
-	// generate PTR records.
-	DNSNames []string
-}
-
-// Copy makes a deep copy of `EndpointSettings`
-func (es *EndpointSettings) Copy() *EndpointSettings {
-	epCopy := *es
-	if es.IPAMConfig != nil {
-		epCopy.IPAMConfig = es.IPAMConfig.Copy()
-	}
-
-	if es.Links != nil {
-		links := make([]string, 0, len(es.Links))
-		epCopy.Links = append(links, es.Links...)
-	}
-
-	if es.Aliases != nil {
-		aliases := make([]string, 0, len(es.Aliases))
-		epCopy.Aliases = append(aliases, es.Aliases...)
-	}
-
-	if len(es.DNSNames) > 0 {
-		epCopy.DNSNames = make([]string, len(es.DNSNames))
-		copy(epCopy.DNSNames, es.DNSNames)
-	}
-
-	return &epCopy
-}
-
-// EndpointIPAMConfig represents IPAM configurations for the endpoint
-type EndpointIPAMConfig struct {
-	IPv4Address  string   `json:",omitempty"`
-	IPv6Address  string   `json:",omitempty"`
-	LinkLocalIPs []string `json:",omitempty"`
-}
-
-// Copy makes a copy of the endpoint ipam config
-func (cfg *EndpointIPAMConfig) Copy() *EndpointIPAMConfig {
-	cfgCopy := *cfg
-	cfgCopy.LinkLocalIPs = make([]string, 0, len(cfg.LinkLocalIPs))
-	cfgCopy.LinkLocalIPs = append(cfgCopy.LinkLocalIPs, cfg.LinkLocalIPs...)
-	return &cfgCopy
-}
-
-// NetworkSubnet describes a user-defined subnet for a specific network. It's only used to validate if an
-// EndpointIPAMConfig is valid for a specific network.
-type NetworkSubnet interface {
-	// Contains checks whether the NetworkSubnet contains [addr].
-	Contains(addr net.IP) bool
-	// IsStatic checks whether the subnet was statically allocated (ie. user-defined).
-	IsStatic() bool
-}
-
-// IsInRange checks whether static IP addresses are valid in a specific network.
-func (cfg *EndpointIPAMConfig) IsInRange(v4Subnets []NetworkSubnet, v6Subnets []NetworkSubnet) error {
-	var errs []error
-
-	if err := validateEndpointIPAddress(cfg.IPv4Address, v4Subnets); err != nil {
-		errs = append(errs, err)
-	}
-	if err := validateEndpointIPAddress(cfg.IPv6Address, v6Subnets); err != nil {
-		errs = append(errs, err)
-	}
-
-	return multierror.Join(errs...)
-}
-
-func validateEndpointIPAddress(epAddr string, ipamSubnets []NetworkSubnet) error {
-	if epAddr == "" {
-		return nil
-	}
-
-	var staticSubnet bool
-	parsedAddr := net.ParseIP(epAddr)
-	for _, subnet := range ipamSubnets {
-		if subnet.IsStatic() {
-			staticSubnet = true
-			if subnet.Contains(parsedAddr) {
-				return nil
-			}
-		}
-	}
-
-	if staticSubnet {
-		return fmt.Errorf("no configured subnet or ip-range contain the IP address %s", epAddr)
-	}
-
-	return errors.New("user specified IP address is supported only when connecting to networks with user configured subnets")
-}
-
-// Validate checks whether cfg is valid.
-func (cfg *EndpointIPAMConfig) Validate() error {
-	if cfg == nil {
-		return nil
-	}
-
-	var errs []error
-
-	if cfg.IPv4Address != "" {
-		if addr := net.ParseIP(cfg.IPv4Address); addr == nil || addr.To4() == nil || addr.IsUnspecified() {
-			errs = append(errs, fmt.Errorf("invalid IPv4 address: %s", cfg.IPv4Address))
-		}
-	}
-	if cfg.IPv6Address != "" {
-		if addr := net.ParseIP(cfg.IPv6Address); addr == nil || addr.To4() != nil || addr.IsUnspecified() {
-			errs = append(errs, fmt.Errorf("invalid IPv6 address: %s", cfg.IPv6Address))
-		}
-	}
-	for _, addr := range cfg.LinkLocalIPs {
-		if parsed := net.ParseIP(addr); parsed == nil || parsed.IsUnspecified() {
-			errs = append(errs, fmt.Errorf("invalid link-local IP address: %s", addr))
-		}
-	}
-
-	return multierror.Join(errs...)
-}
diff --git a/vendor/github.com/docker/docker/api/types/network/ipam.go b/vendor/github.com/docker/docker/api/types/network/ipam.go
deleted file mode 100644
index f319e1402..000000000
--- a/vendor/github.com/docker/docker/api/types/network/ipam.go
+++ /dev/null
@@ -1,134 +0,0 @@
-package network
-
-import (
-	"errors"
-	"fmt"
-	"net/netip"
-
-	"github.com/docker/docker/internal/multierror"
-)
-
-// IPAM represents IP Address Management
-type IPAM struct {
-	Driver  string
-	Options map[string]string // Per network IPAM driver options
-	Config  []IPAMConfig
-}
-
-// IPAMConfig represents IPAM configurations
-type IPAMConfig struct {
-	Subnet     string            `json:",omitempty"`
-	IPRange    string            `json:",omitempty"`
-	Gateway    string            `json:",omitempty"`
-	AuxAddress map[string]string `json:"AuxiliaryAddresses,omitempty"`
-}
-
-type ipFamily string
-
-const (
-	ip4 ipFamily = "IPv4"
-	ip6 ipFamily = "IPv6"
-)
-
-// ValidateIPAM checks whether the network's IPAM passed as argument is valid. It returns a joinError of the list of
-// errors found.
-func ValidateIPAM(ipam *IPAM, enableIPv6 bool) error {
-	if ipam == nil {
-		return nil
-	}
-
-	var errs []error
-	for _, cfg := range ipam.Config {
-		subnet, err := netip.ParsePrefix(cfg.Subnet)
-		if err != nil {
-			errs = append(errs, fmt.Errorf("invalid subnet %s: invalid CIDR block notation", cfg.Subnet))
-			continue
-		}
-		subnetFamily := ip4
-		if subnet.Addr().Is6() {
-			subnetFamily = ip6
-		}
-
-		if !enableIPv6 && subnetFamily == ip6 {
-			continue
-		}
-
-		if subnet != subnet.Masked() {
-			errs = append(errs, fmt.Errorf("invalid subnet %s: it should be %s", subnet, subnet.Masked()))
-		}
-
-		if ipRangeErrs := validateIPRange(cfg.IPRange, subnet, subnetFamily); len(ipRangeErrs) > 0 {
-			errs = append(errs, ipRangeErrs...)
-		}
-
-		if err := validateAddress(cfg.Gateway, subnet, subnetFamily); err != nil {
-			errs = append(errs, fmt.Errorf("invalid gateway %s: %w", cfg.Gateway, err))
-		}
-
-		for auxName, aux := range cfg.AuxAddress {
-			if err := validateAddress(aux, subnet, subnetFamily); err != nil {
-				errs = append(errs, fmt.Errorf("invalid auxiliary address %s: %w", auxName, err))
-			}
-		}
-	}
-
-	if err := multierror.Join(errs...); err != nil {
-		return fmt.Errorf("invalid network config:\n%w", err)
-	}
-
-	return nil
-}
-
-func validateIPRange(ipRange string, subnet netip.Prefix, subnetFamily ipFamily) []error {
-	if ipRange == "" {
-		return nil
-	}
-	prefix, err := netip.ParsePrefix(ipRange)
-	if err != nil {
-		return []error{fmt.Errorf("invalid ip-range %s: invalid CIDR block notation", ipRange)}
-	}
-	family := ip4
-	if prefix.Addr().Is6() {
-		family = ip6
-	}
-
-	if family != subnetFamily {
-		return []error{fmt.Errorf("invalid ip-range %s: parent subnet is an %s block", ipRange, subnetFamily)}
-	}
-
-	var errs []error
-	if prefix.Bits() < subnet.Bits() {
-		errs = append(errs, fmt.Errorf("invalid ip-range %s: CIDR block is bigger than its parent subnet %s", ipRange, subnet))
-	}
-	if prefix != prefix.Masked() {
-		errs = append(errs, fmt.Errorf("invalid ip-range %s: it should be %s", prefix, prefix.Masked()))
-	}
-	if !subnet.Overlaps(prefix) {
-		errs = append(errs, fmt.Errorf("invalid ip-range %s: parent subnet %s doesn't contain ip-range", ipRange, subnet))
-	}
-
-	return errs
-}
-
-func validateAddress(address string, subnet netip.Prefix, subnetFamily ipFamily) error {
-	if address == "" {
-		return nil
-	}
-	addr, err := netip.ParseAddr(address)
-	if err != nil {
-		return errors.New("invalid address")
-	}
-	family := ip4
-	if addr.Is6() {
-		family = ip6
-	}
-
-	if family != subnetFamily {
-		return fmt.Errorf("parent subnet is an %s block", subnetFamily)
-	}
-	if !subnet.Contains(addr) {
-		return fmt.Errorf("parent subnet %s doesn't contain this address", subnet)
-	}
-
-	return nil
-}
diff --git a/vendor/github.com/docker/docker/api/types/network/network.go b/vendor/github.com/docker/docker/api/types/network/network.go
deleted file mode 100644
index c8db97a7e..000000000
--- a/vendor/github.com/docker/docker/api/types/network/network.go
+++ /dev/null
@@ -1,166 +0,0 @@
-package network // import "github.com/docker/docker/api/types/network"
-
-import (
-	"time"
-
-	"github.com/docker/docker/api/types/filters"
-)
-
-const (
-	// NetworkDefault is a platform-independent alias to choose the platform-specific default network stack.
-	NetworkDefault = "default"
-	// NetworkHost is the name of the predefined network used when the NetworkMode host is selected (only available on Linux)
-	NetworkHost = "host"
-	// NetworkNone is the name of the predefined network used when the NetworkMode none is selected (available on both Linux and Windows)
-	NetworkNone = "none"
-	// NetworkBridge is the name of the default network on Linux
-	NetworkBridge = "bridge"
-	// NetworkNat is the name of the default network on Windows
-	NetworkNat = "nat"
-)
-
-// CreateRequest is the request message sent to the server for network create call.
-type CreateRequest struct {
-	CreateOptions
-	Name string // Name is the requested name of the network.
-
-	// Deprecated: CheckDuplicate is deprecated since API v1.44, but it defaults to true when sent by the client
-	// package to older daemons.
-	CheckDuplicate *bool `json:",omitempty"`
-}
-
-// CreateOptions holds options to create a network.
-type CreateOptions struct {
-	Driver     string            // Driver is the driver-name used to create the network (e.g. `bridge`, `overlay`)
-	Scope      string            // Scope describes the level at which the network exists (e.g. `swarm` for cluster-wide or `local` for machine level).
-	EnableIPv6 *bool             `json:",omitempty"` // EnableIPv6 represents whether to enable IPv6.
-	IPAM       *IPAM             // IPAM is the network's IP Address Management.
-	Internal   bool              // Internal represents if the network is used internal only.
-	Attachable bool              // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode.
-	Ingress    bool              // Ingress indicates the network is providing the routing-mesh for the swarm cluster.
-	ConfigOnly bool              // ConfigOnly creates a config-only network. Config-only networks are place-holder networks for network configurations to be used by other networks. ConfigOnly networks cannot be used directly to run containers or services.
-	ConfigFrom *ConfigReference  // ConfigFrom specifies the source which will provide the configuration for this network. The specified network must be a config-only network; see [CreateOptions.ConfigOnly].
-	Options    map[string]string // Options specifies the network-specific options to use for when creating the network.
-	Labels     map[string]string // Labels holds metadata specific to the network being created.
-}
-
-// ListOptions holds parameters to filter the list of networks with.
-type ListOptions struct {
-	Filters filters.Args
-}
-
-// InspectOptions holds parameters to inspect network.
-type InspectOptions struct {
-	Scope   string
-	Verbose bool
-}
-
-// ConnectOptions represents the data to be used to connect a container to the
-// network.
-type ConnectOptions struct {
-	Container      string
-	EndpointConfig *EndpointSettings `json:",omitempty"`
-}
-
-// DisconnectOptions represents the data to be used to disconnect a container
-// from the network.
-type DisconnectOptions struct {
-	Container string
-	Force     bool
-}
-
-// Inspect is the body of the "get network" http response message.
-type Inspect struct {
-	Name       string                      // Name is the name of the network
-	ID         string                      `json:"Id"` // ID uniquely identifies a network on a single machine
-	Created    time.Time                   // Created is the time the network created
-	Scope      string                      // Scope describes the level at which the network exists (e.g. `swarm` for cluster-wide or `local` for machine level)
-	Driver     string                      // Driver is the Driver name used to create the network (e.g. `bridge`, `overlay`)
-	EnableIPv6 bool                        // EnableIPv6 represents whether to enable IPv6
-	IPAM       IPAM                        // IPAM is the network's IP Address Management
-	Internal   bool                        // Internal represents if the network is used internal only
-	Attachable bool                        // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode.
-	Ingress    bool                        // Ingress indicates the network is providing the routing-mesh for the swarm cluster.
-	ConfigFrom ConfigReference             // ConfigFrom specifies the source which will provide the configuration for this network.
-	ConfigOnly bool                        // ConfigOnly networks are place-holder networks for network configurations to be used by other networks. ConfigOnly networks cannot be used directly to run containers or services.
-	Containers map[string]EndpointResource // Containers contains endpoints belonging to the network
-	Options    map[string]string           // Options holds the network specific options to use for when creating the network
-	Labels     map[string]string           // Labels holds metadata specific to the network being created
-	Peers      []PeerInfo                  `json:",omitempty"` // List of peer nodes for an overlay network
-	Services   map[string]ServiceInfo      `json:",omitempty"`
-}
-
-// Summary is used as response when listing networks. It currently is an alias
-// for [Inspect], but may diverge in the future, as not all information may
-// be included when listing networks.
-type Summary = Inspect
-
-// Address represents an IP address
-type Address struct {
-	Addr      string
-	PrefixLen int
-}
-
-// PeerInfo represents one peer of an overlay network
-type PeerInfo struct {
-	Name string
-	IP   string
-}
-
-// Task carries the information about one backend task
-type Task struct {
-	Name       string
-	EndpointID string
-	EndpointIP string
-	Info       map[string]string
-}
-
-// ServiceInfo represents service parameters with the list of service's tasks
-type ServiceInfo struct {
-	VIP          string
-	Ports        []string
-	LocalLBIndex int
-	Tasks        []Task
-}
-
-// EndpointResource contains network resources allocated and used for a
-// container in a network.
-type EndpointResource struct {
-	Name        string
-	EndpointID  string
-	MacAddress  string
-	IPv4Address string
-	IPv6Address string
-}
-
-// NetworkingConfig represents the container's networking configuration for each of its interfaces
-// Carries the networking configs specified in the `docker run` and `docker network connect` commands
-type NetworkingConfig struct {
-	EndpointsConfig map[string]*EndpointSettings // Endpoint configs for each connecting network
-}
-
-// ConfigReference specifies the source which provides a network's configuration
-type ConfigReference struct {
-	Network string
-}
-
-var acceptedFilters = map[string]bool{
-	"dangling": true,
-	"driver":   true,
-	"id":       true,
-	"label":    true,
-	"name":     true,
-	"scope":    true,
-	"type":     true,
-}
-
-// ValidateFilters validates the list of filter args with the available filters.
-func ValidateFilters(filter filters.Args) error {
-	return filter.Validate(acceptedFilters)
-}
-
-// PruneReport contains the response for Engine API:
-// POST "/networks/prune"
-type PruneReport struct {
-	NetworksDeleted []string
-}
diff --git a/vendor/github.com/docker/docker/api/types/plugin.go b/vendor/github.com/docker/docker/api/types/plugin.go
deleted file mode 100644
index abae48b9a..000000000
--- a/vendor/github.com/docker/docker/api/types/plugin.go
+++ /dev/null
@@ -1,203 +0,0 @@
-package types
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// Plugin A plugin for the Engine API
-// swagger:model Plugin
-type Plugin struct {
-
-	// config
-	// Required: true
-	Config PluginConfig `json:"Config"`
-
-	// True if the plugin is running. False if the plugin is not running, only installed.
-	// Required: true
-	Enabled bool `json:"Enabled"`
-
-	// Id
-	ID string `json:"Id,omitempty"`
-
-	// name
-	// Required: true
-	Name string `json:"Name"`
-
-	// plugin remote reference used to push/pull the plugin
-	PluginReference string `json:"PluginReference,omitempty"`
-
-	// settings
-	// Required: true
-	Settings PluginSettings `json:"Settings"`
-}
-
-// PluginConfig The config of a plugin.
-// swagger:model PluginConfig
-type PluginConfig struct {
-
-	// args
-	// Required: true
-	Args PluginConfigArgs `json:"Args"`
-
-	// description
-	// Required: true
-	Description string `json:"Description"`
-
-	// Docker Version used to create the plugin
-	DockerVersion string `json:"DockerVersion,omitempty"`
-
-	// documentation
-	// Required: true
-	Documentation string `json:"Documentation"`
-
-	// entrypoint
-	// Required: true
-	Entrypoint []string `json:"Entrypoint"`
-
-	// env
-	// Required: true
-	Env []PluginEnv `json:"Env"`
-
-	// interface
-	// Required: true
-	Interface PluginConfigInterface `json:"Interface"`
-
-	// ipc host
-	// Required: true
-	IpcHost bool `json:"IpcHost"`
-
-	// linux
-	// Required: true
-	Linux PluginConfigLinux `json:"Linux"`
-
-	// mounts
-	// Required: true
-	Mounts []PluginMount `json:"Mounts"`
-
-	// network
-	// Required: true
-	Network PluginConfigNetwork `json:"Network"`
-
-	// pid host
-	// Required: true
-	PidHost bool `json:"PidHost"`
-
-	// propagated mount
-	// Required: true
-	PropagatedMount string `json:"PropagatedMount"`
-
-	// user
-	User PluginConfigUser `json:"User,omitempty"`
-
-	// work dir
-	// Required: true
-	WorkDir string `json:"WorkDir"`
-
-	// rootfs
-	Rootfs *PluginConfigRootfs `json:"rootfs,omitempty"`
-}
-
-// PluginConfigArgs plugin config args
-// swagger:model PluginConfigArgs
-type PluginConfigArgs struct {
-
-	// description
-	// Required: true
-	Description string `json:"Description"`
-
-	// name
-	// Required: true
-	Name string `json:"Name"`
-
-	// settable
-	// Required: true
-	Settable []string `json:"Settable"`
-
-	// value
-	// Required: true
-	Value []string `json:"Value"`
-}
-
-// PluginConfigInterface The interface between Docker and the plugin
-// swagger:model PluginConfigInterface
-type PluginConfigInterface struct {
-
-	// Protocol to use for clients connecting to the plugin.
-	ProtocolScheme string `json:"ProtocolScheme,omitempty"`
-
-	// socket
-	// Required: true
-	Socket string `json:"Socket"`
-
-	// types
-	// Required: true
-	Types []PluginInterfaceType `json:"Types"`
-}
-
-// PluginConfigLinux plugin config linux
-// swagger:model PluginConfigLinux
-type PluginConfigLinux struct {
-
-	// allow all devices
-	// Required: true
-	AllowAllDevices bool `json:"AllowAllDevices"`
-
-	// capabilities
-	// Required: true
-	Capabilities []string `json:"Capabilities"`
-
-	// devices
-	// Required: true
-	Devices []PluginDevice `json:"Devices"`
-}
-
-// PluginConfigNetwork plugin config network
-// swagger:model PluginConfigNetwork
-type PluginConfigNetwork struct {
-
-	// type
-	// Required: true
-	Type string `json:"Type"`
-}
-
-// PluginConfigRootfs plugin config rootfs
-// swagger:model PluginConfigRootfs
-type PluginConfigRootfs struct {
-
-	// diff ids
-	DiffIds []string `json:"diff_ids"`
-
-	// type
-	Type string `json:"type,omitempty"`
-}
-
-// PluginConfigUser plugin config user
-// swagger:model PluginConfigUser
-type PluginConfigUser struct {
-
-	// g ID
-	GID uint32 `json:"GID,omitempty"`
-
-	// UID
-	UID uint32 `json:"UID,omitempty"`
-}
-
-// PluginSettings Settings that can be modified by users.
-// swagger:model PluginSettings
-type PluginSettings struct {
-
-	// args
-	// Required: true
-	Args []string `json:"Args"`
-
-	// devices
-	// Required: true
-	Devices []PluginDevice `json:"Devices"`
-
-	// env
-	// Required: true
-	Env []string `json:"Env"`
-
-	// mounts
-	// Required: true
-	Mounts []PluginMount `json:"Mounts"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/plugin_device.go b/vendor/github.com/docker/docker/api/types/plugin_device.go
deleted file mode 100644
index 569901067..000000000
--- a/vendor/github.com/docker/docker/api/types/plugin_device.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package types
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// PluginDevice plugin device
-// swagger:model PluginDevice
-type PluginDevice struct {
-
-	// description
-	// Required: true
-	Description string `json:"Description"`
-
-	// name
-	// Required: true
-	Name string `json:"Name"`
-
-	// path
-	// Required: true
-	Path *string `json:"Path"`
-
-	// settable
-	// Required: true
-	Settable []string `json:"Settable"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/plugin_env.go b/vendor/github.com/docker/docker/api/types/plugin_env.go
deleted file mode 100644
index 32962dc2e..000000000
--- a/vendor/github.com/docker/docker/api/types/plugin_env.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package types
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// PluginEnv plugin env
-// swagger:model PluginEnv
-type PluginEnv struct {
-
-	// description
-	// Required: true
-	Description string `json:"Description"`
-
-	// name
-	// Required: true
-	Name string `json:"Name"`
-
-	// settable
-	// Required: true
-	Settable []string `json:"Settable"`
-
-	// value
-	// Required: true
-	Value *string `json:"Value"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/plugin_interface_type.go b/vendor/github.com/docker/docker/api/types/plugin_interface_type.go
deleted file mode 100644
index c82f204e8..000000000
--- a/vendor/github.com/docker/docker/api/types/plugin_interface_type.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package types
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// PluginInterfaceType plugin interface type
-// swagger:model PluginInterfaceType
-type PluginInterfaceType struct {
-
-	// capability
-	// Required: true
-	Capability string `json:"Capability"`
-
-	// prefix
-	// Required: true
-	Prefix string `json:"Prefix"`
-
-	// version
-	// Required: true
-	Version string `json:"Version"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/plugin_mount.go b/vendor/github.com/docker/docker/api/types/plugin_mount.go
deleted file mode 100644
index 5c031cf8b..000000000
--- a/vendor/github.com/docker/docker/api/types/plugin_mount.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package types
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// PluginMount plugin mount
-// swagger:model PluginMount
-type PluginMount struct {
-
-	// description
-	// Required: true
-	Description string `json:"Description"`
-
-	// destination
-	// Required: true
-	Destination string `json:"Destination"`
-
-	// name
-	// Required: true
-	Name string `json:"Name"`
-
-	// options
-	// Required: true
-	Options []string `json:"Options"`
-
-	// settable
-	// Required: true
-	Settable []string `json:"Settable"`
-
-	// source
-	// Required: true
-	Source *string `json:"Source"`
-
-	// type
-	// Required: true
-	Type string `json:"Type"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/plugin_responses.go b/vendor/github.com/docker/docker/api/types/plugin_responses.go
deleted file mode 100644
index 60d1fb5ad..000000000
--- a/vendor/github.com/docker/docker/api/types/plugin_responses.go
+++ /dev/null
@@ -1,71 +0,0 @@
-package types // import "github.com/docker/docker/api/types"
-
-import (
-	"encoding/json"
-	"fmt"
-	"sort"
-)
-
-// PluginsListResponse contains the response for the Engine API
-type PluginsListResponse []*Plugin
-
-// UnmarshalJSON implements json.Unmarshaler for PluginInterfaceType
-func (t *PluginInterfaceType) UnmarshalJSON(p []byte) error {
-	versionIndex := len(p)
-	prefixIndex := 0
-	if len(p) < 2 || p[0] != '"' || p[len(p)-1] != '"' {
-		return fmt.Errorf("%q is not a plugin interface type", p)
-	}
-	p = p[1 : len(p)-1]
-loop:
-	for i, b := range p {
-		switch b {
-		case '.':
-			prefixIndex = i
-		case '/':
-			versionIndex = i
-			break loop
-		}
-	}
-	t.Prefix = string(p[:prefixIndex])
-	t.Capability = string(p[prefixIndex+1 : versionIndex])
-	if versionIndex < len(p) {
-		t.Version = string(p[versionIndex+1:])
-	}
-	return nil
-}
-
-// MarshalJSON implements json.Marshaler for PluginInterfaceType
-func (t *PluginInterfaceType) MarshalJSON() ([]byte, error) {
-	return json.Marshal(t.String())
-}
-
-// String implements fmt.Stringer for PluginInterfaceType
-func (t PluginInterfaceType) String() string {
-	return fmt.Sprintf("%s.%s/%s", t.Prefix, t.Capability, t.Version)
-}
-
-// PluginPrivilege describes a permission the user has to accept
-// upon installing a plugin.
-type PluginPrivilege struct {
-	Name        string
-	Description string
-	Value       []string
-}
-
-// PluginPrivileges is a list of PluginPrivilege
-type PluginPrivileges []PluginPrivilege
-
-func (s PluginPrivileges) Len() int {
-	return len(s)
-}
-
-func (s PluginPrivileges) Less(i, j int) bool {
-	return s[i].Name < s[j].Name
-}
-
-func (s PluginPrivileges) Swap(i, j int) {
-	sort.Strings(s[i].Value)
-	sort.Strings(s[j].Value)
-	s[i], s[j] = s[j], s[i]
-}
diff --git a/vendor/github.com/docker/docker/api/types/port.go b/vendor/github.com/docker/docker/api/types/port.go
deleted file mode 100644
index d91234744..000000000
--- a/vendor/github.com/docker/docker/api/types/port.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package types
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// Port An open port on a container
-// swagger:model Port
-type Port struct {
-
-	// Host IP address that the container's port is mapped to
-	IP string `json:"IP,omitempty"`
-
-	// Port on the container
-	// Required: true
-	PrivatePort uint16 `json:"PrivatePort"`
-
-	// Port exposed on the host
-	PublicPort uint16 `json:"PublicPort,omitempty"`
-
-	// type
-	// Required: true
-	Type string `json:"Type"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/registry/authconfig.go b/vendor/github.com/docker/docker/api/types/registry/authconfig.go
deleted file mode 100644
index 8e383f6e6..000000000
--- a/vendor/github.com/docker/docker/api/types/registry/authconfig.go
+++ /dev/null
@@ -1,97 +0,0 @@
-package registry // import "github.com/docker/docker/api/types/registry"
-import (
-	"encoding/base64"
-	"encoding/json"
-	"io"
-	"strings"
-
-	"github.com/pkg/errors"
-)
-
-// AuthHeader is the name of the header used to send encoded registry
-// authorization credentials for registry operations (push/pull).
-const AuthHeader = "X-Registry-Auth"
-
-// AuthConfig contains authorization information for connecting to a Registry.
-type AuthConfig struct {
-	Username string `json:"username,omitempty"`
-	Password string `json:"password,omitempty"`
-	Auth     string `json:"auth,omitempty"`
-
-	// Email is an optional value associated with the username.
-	// This field is deprecated and will be removed in a later
-	// version of docker.
-	Email string `json:"email,omitempty"`
-
-	ServerAddress string `json:"serveraddress,omitempty"`
-
-	// IdentityToken is used to authenticate the user and get
-	// an access token for the registry.
-	IdentityToken string `json:"identitytoken,omitempty"`
-
-	// RegistryToken is a bearer token to be sent to a registry
-	RegistryToken string `json:"registrytoken,omitempty"`
-}
-
-// EncodeAuthConfig serializes the auth configuration as a base64url encoded
-// ([RFC4648, section 5]) JSON string for sending through the X-Registry-Auth header.
-//
-// [RFC4648, section 5]: https://tools.ietf.org/html/rfc4648#section-5
-func EncodeAuthConfig(authConfig AuthConfig) (string, error) {
-	buf, err := json.Marshal(authConfig)
-	if err != nil {
-		return "", errInvalidParameter{err}
-	}
-	return base64.URLEncoding.EncodeToString(buf), nil
-}
-
-// DecodeAuthConfig decodes base64url encoded ([RFC4648, section 5]) JSON
-// authentication information as sent through the X-Registry-Auth header.
-//
-// This function always returns an [AuthConfig], even if an error occurs. It is up
-// to the caller to decide if authentication is required, and if the error can
-// be ignored.
-//
-// [RFC4648, section 5]: https://tools.ietf.org/html/rfc4648#section-5
-func DecodeAuthConfig(authEncoded string) (*AuthConfig, error) {
-	if authEncoded == "" {
-		return &AuthConfig{}, nil
-	}
-
-	authJSON := base64.NewDecoder(base64.URLEncoding, strings.NewReader(authEncoded))
-	return decodeAuthConfigFromReader(authJSON)
-}
-
-// DecodeAuthConfigBody decodes authentication information as sent as JSON in the
-// body of a request. This function is to provide backward compatibility with old
-// clients and API versions. Current clients and API versions expect authentication
-// to be provided through the X-Registry-Auth header.
-//
-// Like [DecodeAuthConfig], this function always returns an [AuthConfig], even if an
-// error occurs. It is up to the caller to decide if authentication is required,
-// and if the error can be ignored.
-func DecodeAuthConfigBody(rdr io.ReadCloser) (*AuthConfig, error) {
-	return decodeAuthConfigFromReader(rdr)
-}
-
-func decodeAuthConfigFromReader(rdr io.Reader) (*AuthConfig, error) {
-	authConfig := &AuthConfig{}
-	if err := json.NewDecoder(rdr).Decode(authConfig); err != nil {
-		// always return an (empty) AuthConfig to increase compatibility with
-		// the existing API.
-		return &AuthConfig{}, invalid(err)
-	}
-	return authConfig, nil
-}
-
-func invalid(err error) error {
-	return errInvalidParameter{errors.Wrap(err, "invalid X-Registry-Auth header")}
-}
-
-type errInvalidParameter struct{ error }
-
-func (errInvalidParameter) InvalidParameter() {}
-
-func (e errInvalidParameter) Cause() error { return e.error }
-
-func (e errInvalidParameter) Unwrap() error { return e.error }
diff --git a/vendor/github.com/docker/docker/api/types/registry/authenticate.go b/vendor/github.com/docker/docker/api/types/registry/authenticate.go
deleted file mode 100644
index f0a2113e4..000000000
--- a/vendor/github.com/docker/docker/api/types/registry/authenticate.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package registry // import "github.com/docker/docker/api/types/registry"
-
-// ----------------------------------------------------------------------------
-// DO NOT EDIT THIS FILE
-// This file was generated by `swagger generate operation`
-//
-// See hack/generate-swagger-api.sh
-// ----------------------------------------------------------------------------
-
-// AuthenticateOKBody authenticate o k body
-// swagger:model AuthenticateOKBody
-type AuthenticateOKBody struct {
-
-	// An opaque token used to authenticate a user after a successful login
-	// Required: true
-	IdentityToken string `json:"IdentityToken"`
-
-	// The status of the authentication
-	// Required: true
-	Status string `json:"Status"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/registry/registry.go b/vendor/github.com/docker/docker/api/types/registry/registry.go
deleted file mode 100644
index 75ee07b15..000000000
--- a/vendor/github.com/docker/docker/api/types/registry/registry.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package registry // import "github.com/docker/docker/api/types/registry"
-
-import (
-	"encoding/json"
-	"net"
-
-	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
-)
-
-// ServiceConfig stores daemon registry services configuration.
-type ServiceConfig struct {
-	AllowNondistributableArtifactsCIDRs     []*NetIPNet
-	AllowNondistributableArtifactsHostnames []string
-	InsecureRegistryCIDRs                   []*NetIPNet           `json:"InsecureRegistryCIDRs"`
-	IndexConfigs                            map[string]*IndexInfo `json:"IndexConfigs"`
-	Mirrors                                 []string
-}
-
-// NetIPNet is the net.IPNet type, which can be marshalled and
-// unmarshalled to JSON
-type NetIPNet net.IPNet
-
-// String returns the CIDR notation of ipnet
-func (ipnet *NetIPNet) String() string {
-	return (*net.IPNet)(ipnet).String()
-}
-
-// MarshalJSON returns the JSON representation of the IPNet
-func (ipnet *NetIPNet) MarshalJSON() ([]byte, error) {
-	return json.Marshal((*net.IPNet)(ipnet).String())
-}
-
-// UnmarshalJSON sets the IPNet from a byte array of JSON
-func (ipnet *NetIPNet) UnmarshalJSON(b []byte) (err error) {
-	var ipnetStr string
-	if err = json.Unmarshal(b, &ipnetStr); err == nil {
-		var cidr *net.IPNet
-		if _, cidr, err = net.ParseCIDR(ipnetStr); err == nil {
-			*ipnet = NetIPNet(*cidr)
-		}
-	}
-	return
-}
-
-// IndexInfo contains information about a registry
-//
-// RepositoryInfo Examples:
-//
-//	{
-//	  "Index" : {
-//	    "Name" : "docker.io",
-//	    "Mirrors" : ["https://registry-2.docker.io/v1/", "https://registry-3.docker.io/v1/"],
-//	    "Secure" : true,
-//	    "Official" : true,
-//	  },
-//	  "RemoteName" : "library/debian",
-//	  "LocalName" : "debian",
-//	  "CanonicalName" : "docker.io/debian"
-//	  "Official" : true,
-//	}
-//
-//	{
-//	  "Index" : {
-//	    "Name" : "127.0.0.1:5000",
-//	    "Mirrors" : [],
-//	    "Secure" : false,
-//	    "Official" : false,
-//	  },
-//	  "RemoteName" : "user/repo",
-//	  "LocalName" : "127.0.0.1:5000/user/repo",
-//	  "CanonicalName" : "127.0.0.1:5000/user/repo",
-//	  "Official" : false,
-//	}
-type IndexInfo struct {
-	// Name is the name of the registry, such as "docker.io"
-	Name string
-	// Mirrors is a list of mirrors, expressed as URIs
-	Mirrors []string
-	// Secure is set to false if the registry is part of the list of
-	// insecure registries. Insecure registries accept HTTP and/or accept
-	// HTTPS with certificates from unknown CAs.
-	Secure bool
-	// Official indicates whether this is an official registry
-	Official bool
-}
-
-// DistributionInspect describes the result obtained from contacting the
-// registry to retrieve image metadata
-type DistributionInspect struct {
-	// Descriptor contains information about the manifest, including
-	// the content addressable digest
-	Descriptor ocispec.Descriptor
-	// Platforms contains the list of platforms supported by the image,
-	// obtained by parsing the manifest
-	Platforms []ocispec.Platform
-}
diff --git a/vendor/github.com/docker/docker/api/types/registry/search.go b/vendor/github.com/docker/docker/api/types/registry/search.go
deleted file mode 100644
index a0a1eec54..000000000
--- a/vendor/github.com/docker/docker/api/types/registry/search.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package registry
-
-import (
-	"context"
-
-	"github.com/docker/docker/api/types/filters"
-)
-
-// SearchOptions holds parameters to search images with.
-type SearchOptions struct {
-	RegistryAuth string
-
-	// PrivilegeFunc is a [types.RequestPrivilegeFunc] the client can
-	// supply to retry operations after getting an authorization error.
-	//
-	// It must return the registry authentication header value in base64
-	// format, or an error if the privilege request fails.
-	PrivilegeFunc func(context.Context) (string, error)
-	Filters       filters.Args
-	Limit         int
-}
-
-// SearchResult describes a search result returned from a registry
-type SearchResult struct {
-	// StarCount indicates the number of stars this repository has
-	StarCount int `json:"star_count"`
-	// IsOfficial is true if the result is from an official repository.
-	IsOfficial bool `json:"is_official"`
-	// Name is the name of the repository
-	Name string `json:"name"`
-	// IsAutomated indicates whether the result is automated.
-	//
-	// Deprecated: the "is_automated" field is deprecated and will always be "false".
-	IsAutomated bool `json:"is_automated"`
-	// Description is a textual description of the repository
-	Description string `json:"description"`
-}
-
-// SearchResults lists a collection search results returned from a registry
-type SearchResults struct {
-	// Query contains the query string that generated the search results
-	Query string `json:"query"`
-	// NumResults indicates the number of results the query returned
-	NumResults int `json:"num_results"`
-	// Results is a slice containing the actual results for the search
-	Results []SearchResult `json:"results"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/strslice/strslice.go b/vendor/github.com/docker/docker/api/types/strslice/strslice.go
deleted file mode 100644
index 82921cebc..000000000
--- a/vendor/github.com/docker/docker/api/types/strslice/strslice.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package strslice // import "github.com/docker/docker/api/types/strslice"
-
-import "encoding/json"
-
-// StrSlice represents a string or an array of strings.
-// We need to override the json decoder to accept both options.
-type StrSlice []string
-
-// UnmarshalJSON decodes the byte slice whether it's a string or an array of
-// strings. This method is needed to implement json.Unmarshaler.
-func (e *StrSlice) UnmarshalJSON(b []byte) error {
-	if len(b) == 0 {
-		// With no input, we preserve the existing value by returning nil and
-		// leaving the target alone. This allows defining default values for
-		// the type.
-		return nil
-	}
-
-	p := make([]string, 0, 1)
-	if err := json.Unmarshal(b, &p); err != nil {
-		var s string
-		if err := json.Unmarshal(b, &s); err != nil {
-			return err
-		}
-		p = append(p, s)
-	}
-
-	*e = p
-	return nil
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/common.go b/vendor/github.com/docker/docker/api/types/swarm/common.go
deleted file mode 100644
index 5ded7dba8..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/common.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package swarm // import "github.com/docker/docker/api/types/swarm"
-
-import (
-	"strconv"
-	"time"
-)
-
-// Version represents the internal object version.
-type Version struct {
-	Index uint64 `json:",omitempty"`
-}
-
-// String implements fmt.Stringer interface.
-func (v Version) String() string {
-	return strconv.FormatUint(v.Index, 10)
-}
-
-// Meta is a base object inherited by most of the other once.
-type Meta struct {
-	Version   Version   `json:",omitempty"`
-	CreatedAt time.Time `json:",omitempty"`
-	UpdatedAt time.Time `json:",omitempty"`
-}
-
-// Annotations represents how to describe an object.
-type Annotations struct {
-	Name   string            `json:",omitempty"`
-	Labels map[string]string `json:"Labels"`
-}
-
-// Driver represents a driver (network, logging, secrets backend).
-type Driver struct {
-	Name    string            `json:",omitempty"`
-	Options map[string]string `json:",omitempty"`
-}
-
-// TLSInfo represents the TLS information about what CA certificate is trusted,
-// and who the issuer for a TLS certificate is
-type TLSInfo struct {
-	// TrustRoot is the trusted CA root certificate in PEM format
-	TrustRoot string `json:",omitempty"`
-
-	// CertIssuer is the raw subject bytes of the issuer
-	CertIssuerSubject []byte `json:",omitempty"`
-
-	// CertIssuerPublicKey is the raw public key bytes of the issuer
-	CertIssuerPublicKey []byte `json:",omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/config.go b/vendor/github.com/docker/docker/api/types/swarm/config.go
deleted file mode 100644
index 16202ccce..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/config.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package swarm // import "github.com/docker/docker/api/types/swarm"
-
-import "os"
-
-// Config represents a config.
-type Config struct {
-	ID string
-	Meta
-	Spec ConfigSpec
-}
-
-// ConfigSpec represents a config specification from a config in swarm
-type ConfigSpec struct {
-	Annotations
-	Data []byte `json:",omitempty"`
-
-	// Templating controls whether and how to evaluate the config payload as
-	// a template. If it is not set, no templating is used.
-	Templating *Driver `json:",omitempty"`
-}
-
-// ConfigReferenceFileTarget is a file target in a config reference
-type ConfigReferenceFileTarget struct {
-	Name string
-	UID  string
-	GID  string
-	Mode os.FileMode
-}
-
-// ConfigReferenceRuntimeTarget is a target for a config specifying that it
-// isn't mounted into the container but instead has some other purpose.
-type ConfigReferenceRuntimeTarget struct{}
-
-// ConfigReference is a reference to a config in swarm
-type ConfigReference struct {
-	File       *ConfigReferenceFileTarget    `json:",omitempty"`
-	Runtime    *ConfigReferenceRuntimeTarget `json:",omitempty"`
-	ConfigID   string
-	ConfigName string
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/container.go b/vendor/github.com/docker/docker/api/types/swarm/container.go
deleted file mode 100644
index 30e3de70c..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/container.go
+++ /dev/null
@@ -1,119 +0,0 @@
-package swarm // import "github.com/docker/docker/api/types/swarm"
-
-import (
-	"time"
-
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/mount"
-)
-
-// DNSConfig specifies DNS related configurations in resolver configuration file (resolv.conf)
-// Detailed documentation is available in:
-// http://man7.org/linux/man-pages/man5/resolv.conf.5.html
-// `nameserver`, `search`, `options` have been supported.
-// TODO: `domain` is not supported yet.
-type DNSConfig struct {
-	// Nameservers specifies the IP addresses of the name servers
-	Nameservers []string `json:",omitempty"`
-	// Search specifies the search list for host-name lookup
-	Search []string `json:",omitempty"`
-	// Options allows certain internal resolver variables to be modified
-	Options []string `json:",omitempty"`
-}
-
-// SELinuxContext contains the SELinux labels of the container.
-type SELinuxContext struct {
-	Disable bool
-
-	User  string
-	Role  string
-	Type  string
-	Level string
-}
-
-// SeccompMode is the type used for the enumeration of possible seccomp modes
-// in SeccompOpts
-type SeccompMode string
-
-const (
-	SeccompModeDefault    SeccompMode = "default"
-	SeccompModeUnconfined SeccompMode = "unconfined"
-	SeccompModeCustom     SeccompMode = "custom"
-)
-
-// SeccompOpts defines the options for configuring seccomp on a swarm-managed
-// container.
-type SeccompOpts struct {
-	// Mode is the SeccompMode used for the container.
-	Mode SeccompMode `json:",omitempty"`
-	// Profile is the custom seccomp profile as a json object to be used with
-	// the container. Mode should be set to SeccompModeCustom when using a
-	// custom profile in this manner.
-	Profile []byte `json:",omitempty"`
-}
-
-// AppArmorMode is type used for the enumeration of possible AppArmor modes in
-// AppArmorOpts
-type AppArmorMode string
-
-const (
-	AppArmorModeDefault  AppArmorMode = "default"
-	AppArmorModeDisabled AppArmorMode = "disabled"
-)
-
-// AppArmorOpts defines the options for configuring AppArmor on a swarm-managed
-// container.  Currently, custom AppArmor profiles are not supported.
-type AppArmorOpts struct {
-	Mode AppArmorMode `json:",omitempty"`
-}
-
-// CredentialSpec for managed service account (Windows only)
-type CredentialSpec struct {
-	Config   string
-	File     string
-	Registry string
-}
-
-// Privileges defines the security options for the container.
-type Privileges struct {
-	CredentialSpec  *CredentialSpec
-	SELinuxContext  *SELinuxContext
-	Seccomp         *SeccompOpts  `json:",omitempty"`
-	AppArmor        *AppArmorOpts `json:",omitempty"`
-	NoNewPrivileges bool
-}
-
-// ContainerSpec represents the spec of a container.
-type ContainerSpec struct {
-	Image           string                  `json:",omitempty"`
-	Labels          map[string]string       `json:",omitempty"`
-	Command         []string                `json:",omitempty"`
-	Args            []string                `json:",omitempty"`
-	Hostname        string                  `json:",omitempty"`
-	Env             []string                `json:",omitempty"`
-	Dir             string                  `json:",omitempty"`
-	User            string                  `json:",omitempty"`
-	Groups          []string                `json:",omitempty"`
-	Privileges      *Privileges             `json:",omitempty"`
-	Init            *bool                   `json:",omitempty"`
-	StopSignal      string                  `json:",omitempty"`
-	TTY             bool                    `json:",omitempty"`
-	OpenStdin       bool                    `json:",omitempty"`
-	ReadOnly        bool                    `json:",omitempty"`
-	Mounts          []mount.Mount           `json:",omitempty"`
-	StopGracePeriod *time.Duration          `json:",omitempty"`
-	Healthcheck     *container.HealthConfig `json:",omitempty"`
-	// The format of extra hosts on swarmkit is specified in:
-	// http://man7.org/linux/man-pages/man5/hosts.5.html
-	//    IP_address canonical_hostname [aliases...]
-	Hosts          []string            `json:",omitempty"`
-	DNSConfig      *DNSConfig          `json:",omitempty"`
-	Secrets        []*SecretReference  `json:",omitempty"`
-	Configs        []*ConfigReference  `json:",omitempty"`
-	Isolation      container.Isolation `json:",omitempty"`
-	Sysctls        map[string]string   `json:",omitempty"`
-	CapabilityAdd  []string            `json:",omitempty"`
-	CapabilityDrop []string            `json:",omitempty"`
-	Ulimits        []*container.Ulimit `json:",omitempty"`
-	OomScoreAdj    int64               `json:",omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/network.go b/vendor/github.com/docker/docker/api/types/swarm/network.go
deleted file mode 100644
index 98ef3284d..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/network.go
+++ /dev/null
@@ -1,121 +0,0 @@
-package swarm // import "github.com/docker/docker/api/types/swarm"
-
-import (
-	"github.com/docker/docker/api/types/network"
-)
-
-// Endpoint represents an endpoint.
-type Endpoint struct {
-	Spec       EndpointSpec        `json:",omitempty"`
-	Ports      []PortConfig        `json:",omitempty"`
-	VirtualIPs []EndpointVirtualIP `json:",omitempty"`
-}
-
-// EndpointSpec represents the spec of an endpoint.
-type EndpointSpec struct {
-	Mode  ResolutionMode `json:",omitempty"`
-	Ports []PortConfig   `json:",omitempty"`
-}
-
-// ResolutionMode represents a resolution mode.
-type ResolutionMode string
-
-const (
-	// ResolutionModeVIP VIP
-	ResolutionModeVIP ResolutionMode = "vip"
-	// ResolutionModeDNSRR DNSRR
-	ResolutionModeDNSRR ResolutionMode = "dnsrr"
-)
-
-// PortConfig represents the config of a port.
-type PortConfig struct {
-	Name     string             `json:",omitempty"`
-	Protocol PortConfigProtocol `json:",omitempty"`
-	// TargetPort is the port inside the container
-	TargetPort uint32 `json:",omitempty"`
-	// PublishedPort is the port on the swarm hosts
-	PublishedPort uint32 `json:",omitempty"`
-	// PublishMode is the mode in which port is published
-	PublishMode PortConfigPublishMode `json:",omitempty"`
-}
-
-// PortConfigPublishMode represents the mode in which the port is to
-// be published.
-type PortConfigPublishMode string
-
-const (
-	// PortConfigPublishModeIngress is used for ports published
-	// for ingress load balancing using routing mesh.
-	PortConfigPublishModeIngress PortConfigPublishMode = "ingress"
-	// PortConfigPublishModeHost is used for ports published
-	// for direct host level access on the host where the task is running.
-	PortConfigPublishModeHost PortConfigPublishMode = "host"
-)
-
-// PortConfigProtocol represents the protocol of a port.
-type PortConfigProtocol string
-
-const (
-	// TODO(stevvooe): These should be used generally, not just for PortConfig.
-
-	// PortConfigProtocolTCP TCP
-	PortConfigProtocolTCP PortConfigProtocol = "tcp"
-	// PortConfigProtocolUDP UDP
-	PortConfigProtocolUDP PortConfigProtocol = "udp"
-	// PortConfigProtocolSCTP SCTP
-	PortConfigProtocolSCTP PortConfigProtocol = "sctp"
-)
-
-// EndpointVirtualIP represents the virtual ip of a port.
-type EndpointVirtualIP struct {
-	NetworkID string `json:",omitempty"`
-	Addr      string `json:",omitempty"`
-}
-
-// Network represents a network.
-type Network struct {
-	ID string
-	Meta
-	Spec        NetworkSpec  `json:",omitempty"`
-	DriverState Driver       `json:",omitempty"`
-	IPAMOptions *IPAMOptions `json:",omitempty"`
-}
-
-// NetworkSpec represents the spec of a network.
-type NetworkSpec struct {
-	Annotations
-	DriverConfiguration *Driver                  `json:",omitempty"`
-	IPv6Enabled         bool                     `json:",omitempty"`
-	Internal            bool                     `json:",omitempty"`
-	Attachable          bool                     `json:",omitempty"`
-	Ingress             bool                     `json:",omitempty"`
-	IPAMOptions         *IPAMOptions             `json:",omitempty"`
-	ConfigFrom          *network.ConfigReference `json:",omitempty"`
-	Scope               string                   `json:",omitempty"`
-}
-
-// NetworkAttachmentConfig represents the configuration of a network attachment.
-type NetworkAttachmentConfig struct {
-	Target     string            `json:",omitempty"`
-	Aliases    []string          `json:",omitempty"`
-	DriverOpts map[string]string `json:",omitempty"`
-}
-
-// NetworkAttachment represents a network attachment.
-type NetworkAttachment struct {
-	Network   Network  `json:",omitempty"`
-	Addresses []string `json:",omitempty"`
-}
-
-// IPAMOptions represents ipam options.
-type IPAMOptions struct {
-	Driver  Driver       `json:",omitempty"`
-	Configs []IPAMConfig `json:",omitempty"`
-}
-
-// IPAMConfig represents ipam configuration.
-type IPAMConfig struct {
-	Subnet  string `json:",omitempty"`
-	Range   string `json:",omitempty"`
-	Gateway string `json:",omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/node.go b/vendor/github.com/docker/docker/api/types/swarm/node.go
deleted file mode 100644
index bb98d5eed..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/node.go
+++ /dev/null
@@ -1,139 +0,0 @@
-package swarm // import "github.com/docker/docker/api/types/swarm"
-
-// Node represents a node.
-type Node struct {
-	ID string
-	Meta
-	// Spec defines the desired state of the node as specified by the user.
-	// The system will honor this and will *never* modify it.
-	Spec NodeSpec `json:",omitempty"`
-	// Description encapsulates the properties of the Node as reported by the
-	// agent.
-	Description NodeDescription `json:",omitempty"`
-	// Status provides the current status of the node, as seen by the manager.
-	Status NodeStatus `json:",omitempty"`
-	// ManagerStatus provides the current status of the node's manager
-	// component, if the node is a manager.
-	ManagerStatus *ManagerStatus `json:",omitempty"`
-}
-
-// NodeSpec represents the spec of a node.
-type NodeSpec struct {
-	Annotations
-	Role         NodeRole         `json:",omitempty"`
-	Availability NodeAvailability `json:",omitempty"`
-}
-
-// NodeRole represents the role of a node.
-type NodeRole string
-
-const (
-	// NodeRoleWorker WORKER
-	NodeRoleWorker NodeRole = "worker"
-	// NodeRoleManager MANAGER
-	NodeRoleManager NodeRole = "manager"
-)
-
-// NodeAvailability represents the availability of a node.
-type NodeAvailability string
-
-const (
-	// NodeAvailabilityActive ACTIVE
-	NodeAvailabilityActive NodeAvailability = "active"
-	// NodeAvailabilityPause PAUSE
-	NodeAvailabilityPause NodeAvailability = "pause"
-	// NodeAvailabilityDrain DRAIN
-	NodeAvailabilityDrain NodeAvailability = "drain"
-)
-
-// NodeDescription represents the description of a node.
-type NodeDescription struct {
-	Hostname  string            `json:",omitempty"`
-	Platform  Platform          `json:",omitempty"`
-	Resources Resources         `json:",omitempty"`
-	Engine    EngineDescription `json:",omitempty"`
-	TLSInfo   TLSInfo           `json:",omitempty"`
-	CSIInfo   []NodeCSIInfo     `json:",omitempty"`
-}
-
-// Platform represents the platform (Arch/OS).
-type Platform struct {
-	Architecture string `json:",omitempty"`
-	OS           string `json:",omitempty"`
-}
-
-// EngineDescription represents the description of an engine.
-type EngineDescription struct {
-	EngineVersion string              `json:",omitempty"`
-	Labels        map[string]string   `json:",omitempty"`
-	Plugins       []PluginDescription `json:",omitempty"`
-}
-
-// NodeCSIInfo represents information about a CSI plugin available on the node
-type NodeCSIInfo struct {
-	// PluginName is the name of the CSI plugin.
-	PluginName string `json:",omitempty"`
-	// NodeID is the ID of the node as reported by the CSI plugin. This is
-	// different from the swarm node ID.
-	NodeID string `json:",omitempty"`
-	// MaxVolumesPerNode is the maximum number of volumes that may be published
-	// to this node
-	MaxVolumesPerNode int64 `json:",omitempty"`
-	// AccessibleTopology indicates the location of this node in the CSI
-	// plugin's topology
-	AccessibleTopology *Topology `json:",omitempty"`
-}
-
-// PluginDescription represents the description of an engine plugin.
-type PluginDescription struct {
-	Type string `json:",omitempty"`
-	Name string `json:",omitempty"`
-}
-
-// NodeStatus represents the status of a node.
-type NodeStatus struct {
-	State   NodeState `json:",omitempty"`
-	Message string    `json:",omitempty"`
-	Addr    string    `json:",omitempty"`
-}
-
-// Reachability represents the reachability of a node.
-type Reachability string
-
-const (
-	// ReachabilityUnknown UNKNOWN
-	ReachabilityUnknown Reachability = "unknown"
-	// ReachabilityUnreachable UNREACHABLE
-	ReachabilityUnreachable Reachability = "unreachable"
-	// ReachabilityReachable REACHABLE
-	ReachabilityReachable Reachability = "reachable"
-)
-
-// ManagerStatus represents the status of a manager.
-type ManagerStatus struct {
-	Leader       bool         `json:",omitempty"`
-	Reachability Reachability `json:",omitempty"`
-	Addr         string       `json:",omitempty"`
-}
-
-// NodeState represents the state of a node.
-type NodeState string
-
-const (
-	// NodeStateUnknown UNKNOWN
-	NodeStateUnknown NodeState = "unknown"
-	// NodeStateDown DOWN
-	NodeStateDown NodeState = "down"
-	// NodeStateReady READY
-	NodeStateReady NodeState = "ready"
-	// NodeStateDisconnected DISCONNECTED
-	NodeStateDisconnected NodeState = "disconnected"
-)
-
-// Topology defines the CSI topology of this node. This type is a duplicate of
-// github.com/docker/docker/api/types.Topology. Because the type definition
-// is so simple and to avoid complicated structure or circular imports, we just
-// duplicate it here. See that type for full documentation
-type Topology struct {
-	Segments map[string]string `json:",omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/runtime.go b/vendor/github.com/docker/docker/api/types/swarm/runtime.go
deleted file mode 100644
index 0c77403cc..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/runtime.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package swarm // import "github.com/docker/docker/api/types/swarm"
-
-// RuntimeType is the type of runtime used for the TaskSpec
-type RuntimeType string
-
-// RuntimeURL is the proto type url
-type RuntimeURL string
-
-const (
-	// RuntimeContainer is the container based runtime
-	RuntimeContainer RuntimeType = "container"
-	// RuntimePlugin is the plugin based runtime
-	RuntimePlugin RuntimeType = "plugin"
-	// RuntimeNetworkAttachment is the network attachment runtime
-	RuntimeNetworkAttachment RuntimeType = "attachment"
-
-	// RuntimeURLContainer is the proto url for the container type
-	RuntimeURLContainer RuntimeURL = "types.docker.com/RuntimeContainer"
-	// RuntimeURLPlugin is the proto url for the plugin type
-	RuntimeURLPlugin RuntimeURL = "types.docker.com/RuntimePlugin"
-)
-
-// NetworkAttachmentSpec represents the runtime spec type for network
-// attachment tasks
-type NetworkAttachmentSpec struct {
-	ContainerID string
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/runtime/gen.go b/vendor/github.com/docker/docker/api/types/swarm/runtime/gen.go
deleted file mode 100644
index 292bd7afc..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/runtime/gen.go
+++ /dev/null
@@ -1,3 +0,0 @@
-//go:generate protoc --gogofaster_out=import_path=github.com/docker/docker/api/types/swarm/runtime:. plugin.proto
-
-package runtime // import "github.com/docker/docker/api/types/swarm/runtime"
diff --git a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go
deleted file mode 100644
index 32aaf0d51..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go
+++ /dev/null
@@ -1,808 +0,0 @@
-// Code generated by protoc-gen-gogo. DO NOT EDIT.
-// source: plugin.proto
-
-package runtime
-
-import (
-	fmt "fmt"
-	proto "github.com/gogo/protobuf/proto"
-	io "io"
-	math "math"
-	math_bits "math/bits"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
-
-// PluginSpec defines the base payload which clients can specify for creating
-// a service with the plugin runtime.
-type PluginSpec struct {
-	Name       string             `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Remote     string             `protobuf:"bytes,2,opt,name=remote,proto3" json:"remote,omitempty"`
-	Privileges []*PluginPrivilege `protobuf:"bytes,3,rep,name=privileges,proto3" json:"privileges,omitempty"`
-	Disabled   bool               `protobuf:"varint,4,opt,name=disabled,proto3" json:"disabled,omitempty"`
-	Env        []string           `protobuf:"bytes,5,rep,name=env,proto3" json:"env,omitempty"`
-}
-
-func (m *PluginSpec) Reset()         { *m = PluginSpec{} }
-func (m *PluginSpec) String() string { return proto.CompactTextString(m) }
-func (*PluginSpec) ProtoMessage()    {}
-func (*PluginSpec) Descriptor() ([]byte, []int) {
-	return fileDescriptor_22a625af4bc1cc87, []int{0}
-}
-func (m *PluginSpec) XXX_Unmarshal(b []byte) error {
-	return m.Unmarshal(b)
-}
-func (m *PluginSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	if deterministic {
-		return xxx_messageInfo_PluginSpec.Marshal(b, m, deterministic)
-	} else {
-		b = b[:cap(b)]
-		n, err := m.MarshalToSizedBuffer(b)
-		if err != nil {
-			return nil, err
-		}
-		return b[:n], nil
-	}
-}
-func (m *PluginSpec) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PluginSpec.Merge(m, src)
-}
-func (m *PluginSpec) XXX_Size() int {
-	return m.Size()
-}
-func (m *PluginSpec) XXX_DiscardUnknown() {
-	xxx_messageInfo_PluginSpec.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PluginSpec proto.InternalMessageInfo
-
-func (m *PluginSpec) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *PluginSpec) GetRemote() string {
-	if m != nil {
-		return m.Remote
-	}
-	return ""
-}
-
-func (m *PluginSpec) GetPrivileges() []*PluginPrivilege {
-	if m != nil {
-		return m.Privileges
-	}
-	return nil
-}
-
-func (m *PluginSpec) GetDisabled() bool {
-	if m != nil {
-		return m.Disabled
-	}
-	return false
-}
-
-func (m *PluginSpec) GetEnv() []string {
-	if m != nil {
-		return m.Env
-	}
-	return nil
-}
-
-// PluginPrivilege describes a permission the user has to accept
-// upon installing a plugin.
-type PluginPrivilege struct {
-	Name        string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Description string   `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
-	Value       []string `protobuf:"bytes,3,rep,name=value,proto3" json:"value,omitempty"`
-}
-
-func (m *PluginPrivilege) Reset()         { *m = PluginPrivilege{} }
-func (m *PluginPrivilege) String() string { return proto.CompactTextString(m) }
-func (*PluginPrivilege) ProtoMessage()    {}
-func (*PluginPrivilege) Descriptor() ([]byte, []int) {
-	return fileDescriptor_22a625af4bc1cc87, []int{1}
-}
-func (m *PluginPrivilege) XXX_Unmarshal(b []byte) error {
-	return m.Unmarshal(b)
-}
-func (m *PluginPrivilege) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	if deterministic {
-		return xxx_messageInfo_PluginPrivilege.Marshal(b, m, deterministic)
-	} else {
-		b = b[:cap(b)]
-		n, err := m.MarshalToSizedBuffer(b)
-		if err != nil {
-			return nil, err
-		}
-		return b[:n], nil
-	}
-}
-func (m *PluginPrivilege) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PluginPrivilege.Merge(m, src)
-}
-func (m *PluginPrivilege) XXX_Size() int {
-	return m.Size()
-}
-func (m *PluginPrivilege) XXX_DiscardUnknown() {
-	xxx_messageInfo_PluginPrivilege.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PluginPrivilege proto.InternalMessageInfo
-
-func (m *PluginPrivilege) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *PluginPrivilege) GetDescription() string {
-	if m != nil {
-		return m.Description
-	}
-	return ""
-}
-
-func (m *PluginPrivilege) GetValue() []string {
-	if m != nil {
-		return m.Value
-	}
-	return nil
-}
-
-func init() {
-	proto.RegisterType((*PluginSpec)(nil), "PluginSpec")
-	proto.RegisterType((*PluginPrivilege)(nil), "PluginPrivilege")
-}
-
-func init() { proto.RegisterFile("plugin.proto", fileDescriptor_22a625af4bc1cc87) }
-
-var fileDescriptor_22a625af4bc1cc87 = []byte{
-	// 225 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x29, 0xc8, 0x29, 0x4d,
-	0xcf, 0xcc, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x57, 0x9a, 0xc1, 0xc8, 0xc5, 0x15, 0x00, 0x16,
-	0x08, 0x2e, 0x48, 0x4d, 0x16, 0x12, 0xe2, 0x62, 0xc9, 0x4b, 0xcc, 0x4d, 0x95, 0x60, 0x54, 0x60,
-	0xd4, 0xe0, 0x0c, 0x02, 0xb3, 0x85, 0xc4, 0xb8, 0xd8, 0x8a, 0x52, 0x73, 0xf3, 0x4b, 0x52, 0x25,
-	0x98, 0xc0, 0xa2, 0x50, 0x9e, 0x90, 0x01, 0x17, 0x57, 0x41, 0x51, 0x66, 0x59, 0x66, 0x4e, 0x6a,
-	0x7a, 0x6a, 0xb1, 0x04, 0xb3, 0x02, 0xb3, 0x06, 0xb7, 0x91, 0x80, 0x1e, 0xc4, 0xb0, 0x00, 0x98,
-	0x44, 0x10, 0x92, 0x1a, 0x21, 0x29, 0x2e, 0x8e, 0x94, 0xcc, 0xe2, 0xc4, 0xa4, 0x9c, 0xd4, 0x14,
-	0x09, 0x16, 0x05, 0x46, 0x0d, 0x8e, 0x20, 0x38, 0x5f, 0x48, 0x80, 0x8b, 0x39, 0x35, 0xaf, 0x4c,
-	0x82, 0x55, 0x81, 0x59, 0x83, 0x33, 0x08, 0xc4, 0x54, 0x8a, 0xe5, 0xe2, 0x47, 0x33, 0x0c, 0xab,
-	0xf3, 0x14, 0xb8, 0xb8, 0x53, 0x52, 0x8b, 0x93, 0x8b, 0x32, 0x0b, 0x4a, 0x32, 0xf3, 0xf3, 0xa0,
-	0x6e, 0x44, 0x16, 0x12, 0x12, 0xe1, 0x62, 0x2d, 0x4b, 0xcc, 0x29, 0x4d, 0x05, 0xbb, 0x91, 0x33,
-	0x08, 0xc2, 0x71, 0x92, 0x38, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4,
-	0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x24, 0x36,
-	0x70, 0xd0, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x37, 0xea, 0xe2, 0xca, 0x2a, 0x01, 0x00,
-	0x00,
-}
-
-func (m *PluginSpec) Marshal() (dAtA []byte, err error) {
-	size := m.Size()
-	dAtA = make([]byte, size)
-	n, err := m.MarshalToSizedBuffer(dAtA[:size])
-	if err != nil {
-		return nil, err
-	}
-	return dAtA[:n], nil
-}
-
-func (m *PluginSpec) MarshalTo(dAtA []byte) (int, error) {
-	size := m.Size()
-	return m.MarshalToSizedBuffer(dAtA[:size])
-}
-
-func (m *PluginSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) {
-	i := len(dAtA)
-	_ = i
-	var l int
-	_ = l
-	if len(m.Env) > 0 {
-		for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- {
-			i -= len(m.Env[iNdEx])
-			copy(dAtA[i:], m.Env[iNdEx])
-			i = encodeVarintPlugin(dAtA, i, uint64(len(m.Env[iNdEx])))
-			i--
-			dAtA[i] = 0x2a
-		}
-	}
-	if m.Disabled {
-		i--
-		if m.Disabled {
-			dAtA[i] = 1
-		} else {
-			dAtA[i] = 0
-		}
-		i--
-		dAtA[i] = 0x20
-	}
-	if len(m.Privileges) > 0 {
-		for iNdEx := len(m.Privileges) - 1; iNdEx >= 0; iNdEx-- {
-			{
-				size, err := m.Privileges[iNdEx].MarshalToSizedBuffer(dAtA[:i])
-				if err != nil {
-					return 0, err
-				}
-				i -= size
-				i = encodeVarintPlugin(dAtA, i, uint64(size))
-			}
-			i--
-			dAtA[i] = 0x1a
-		}
-	}
-	if len(m.Remote) > 0 {
-		i -= len(m.Remote)
-		copy(dAtA[i:], m.Remote)
-		i = encodeVarintPlugin(dAtA, i, uint64(len(m.Remote)))
-		i--
-		dAtA[i] = 0x12
-	}
-	if len(m.Name) > 0 {
-		i -= len(m.Name)
-		copy(dAtA[i:], m.Name)
-		i = encodeVarintPlugin(dAtA, i, uint64(len(m.Name)))
-		i--
-		dAtA[i] = 0xa
-	}
-	return len(dAtA) - i, nil
-}
-
-func (m *PluginPrivilege) Marshal() (dAtA []byte, err error) {
-	size := m.Size()
-	dAtA = make([]byte, size)
-	n, err := m.MarshalToSizedBuffer(dAtA[:size])
-	if err != nil {
-		return nil, err
-	}
-	return dAtA[:n], nil
-}
-
-func (m *PluginPrivilege) MarshalTo(dAtA []byte) (int, error) {
-	size := m.Size()
-	return m.MarshalToSizedBuffer(dAtA[:size])
-}
-
-func (m *PluginPrivilege) MarshalToSizedBuffer(dAtA []byte) (int, error) {
-	i := len(dAtA)
-	_ = i
-	var l int
-	_ = l
-	if len(m.Value) > 0 {
-		for iNdEx := len(m.Value) - 1; iNdEx >= 0; iNdEx-- {
-			i -= len(m.Value[iNdEx])
-			copy(dAtA[i:], m.Value[iNdEx])
-			i = encodeVarintPlugin(dAtA, i, uint64(len(m.Value[iNdEx])))
-			i--
-			dAtA[i] = 0x1a
-		}
-	}
-	if len(m.Description) > 0 {
-		i -= len(m.Description)
-		copy(dAtA[i:], m.Description)
-		i = encodeVarintPlugin(dAtA, i, uint64(len(m.Description)))
-		i--
-		dAtA[i] = 0x12
-	}
-	if len(m.Name) > 0 {
-		i -= len(m.Name)
-		copy(dAtA[i:], m.Name)
-		i = encodeVarintPlugin(dAtA, i, uint64(len(m.Name)))
-		i--
-		dAtA[i] = 0xa
-	}
-	return len(dAtA) - i, nil
-}
-
-func encodeVarintPlugin(dAtA []byte, offset int, v uint64) int {
-	offset -= sovPlugin(v)
-	base := offset
-	for v >= 1<<7 {
-		dAtA[offset] = uint8(v&0x7f | 0x80)
-		v >>= 7
-		offset++
-	}
-	dAtA[offset] = uint8(v)
-	return base
-}
-func (m *PluginSpec) Size() (n int) {
-	if m == nil {
-		return 0
-	}
-	var l int
-	_ = l
-	l = len(m.Name)
-	if l > 0 {
-		n += 1 + l + sovPlugin(uint64(l))
-	}
-	l = len(m.Remote)
-	if l > 0 {
-		n += 1 + l + sovPlugin(uint64(l))
-	}
-	if len(m.Privileges) > 0 {
-		for _, e := range m.Privileges {
-			l = e.Size()
-			n += 1 + l + sovPlugin(uint64(l))
-		}
-	}
-	if m.Disabled {
-		n += 2
-	}
-	if len(m.Env) > 0 {
-		for _, s := range m.Env {
-			l = len(s)
-			n += 1 + l + sovPlugin(uint64(l))
-		}
-	}
-	return n
-}
-
-func (m *PluginPrivilege) Size() (n int) {
-	if m == nil {
-		return 0
-	}
-	var l int
-	_ = l
-	l = len(m.Name)
-	if l > 0 {
-		n += 1 + l + sovPlugin(uint64(l))
-	}
-	l = len(m.Description)
-	if l > 0 {
-		n += 1 + l + sovPlugin(uint64(l))
-	}
-	if len(m.Value) > 0 {
-		for _, s := range m.Value {
-			l = len(s)
-			n += 1 + l + sovPlugin(uint64(l))
-		}
-	}
-	return n
-}
-
-func sovPlugin(x uint64) (n int) {
-	return (math_bits.Len64(x|1) + 6) / 7
-}
-func sozPlugin(x uint64) (n int) {
-	return sovPlugin(uint64((x << 1) ^ uint64((int64(x) >> 63))))
-}
-func (m *PluginSpec) Unmarshal(dAtA []byte) error {
-	l := len(dAtA)
-	iNdEx := 0
-	for iNdEx < l {
-		preIndex := iNdEx
-		var wire uint64
-		for shift := uint(0); ; shift += 7 {
-			if shift >= 64 {
-				return ErrIntOverflowPlugin
-			}
-			if iNdEx >= l {
-				return io.ErrUnexpectedEOF
-			}
-			b := dAtA[iNdEx]
-			iNdEx++
-			wire |= uint64(b&0x7F) << shift
-			if b < 0x80 {
-				break
-			}
-		}
-		fieldNum := int32(wire >> 3)
-		wireType := int(wire & 0x7)
-		if wireType == 4 {
-			return fmt.Errorf("proto: PluginSpec: wiretype end group for non-group")
-		}
-		if fieldNum <= 0 {
-			return fmt.Errorf("proto: PluginSpec: illegal tag %d (wire type %d)", fieldNum, wire)
-		}
-		switch fieldNum {
-		case 1:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
-			}
-			var stringLen uint64
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowPlugin
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			m.Name = string(dAtA[iNdEx:postIndex])
-			iNdEx = postIndex
-		case 2:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Remote", wireType)
-			}
-			var stringLen uint64
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowPlugin
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			m.Remote = string(dAtA[iNdEx:postIndex])
-			iNdEx = postIndex
-		case 3:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Privileges", wireType)
-			}
-			var msglen int
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowPlugin
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				msglen |= int(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			if msglen < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			postIndex := iNdEx + msglen
-			if postIndex < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			m.Privileges = append(m.Privileges, &PluginPrivilege{})
-			if err := m.Privileges[len(m.Privileges)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
-				return err
-			}
-			iNdEx = postIndex
-		case 4:
-			if wireType != 0 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Disabled", wireType)
-			}
-			var v int
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowPlugin
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				v |= int(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			m.Disabled = bool(v != 0)
-		case 5:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Env", wireType)
-			}
-			var stringLen uint64
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowPlugin
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			m.Env = append(m.Env, string(dAtA[iNdEx:postIndex]))
-			iNdEx = postIndex
-		default:
-			iNdEx = preIndex
-			skippy, err := skipPlugin(dAtA[iNdEx:])
-			if err != nil {
-				return err
-			}
-			if (skippy < 0) || (iNdEx+skippy) < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			if (iNdEx + skippy) > l {
-				return io.ErrUnexpectedEOF
-			}
-			iNdEx += skippy
-		}
-	}
-
-	if iNdEx > l {
-		return io.ErrUnexpectedEOF
-	}
-	return nil
-}
-func (m *PluginPrivilege) Unmarshal(dAtA []byte) error {
-	l := len(dAtA)
-	iNdEx := 0
-	for iNdEx < l {
-		preIndex := iNdEx
-		var wire uint64
-		for shift := uint(0); ; shift += 7 {
-			if shift >= 64 {
-				return ErrIntOverflowPlugin
-			}
-			if iNdEx >= l {
-				return io.ErrUnexpectedEOF
-			}
-			b := dAtA[iNdEx]
-			iNdEx++
-			wire |= uint64(b&0x7F) << shift
-			if b < 0x80 {
-				break
-			}
-		}
-		fieldNum := int32(wire >> 3)
-		wireType := int(wire & 0x7)
-		if wireType == 4 {
-			return fmt.Errorf("proto: PluginPrivilege: wiretype end group for non-group")
-		}
-		if fieldNum <= 0 {
-			return fmt.Errorf("proto: PluginPrivilege: illegal tag %d (wire type %d)", fieldNum, wire)
-		}
-		switch fieldNum {
-		case 1:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
-			}
-			var stringLen uint64
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowPlugin
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			m.Name = string(dAtA[iNdEx:postIndex])
-			iNdEx = postIndex
-		case 2:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType)
-			}
-			var stringLen uint64
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowPlugin
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			m.Description = string(dAtA[iNdEx:postIndex])
-			iNdEx = postIndex
-		case 3:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
-			}
-			var stringLen uint64
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowPlugin
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			m.Value = append(m.Value, string(dAtA[iNdEx:postIndex]))
-			iNdEx = postIndex
-		default:
-			iNdEx = preIndex
-			skippy, err := skipPlugin(dAtA[iNdEx:])
-			if err != nil {
-				return err
-			}
-			if (skippy < 0) || (iNdEx+skippy) < 0 {
-				return ErrInvalidLengthPlugin
-			}
-			if (iNdEx + skippy) > l {
-				return io.ErrUnexpectedEOF
-			}
-			iNdEx += skippy
-		}
-	}
-
-	if iNdEx > l {
-		return io.ErrUnexpectedEOF
-	}
-	return nil
-}
-func skipPlugin(dAtA []byte) (n int, err error) {
-	l := len(dAtA)
-	iNdEx := 0
-	depth := 0
-	for iNdEx < l {
-		var wire uint64
-		for shift := uint(0); ; shift += 7 {
-			if shift >= 64 {
-				return 0, ErrIntOverflowPlugin
-			}
-			if iNdEx >= l {
-				return 0, io.ErrUnexpectedEOF
-			}
-			b := dAtA[iNdEx]
-			iNdEx++
-			wire |= (uint64(b) & 0x7F) << shift
-			if b < 0x80 {
-				break
-			}
-		}
-		wireType := int(wire & 0x7)
-		switch wireType {
-		case 0:
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return 0, ErrIntOverflowPlugin
-				}
-				if iNdEx >= l {
-					return 0, io.ErrUnexpectedEOF
-				}
-				iNdEx++
-				if dAtA[iNdEx-1] < 0x80 {
-					break
-				}
-			}
-		case 1:
-			iNdEx += 8
-		case 2:
-			var length int
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return 0, ErrIntOverflowPlugin
-				}
-				if iNdEx >= l {
-					return 0, io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				length |= (int(b) & 0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			if length < 0 {
-				return 0, ErrInvalidLengthPlugin
-			}
-			iNdEx += length
-		case 3:
-			depth++
-		case 4:
-			if depth == 0 {
-				return 0, ErrUnexpectedEndOfGroupPlugin
-			}
-			depth--
-		case 5:
-			iNdEx += 4
-		default:
-			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
-		}
-		if iNdEx < 0 {
-			return 0, ErrInvalidLengthPlugin
-		}
-		if depth == 0 {
-			return iNdEx, nil
-		}
-	}
-	return 0, io.ErrUnexpectedEOF
-}
-
-var (
-	ErrInvalidLengthPlugin        = fmt.Errorf("proto: negative length found during unmarshaling")
-	ErrIntOverflowPlugin          = fmt.Errorf("proto: integer overflow")
-	ErrUnexpectedEndOfGroupPlugin = fmt.Errorf("proto: unexpected end of group")
-)
diff --git a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto
deleted file mode 100644
index e311b36ba..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto
+++ /dev/null
@@ -1,19 +0,0 @@
-syntax = "proto3";
-
-// PluginSpec defines the base payload which clients can specify for creating
-// a service with the plugin runtime.
-message PluginSpec {
-	string name = 1;
-	string remote = 2;
-	repeated PluginPrivilege privileges = 3;
-	bool disabled = 4;
-	repeated string env = 5;
-}
-
-// PluginPrivilege describes a permission the user has to accept
-// upon installing a plugin.
-message PluginPrivilege {
-	string name = 1;
-	string description = 2;
-	repeated string value = 3;
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/secret.go b/vendor/github.com/docker/docker/api/types/swarm/secret.go
deleted file mode 100644
index d5213ec98..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/secret.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package swarm // import "github.com/docker/docker/api/types/swarm"
-
-import "os"
-
-// Secret represents a secret.
-type Secret struct {
-	ID string
-	Meta
-	Spec SecretSpec
-}
-
-// SecretSpec represents a secret specification from a secret in swarm
-type SecretSpec struct {
-	Annotations
-	Data   []byte  `json:",omitempty"`
-	Driver *Driver `json:",omitempty"` // name of the secrets driver used to fetch the secret's value from an external secret store
-
-	// Templating controls whether and how to evaluate the secret payload as
-	// a template. If it is not set, no templating is used.
-	Templating *Driver `json:",omitempty"`
-}
-
-// SecretReferenceFileTarget is a file target in a secret reference
-type SecretReferenceFileTarget struct {
-	Name string
-	UID  string
-	GID  string
-	Mode os.FileMode
-}
-
-// SecretReference is a reference to a secret in swarm
-type SecretReference struct {
-	File       *SecretReferenceFileTarget
-	SecretID   string
-	SecretName string
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/service.go b/vendor/github.com/docker/docker/api/types/swarm/service.go
deleted file mode 100644
index 5b6d5ec12..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/service.go
+++ /dev/null
@@ -1,202 +0,0 @@
-package swarm // import "github.com/docker/docker/api/types/swarm"
-
-import "time"
-
-// Service represents a service.
-type Service struct {
-	ID string
-	Meta
-	Spec         ServiceSpec   `json:",omitempty"`
-	PreviousSpec *ServiceSpec  `json:",omitempty"`
-	Endpoint     Endpoint      `json:",omitempty"`
-	UpdateStatus *UpdateStatus `json:",omitempty"`
-
-	// ServiceStatus is an optional, extra field indicating the number of
-	// desired and running tasks. It is provided primarily as a shortcut to
-	// calculating these values client-side, which otherwise would require
-	// listing all tasks for a service, an operation that could be
-	// computation and network expensive.
-	ServiceStatus *ServiceStatus `json:",omitempty"`
-
-	// JobStatus is the status of a Service which is in one of ReplicatedJob or
-	// GlobalJob modes. It is absent on Replicated and Global services.
-	JobStatus *JobStatus `json:",omitempty"`
-}
-
-// ServiceSpec represents the spec of a service.
-type ServiceSpec struct {
-	Annotations
-
-	// TaskTemplate defines how the service should construct new tasks when
-	// orchestrating this service.
-	TaskTemplate   TaskSpec      `json:",omitempty"`
-	Mode           ServiceMode   `json:",omitempty"`
-	UpdateConfig   *UpdateConfig `json:",omitempty"`
-	RollbackConfig *UpdateConfig `json:",omitempty"`
-
-	// Networks specifies which networks the service should attach to.
-	//
-	// Deprecated: This field is deprecated since v1.44. The Networks field in TaskSpec should be used instead.
-	Networks     []NetworkAttachmentConfig `json:",omitempty"`
-	EndpointSpec *EndpointSpec             `json:",omitempty"`
-}
-
-// ServiceMode represents the mode of a service.
-type ServiceMode struct {
-	Replicated    *ReplicatedService `json:",omitempty"`
-	Global        *GlobalService     `json:",omitempty"`
-	ReplicatedJob *ReplicatedJob     `json:",omitempty"`
-	GlobalJob     *GlobalJob         `json:",omitempty"`
-}
-
-// UpdateState is the state of a service update.
-type UpdateState string
-
-const (
-	// UpdateStateUpdating is the updating state.
-	UpdateStateUpdating UpdateState = "updating"
-	// UpdateStatePaused is the paused state.
-	UpdateStatePaused UpdateState = "paused"
-	// UpdateStateCompleted is the completed state.
-	UpdateStateCompleted UpdateState = "completed"
-	// UpdateStateRollbackStarted is the state with a rollback in progress.
-	UpdateStateRollbackStarted UpdateState = "rollback_started"
-	// UpdateStateRollbackPaused is the state with a rollback in progress.
-	UpdateStateRollbackPaused UpdateState = "rollback_paused"
-	// UpdateStateRollbackCompleted is the state with a rollback in progress.
-	UpdateStateRollbackCompleted UpdateState = "rollback_completed"
-)
-
-// UpdateStatus reports the status of a service update.
-type UpdateStatus struct {
-	State       UpdateState `json:",omitempty"`
-	StartedAt   *time.Time  `json:",omitempty"`
-	CompletedAt *time.Time  `json:",omitempty"`
-	Message     string      `json:",omitempty"`
-}
-
-// ReplicatedService is a kind of ServiceMode.
-type ReplicatedService struct {
-	Replicas *uint64 `json:",omitempty"`
-}
-
-// GlobalService is a kind of ServiceMode.
-type GlobalService struct{}
-
-// ReplicatedJob is the a type of Service which executes a defined Tasks
-// in parallel until the specified number of Tasks have succeeded.
-type ReplicatedJob struct {
-	// MaxConcurrent indicates the maximum number of Tasks that should be
-	// executing simultaneously for this job at any given time. There may be
-	// fewer Tasks that MaxConcurrent executing simultaneously; for example, if
-	// there are fewer than MaxConcurrent tasks needed to reach
-	// TotalCompletions.
-	//
-	// If this field is empty, it will default to a max concurrency of 1.
-	MaxConcurrent *uint64 `json:",omitempty"`
-
-	// TotalCompletions is the total number of Tasks desired to run to
-	// completion.
-	//
-	// If this field is empty, the value of MaxConcurrent will be used.
-	TotalCompletions *uint64 `json:",omitempty"`
-}
-
-// GlobalJob is the type of a Service which executes a Task on every Node
-// matching the Service's placement constraints. These tasks run to completion
-// and then exit.
-//
-// This type is deliberately empty.
-type GlobalJob struct{}
-
-const (
-	// UpdateFailureActionPause PAUSE
-	UpdateFailureActionPause = "pause"
-	// UpdateFailureActionContinue CONTINUE
-	UpdateFailureActionContinue = "continue"
-	// UpdateFailureActionRollback ROLLBACK
-	UpdateFailureActionRollback = "rollback"
-
-	// UpdateOrderStopFirst STOP_FIRST
-	UpdateOrderStopFirst = "stop-first"
-	// UpdateOrderStartFirst START_FIRST
-	UpdateOrderStartFirst = "start-first"
-)
-
-// UpdateConfig represents the update configuration.
-type UpdateConfig struct {
-	// Maximum number of tasks to be updated in one iteration.
-	// 0 means unlimited parallelism.
-	Parallelism uint64
-
-	// Amount of time between updates.
-	Delay time.Duration `json:",omitempty"`
-
-	// FailureAction is the action to take when an update failures.
-	FailureAction string `json:",omitempty"`
-
-	// Monitor indicates how long to monitor a task for failure after it is
-	// created. If the task fails by ending up in one of the states
-	// REJECTED, COMPLETED, or FAILED, within Monitor from its creation,
-	// this counts as a failure. If it fails after Monitor, it does not
-	// count as a failure. If Monitor is unspecified, a default value will
-	// be used.
-	Monitor time.Duration `json:",omitempty"`
-
-	// MaxFailureRatio is the fraction of tasks that may fail during
-	// an update before the failure action is invoked. Any task created by
-	// the current update which ends up in one of the states REJECTED,
-	// COMPLETED or FAILED within Monitor from its creation counts as a
-	// failure. The number of failures is divided by the number of tasks
-	// being updated, and if this fraction is greater than
-	// MaxFailureRatio, the failure action is invoked.
-	//
-	// If the failure action is CONTINUE, there is no effect.
-	// If the failure action is PAUSE, no more tasks will be updated until
-	// another update is started.
-	MaxFailureRatio float32
-
-	// Order indicates the order of operations when rolling out an updated
-	// task. Either the old task is shut down before the new task is
-	// started, or the new task is started before the old task is shut down.
-	Order string
-}
-
-// ServiceStatus represents the number of running tasks in a service and the
-// number of tasks desired to be running.
-type ServiceStatus struct {
-	// RunningTasks is the number of tasks for the service actually in the
-	// Running state
-	RunningTasks uint64
-
-	// DesiredTasks is the number of tasks desired to be running by the
-	// service. For replicated services, this is the replica count. For global
-	// services, this is computed by taking the number of tasks with desired
-	// state of not-Shutdown.
-	DesiredTasks uint64
-
-	// CompletedTasks is the number of tasks in the state Completed, if this
-	// service is in ReplicatedJob or GlobalJob mode. This field must be
-	// cross-referenced with the service type, because the default value of 0
-	// may mean that a service is not in a job mode, or it may mean that the
-	// job has yet to complete any tasks.
-	CompletedTasks uint64
-}
-
-// JobStatus is the status of a job-type service.
-type JobStatus struct {
-	// JobIteration is a value increased each time a Job is executed,
-	// successfully or otherwise. "Executed", in this case, means the job as a
-	// whole has been started, not that an individual Task has been launched. A
-	// job is "Executed" when its ServiceSpec is updated. JobIteration can be
-	// used to disambiguate Tasks belonging to different executions of a job.
-	//
-	// Though JobIteration will increase with each subsequent execution, it may
-	// not necessarily increase by 1, and so JobIteration should not be used to
-	// keep track of the number of times a job has been executed.
-	JobIteration Version
-
-	// LastExecution is the time that the job was last executed, as observed by
-	// Swarm manager.
-	LastExecution time.Time `json:",omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/service_create_response.go b/vendor/github.com/docker/docker/api/types/swarm/service_create_response.go
deleted file mode 100644
index 9a268ff1b..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/service_create_response.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package swarm
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// ServiceCreateResponse contains the information returned to a client on the
-// creation of a new service.
-//
-// swagger:model ServiceCreateResponse
-type ServiceCreateResponse struct {
-
-	// The ID of the created service.
-	ID string `json:"ID,omitempty"`
-
-	// Optional warning message.
-	//
-	// FIXME(thaJeztah): this should have "omitempty" in the generated type.
-	//
-	Warnings []string `json:"Warnings"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/service_update_response.go b/vendor/github.com/docker/docker/api/types/swarm/service_update_response.go
deleted file mode 100644
index 0417467da..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/service_update_response.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package swarm
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// ServiceUpdateResponse service update response
-// swagger:model ServiceUpdateResponse
-type ServiceUpdateResponse struct {
-
-	// Optional warning messages
-	Warnings []string `json:"Warnings"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/swarm.go b/vendor/github.com/docker/docker/api/types/swarm/swarm.go
deleted file mode 100644
index 1b4be6fff..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/swarm.go
+++ /dev/null
@@ -1,237 +0,0 @@
-package swarm // import "github.com/docker/docker/api/types/swarm"
-
-import (
-	"time"
-)
-
-// ClusterInfo represents info about the cluster for outputting in "info"
-// it contains the same information as "Swarm", but without the JoinTokens
-type ClusterInfo struct {
-	ID string
-	Meta
-	Spec                   Spec
-	TLSInfo                TLSInfo
-	RootRotationInProgress bool
-	DefaultAddrPool        []string
-	SubnetSize             uint32
-	DataPathPort           uint32
-}
-
-// Swarm represents a swarm.
-type Swarm struct {
-	ClusterInfo
-	JoinTokens JoinTokens
-}
-
-// JoinTokens contains the tokens workers and managers need to join the swarm.
-type JoinTokens struct {
-	// Worker is the join token workers may use to join the swarm.
-	Worker string
-	// Manager is the join token managers may use to join the swarm.
-	Manager string
-}
-
-// Spec represents the spec of a swarm.
-type Spec struct {
-	Annotations
-
-	Orchestration    OrchestrationConfig `json:",omitempty"`
-	Raft             RaftConfig          `json:",omitempty"`
-	Dispatcher       DispatcherConfig    `json:",omitempty"`
-	CAConfig         CAConfig            `json:",omitempty"`
-	TaskDefaults     TaskDefaults        `json:",omitempty"`
-	EncryptionConfig EncryptionConfig    `json:",omitempty"`
-}
-
-// OrchestrationConfig represents orchestration configuration.
-type OrchestrationConfig struct {
-	// TaskHistoryRetentionLimit is the number of historic tasks to keep per instance or
-	// node. If negative, never remove completed or failed tasks.
-	TaskHistoryRetentionLimit *int64 `json:",omitempty"`
-}
-
-// TaskDefaults parameterizes cluster-level task creation with default values.
-type TaskDefaults struct {
-	// LogDriver selects the log driver to use for tasks created in the
-	// orchestrator if unspecified by a service.
-	//
-	// Updating this value will only have an affect on new tasks. Old tasks
-	// will continue use their previously configured log driver until
-	// recreated.
-	LogDriver *Driver `json:",omitempty"`
-}
-
-// EncryptionConfig controls at-rest encryption of data and keys.
-type EncryptionConfig struct {
-	// AutoLockManagers specifies whether or not managers TLS keys and raft data
-	// should be encrypted at rest in such a way that they must be unlocked
-	// before the manager node starts up again.
-	AutoLockManagers bool
-}
-
-// RaftConfig represents raft configuration.
-type RaftConfig struct {
-	// SnapshotInterval is the number of log entries between snapshots.
-	SnapshotInterval uint64 `json:",omitempty"`
-
-	// KeepOldSnapshots is the number of snapshots to keep beyond the
-	// current snapshot.
-	KeepOldSnapshots *uint64 `json:",omitempty"`
-
-	// LogEntriesForSlowFollowers is the number of log entries to keep
-	// around to sync up slow followers after a snapshot is created.
-	LogEntriesForSlowFollowers uint64 `json:",omitempty"`
-
-	// ElectionTick is the number of ticks that a follower will wait for a message
-	// from the leader before becoming a candidate and starting an election.
-	// ElectionTick must be greater than HeartbeatTick.
-	//
-	// A tick currently defaults to one second, so these translate directly to
-	// seconds currently, but this is NOT guaranteed.
-	ElectionTick int
-
-	// HeartbeatTick is the number of ticks between heartbeats. Every
-	// HeartbeatTick ticks, the leader will send a heartbeat to the
-	// followers.
-	//
-	// A tick currently defaults to one second, so these translate directly to
-	// seconds currently, but this is NOT guaranteed.
-	HeartbeatTick int
-}
-
-// DispatcherConfig represents dispatcher configuration.
-type DispatcherConfig struct {
-	// HeartbeatPeriod defines how often agent should send heartbeats to
-	// dispatcher.
-	HeartbeatPeriod time.Duration `json:",omitempty"`
-}
-
-// CAConfig represents CA configuration.
-type CAConfig struct {
-	// NodeCertExpiry is the duration certificates should be issued for
-	NodeCertExpiry time.Duration `json:",omitempty"`
-
-	// ExternalCAs is a list of CAs to which a manager node will make
-	// certificate signing requests for node certificates.
-	ExternalCAs []*ExternalCA `json:",omitempty"`
-
-	// SigningCACert and SigningCAKey specify the desired signing root CA and
-	// root CA key for the swarm.  When inspecting the cluster, the key will
-	// be redacted.
-	SigningCACert string `json:",omitempty"`
-	SigningCAKey  string `json:",omitempty"`
-
-	// If this value changes, and there is no specified signing cert and key,
-	// then the swarm is forced to generate a new root certificate and key.
-	ForceRotate uint64 `json:",omitempty"`
-}
-
-// ExternalCAProtocol represents type of external CA.
-type ExternalCAProtocol string
-
-// ExternalCAProtocolCFSSL CFSSL
-const ExternalCAProtocolCFSSL ExternalCAProtocol = "cfssl"
-
-// ExternalCA defines external CA to be used by the cluster.
-type ExternalCA struct {
-	// Protocol is the protocol used by this external CA.
-	Protocol ExternalCAProtocol
-
-	// URL is the URL where the external CA can be reached.
-	URL string
-
-	// Options is a set of additional key/value pairs whose interpretation
-	// depends on the specified CA type.
-	Options map[string]string `json:",omitempty"`
-
-	// CACert specifies which root CA is used by this external CA.  This certificate must
-	// be in PEM format.
-	CACert string
-}
-
-// InitRequest is the request used to init a swarm.
-type InitRequest struct {
-	ListenAddr       string
-	AdvertiseAddr    string
-	DataPathAddr     string
-	DataPathPort     uint32
-	ForceNewCluster  bool
-	Spec             Spec
-	AutoLockManagers bool
-	Availability     NodeAvailability
-	DefaultAddrPool  []string
-	SubnetSize       uint32
-}
-
-// JoinRequest is the request used to join a swarm.
-type JoinRequest struct {
-	ListenAddr    string
-	AdvertiseAddr string
-	DataPathAddr  string
-	RemoteAddrs   []string
-	JoinToken     string // accept by secret
-	Availability  NodeAvailability
-}
-
-// UnlockRequest is the request used to unlock a swarm.
-type UnlockRequest struct {
-	// UnlockKey is the unlock key in ASCII-armored format.
-	UnlockKey string
-}
-
-// LocalNodeState represents the state of the local node.
-type LocalNodeState string
-
-const (
-	// LocalNodeStateInactive INACTIVE
-	LocalNodeStateInactive LocalNodeState = "inactive"
-	// LocalNodeStatePending PENDING
-	LocalNodeStatePending LocalNodeState = "pending"
-	// LocalNodeStateActive ACTIVE
-	LocalNodeStateActive LocalNodeState = "active"
-	// LocalNodeStateError ERROR
-	LocalNodeStateError LocalNodeState = "error"
-	// LocalNodeStateLocked LOCKED
-	LocalNodeStateLocked LocalNodeState = "locked"
-)
-
-// Info represents generic information about swarm.
-type Info struct {
-	NodeID   string
-	NodeAddr string
-
-	LocalNodeState   LocalNodeState
-	ControlAvailable bool
-	Error            string
-
-	RemoteManagers []Peer
-	Nodes          int `json:",omitempty"`
-	Managers       int `json:",omitempty"`
-
-	Cluster *ClusterInfo `json:",omitempty"`
-
-	Warnings []string `json:",omitempty"`
-}
-
-// Status provides information about the current swarm status and role,
-// obtained from the "Swarm" header in the API response.
-type Status struct {
-	// NodeState represents the state of the node.
-	NodeState LocalNodeState
-
-	// ControlAvailable indicates if the node is a swarm manager.
-	ControlAvailable bool
-}
-
-// Peer represents a peer.
-type Peer struct {
-	NodeID string
-	Addr   string
-}
-
-// UpdateFlags contains flags for SwarmUpdate.
-type UpdateFlags struct {
-	RotateWorkerToken      bool
-	RotateManagerToken     bool
-	RotateManagerUnlockKey bool
-}
diff --git a/vendor/github.com/docker/docker/api/types/swarm/task.go b/vendor/github.com/docker/docker/api/types/swarm/task.go
deleted file mode 100644
index ad3eeca0b..000000000
--- a/vendor/github.com/docker/docker/api/types/swarm/task.go
+++ /dev/null
@@ -1,225 +0,0 @@
-package swarm // import "github.com/docker/docker/api/types/swarm"
-
-import (
-	"time"
-
-	"github.com/docker/docker/api/types/swarm/runtime"
-)
-
-// TaskState represents the state of a task.
-type TaskState string
-
-const (
-	// TaskStateNew NEW
-	TaskStateNew TaskState = "new"
-	// TaskStateAllocated ALLOCATED
-	TaskStateAllocated TaskState = "allocated"
-	// TaskStatePending PENDING
-	TaskStatePending TaskState = "pending"
-	// TaskStateAssigned ASSIGNED
-	TaskStateAssigned TaskState = "assigned"
-	// TaskStateAccepted ACCEPTED
-	TaskStateAccepted TaskState = "accepted"
-	// TaskStatePreparing PREPARING
-	TaskStatePreparing TaskState = "preparing"
-	// TaskStateReady READY
-	TaskStateReady TaskState = "ready"
-	// TaskStateStarting STARTING
-	TaskStateStarting TaskState = "starting"
-	// TaskStateRunning RUNNING
-	TaskStateRunning TaskState = "running"
-	// TaskStateComplete COMPLETE
-	TaskStateComplete TaskState = "complete"
-	// TaskStateShutdown SHUTDOWN
-	TaskStateShutdown TaskState = "shutdown"
-	// TaskStateFailed FAILED
-	TaskStateFailed TaskState = "failed"
-	// TaskStateRejected REJECTED
-	TaskStateRejected TaskState = "rejected"
-	// TaskStateRemove REMOVE
-	TaskStateRemove TaskState = "remove"
-	// TaskStateOrphaned ORPHANED
-	TaskStateOrphaned TaskState = "orphaned"
-)
-
-// Task represents a task.
-type Task struct {
-	ID string
-	Meta
-	Annotations
-
-	Spec                TaskSpec            `json:",omitempty"`
-	ServiceID           string              `json:",omitempty"`
-	Slot                int                 `json:",omitempty"`
-	NodeID              string              `json:",omitempty"`
-	Status              TaskStatus          `json:",omitempty"`
-	DesiredState        TaskState           `json:",omitempty"`
-	NetworksAttachments []NetworkAttachment `json:",omitempty"`
-	GenericResources    []GenericResource   `json:",omitempty"`
-
-	// JobIteration is the JobIteration of the Service that this Task was
-	// spawned from, if the Service is a ReplicatedJob or GlobalJob. This is
-	// used to determine which Tasks belong to which run of the job. This field
-	// is absent if the Service mode is Replicated or Global.
-	JobIteration *Version `json:",omitempty"`
-
-	// Volumes is the list of VolumeAttachments for this task. It specifies
-	// which particular volumes are to be used by this particular task, and
-	// fulfilling what mounts in the spec.
-	Volumes []VolumeAttachment
-}
-
-// TaskSpec represents the spec of a task.
-type TaskSpec struct {
-	// ContainerSpec, NetworkAttachmentSpec, and PluginSpec are mutually exclusive.
-	// PluginSpec is only used when the `Runtime` field is set to `plugin`
-	// NetworkAttachmentSpec is used if the `Runtime` field is set to
-	// `attachment`.
-	ContainerSpec         *ContainerSpec         `json:",omitempty"`
-	PluginSpec            *runtime.PluginSpec    `json:",omitempty"`
-	NetworkAttachmentSpec *NetworkAttachmentSpec `json:",omitempty"`
-
-	Resources     *ResourceRequirements     `json:",omitempty"`
-	RestartPolicy *RestartPolicy            `json:",omitempty"`
-	Placement     *Placement                `json:",omitempty"`
-	Networks      []NetworkAttachmentConfig `json:",omitempty"`
-
-	// LogDriver specifies the LogDriver to use for tasks created from this
-	// spec. If not present, the one on cluster default on swarm.Spec will be
-	// used, finally falling back to the engine default if not specified.
-	LogDriver *Driver `json:",omitempty"`
-
-	// ForceUpdate is a counter that triggers an update even if no relevant
-	// parameters have been changed.
-	ForceUpdate uint64
-
-	Runtime RuntimeType `json:",omitempty"`
-}
-
-// Resources represents resources (CPU/Memory) which can be advertised by a
-// node and requested to be reserved for a task.
-type Resources struct {
-	NanoCPUs         int64             `json:",omitempty"`
-	MemoryBytes      int64             `json:",omitempty"`
-	GenericResources []GenericResource `json:",omitempty"`
-}
-
-// Limit describes limits on resources which can be requested by a task.
-type Limit struct {
-	NanoCPUs    int64 `json:",omitempty"`
-	MemoryBytes int64 `json:",omitempty"`
-	Pids        int64 `json:",omitempty"`
-}
-
-// GenericResource represents a "user defined" resource which can
-// be either an integer (e.g: SSD=3) or a string (e.g: SSD=sda1)
-type GenericResource struct {
-	NamedResourceSpec    *NamedGenericResource    `json:",omitempty"`
-	DiscreteResourceSpec *DiscreteGenericResource `json:",omitempty"`
-}
-
-// NamedGenericResource represents a "user defined" resource which is defined
-// as a string.
-// "Kind" is used to describe the Kind of a resource (e.g: "GPU", "FPGA", "SSD", ...)
-// Value is used to identify the resource (GPU="UUID-1", FPGA="/dev/sdb5", ...)
-type NamedGenericResource struct {
-	Kind  string `json:",omitempty"`
-	Value string `json:",omitempty"`
-}
-
-// DiscreteGenericResource represents a "user defined" resource which is defined
-// as an integer
-// "Kind" is used to describe the Kind of a resource (e.g: "GPU", "FPGA", "SSD", ...)
-// Value is used to count the resource (SSD=5, HDD=3, ...)
-type DiscreteGenericResource struct {
-	Kind  string `json:",omitempty"`
-	Value int64  `json:",omitempty"`
-}
-
-// ResourceRequirements represents resources requirements.
-type ResourceRequirements struct {
-	Limits       *Limit     `json:",omitempty"`
-	Reservations *Resources `json:",omitempty"`
-}
-
-// Placement represents orchestration parameters.
-type Placement struct {
-	Constraints []string              `json:",omitempty"`
-	Preferences []PlacementPreference `json:",omitempty"`
-	MaxReplicas uint64                `json:",omitempty"`
-
-	// Platforms stores all the platforms that the image can run on.
-	// This field is used in the platform filter for scheduling. If empty,
-	// then the platform filter is off, meaning there are no scheduling restrictions.
-	Platforms []Platform `json:",omitempty"`
-}
-
-// PlacementPreference provides a way to make the scheduler aware of factors
-// such as topology.
-type PlacementPreference struct {
-	Spread *SpreadOver
-}
-
-// SpreadOver is a scheduling preference that instructs the scheduler to spread
-// tasks evenly over groups of nodes identified by labels.
-type SpreadOver struct {
-	// label descriptor, such as engine.labels.az
-	SpreadDescriptor string
-}
-
-// RestartPolicy represents the restart policy.
-type RestartPolicy struct {
-	Condition   RestartPolicyCondition `json:",omitempty"`
-	Delay       *time.Duration         `json:",omitempty"`
-	MaxAttempts *uint64                `json:",omitempty"`
-	Window      *time.Duration         `json:",omitempty"`
-}
-
-// RestartPolicyCondition represents when to restart.
-type RestartPolicyCondition string
-
-const (
-	// RestartPolicyConditionNone NONE
-	RestartPolicyConditionNone RestartPolicyCondition = "none"
-	// RestartPolicyConditionOnFailure ON_FAILURE
-	RestartPolicyConditionOnFailure RestartPolicyCondition = "on-failure"
-	// RestartPolicyConditionAny ANY
-	RestartPolicyConditionAny RestartPolicyCondition = "any"
-)
-
-// TaskStatus represents the status of a task.
-type TaskStatus struct {
-	Timestamp       time.Time        `json:",omitempty"`
-	State           TaskState        `json:",omitempty"`
-	Message         string           `json:",omitempty"`
-	Err             string           `json:",omitempty"`
-	ContainerStatus *ContainerStatus `json:",omitempty"`
-	PortStatus      PortStatus       `json:",omitempty"`
-}
-
-// ContainerStatus represents the status of a container.
-type ContainerStatus struct {
-	ContainerID string
-	PID         int
-	ExitCode    int
-}
-
-// PortStatus represents the port status of a task's host ports whose
-// service has published host ports
-type PortStatus struct {
-	Ports []PortConfig `json:",omitempty"`
-}
-
-// VolumeAttachment contains the associating a Volume to a Task.
-type VolumeAttachment struct {
-	// ID is the Swarmkit ID of the Volume. This is not the CSI VolumeId.
-	ID string `json:",omitempty"`
-
-	// Source, together with Target, indicates the Mount, as specified in the
-	// ContainerSpec, that this volume fulfills.
-	Source string `json:",omitempty"`
-
-	// Target, together with Source, indicates the Mount, as specified
-	// in the ContainerSpec, that this volume fulfills.
-	Target string `json:",omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/system/info.go b/vendor/github.com/docker/docker/api/types/system/info.go
deleted file mode 100644
index c66a2afb8..000000000
--- a/vendor/github.com/docker/docker/api/types/system/info.go
+++ /dev/null
@@ -1,148 +0,0 @@
-package system
-
-import (
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/registry"
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// Info contains response of Engine API:
-// GET "/info"
-type Info struct {
-	ID                 string
-	Containers         int
-	ContainersRunning  int
-	ContainersPaused   int
-	ContainersStopped  int
-	Images             int
-	Driver             string
-	DriverStatus       [][2]string
-	SystemStatus       [][2]string `json:",omitempty"` // SystemStatus is only propagated by the Swarm standalone API
-	Plugins            PluginsInfo
-	MemoryLimit        bool
-	SwapLimit          bool
-	KernelMemory       bool `json:",omitempty"` // Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes
-	KernelMemoryTCP    bool `json:",omitempty"` // KernelMemoryTCP is not supported on cgroups v2.
-	CPUCfsPeriod       bool `json:"CpuCfsPeriod"`
-	CPUCfsQuota        bool `json:"CpuCfsQuota"`
-	CPUShares          bool
-	CPUSet             bool
-	PidsLimit          bool
-	IPv4Forwarding     bool
-	BridgeNfIptables   bool
-	BridgeNfIP6tables  bool `json:"BridgeNfIp6tables"`
-	Debug              bool
-	NFd                int
-	OomKillDisable     bool
-	NGoroutines        int
-	SystemTime         string
-	LoggingDriver      string
-	CgroupDriver       string
-	CgroupVersion      string `json:",omitempty"`
-	NEventsListener    int
-	KernelVersion      string
-	OperatingSystem    string
-	OSVersion          string
-	OSType             string
-	Architecture       string
-	IndexServerAddress string
-	RegistryConfig     *registry.ServiceConfig
-	NCPU               int
-	MemTotal           int64
-	GenericResources   []swarm.GenericResource
-	DockerRootDir      string
-	HTTPProxy          string `json:"HttpProxy"`
-	HTTPSProxy         string `json:"HttpsProxy"`
-	NoProxy            string
-	Name               string
-	Labels             []string
-	ExperimentalBuild  bool
-	ServerVersion      string
-	Runtimes           map[string]RuntimeWithStatus
-	DefaultRuntime     string
-	Swarm              swarm.Info
-	// LiveRestoreEnabled determines whether containers should be kept
-	// running when the daemon is shutdown or upon daemon start if
-	// running containers are detected
-	LiveRestoreEnabled  bool
-	Isolation           container.Isolation
-	InitBinary          string
-	ContainerdCommit    Commit
-	RuncCommit          Commit
-	InitCommit          Commit
-	SecurityOptions     []string
-	ProductLicense      string               `json:",omitempty"`
-	DefaultAddressPools []NetworkAddressPool `json:",omitempty"`
-	CDISpecDirs         []string
-
-	Containerd *ContainerdInfo `json:",omitempty"`
-
-	// Warnings contains a slice of warnings that occurred  while collecting
-	// system information. These warnings are intended to be informational
-	// messages for the user, and are not intended to be parsed / used for
-	// other purposes, as they do not have a fixed format.
-	Warnings []string
-}
-
-// ContainerdInfo holds information about the containerd instance used by the daemon.
-type ContainerdInfo struct {
-	// Address is the path to the containerd socket.
-	Address string `json:",omitempty"`
-	// Namespaces is the containerd namespaces used by the daemon.
-	Namespaces ContainerdNamespaces
-}
-
-// ContainerdNamespaces reflects the containerd namespaces used by the daemon.
-//
-// These namespaces can be configured in the daemon configuration, and are
-// considered to be used exclusively by the daemon,
-//
-// As these namespaces are considered to be exclusively accessed
-// by the daemon, it is not recommended to change these values,
-// or to change them to a value that is used by other systems,
-// such as cri-containerd.
-type ContainerdNamespaces struct {
-	// Containers holds the default containerd namespace used for
-	// containers managed by the daemon.
-	//
-	// The default namespace for containers is "moby", but will be
-	// suffixed with the `<uid>.<gid>` of the remapped `root` if
-	// user-namespaces are enabled and the containerd image-store
-	// is used.
-	Containers string
-
-	// Plugins holds the default containerd namespace used for
-	// plugins managed by the daemon.
-	//
-	// The default namespace for plugins is "moby", but will be
-	// suffixed with the `<uid>.<gid>` of the remapped `root` if
-	// user-namespaces are enabled and the containerd image-store
-	// is used.
-	Plugins string
-}
-
-// PluginsInfo is a temp struct holding Plugins name
-// registered with docker daemon. It is used by [Info] struct
-type PluginsInfo struct {
-	// List of Volume plugins registered
-	Volume []string
-	// List of Network plugins registered
-	Network []string
-	// List of Authorization plugins registered
-	Authorization []string
-	// List of Log plugins registered
-	Log []string
-}
-
-// Commit holds the Git-commit (SHA1) that a binary was built from, as reported
-// in the version-string of external tools, such as containerd, or runC.
-type Commit struct {
-	ID       string // ID is the actual commit ID of external tool.
-	Expected string // Expected is the commit ID of external tool expected by dockerd as set at build time.
-}
-
-// NetworkAddressPool is a temp struct used by [Info] struct.
-type NetworkAddressPool struct {
-	Base string
-	Size int
-}
diff --git a/vendor/github.com/docker/docker/api/types/system/runtime.go b/vendor/github.com/docker/docker/api/types/system/runtime.go
deleted file mode 100644
index d077295a0..000000000
--- a/vendor/github.com/docker/docker/api/types/system/runtime.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package system
-
-// Runtime describes an OCI runtime
-type Runtime struct {
-	// "Legacy" runtime configuration for runc-compatible runtimes.
-
-	Path string   `json:"path,omitempty"`
-	Args []string `json:"runtimeArgs,omitempty"`
-
-	// Shimv2 runtime configuration. Mutually exclusive with the legacy config above.
-
-	Type    string                 `json:"runtimeType,omitempty"`
-	Options map[string]interface{} `json:"options,omitempty"`
-}
-
-// RuntimeWithStatus extends [Runtime] to hold [RuntimeStatus].
-type RuntimeWithStatus struct {
-	Runtime
-	Status map[string]string `json:"status,omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/system/security_opts.go b/vendor/github.com/docker/docker/api/types/system/security_opts.go
deleted file mode 100644
index edff3eb1a..000000000
--- a/vendor/github.com/docker/docker/api/types/system/security_opts.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package system
-
-import (
-	"errors"
-	"fmt"
-	"strings"
-)
-
-// SecurityOpt contains the name and options of a security option
-type SecurityOpt struct {
-	Name    string
-	Options []KeyValue
-}
-
-// DecodeSecurityOptions decodes a security options string slice to a
-// type-safe [SecurityOpt].
-func DecodeSecurityOptions(opts []string) ([]SecurityOpt, error) {
-	so := []SecurityOpt{}
-	for _, opt := range opts {
-		// support output from a < 1.13 docker daemon
-		if !strings.Contains(opt, "=") {
-			so = append(so, SecurityOpt{Name: opt})
-			continue
-		}
-		secopt := SecurityOpt{}
-		for _, s := range strings.Split(opt, ",") {
-			k, v, ok := strings.Cut(s, "=")
-			if !ok {
-				return nil, fmt.Errorf("invalid security option %q", s)
-			}
-			if k == "" || v == "" {
-				return nil, errors.New("invalid empty security option")
-			}
-			if k == "name" {
-				secopt.Name = v
-				continue
-			}
-			secopt.Options = append(secopt.Options, KeyValue{Key: k, Value: v})
-		}
-		so = append(so, secopt)
-	}
-	return so, nil
-}
-
-// KeyValue holds a key/value pair.
-type KeyValue struct {
-	Key, Value string
-}
diff --git a/vendor/github.com/docker/docker/api/types/time/timestamp.go b/vendor/github.com/docker/docker/api/types/time/timestamp.go
deleted file mode 100644
index cab5c32e3..000000000
--- a/vendor/github.com/docker/docker/api/types/time/timestamp.go
+++ /dev/null
@@ -1,131 +0,0 @@
-package time // import "github.com/docker/docker/api/types/time"
-
-import (
-	"fmt"
-	"math"
-	"strconv"
-	"strings"
-	"time"
-)
-
-// These are additional predefined layouts for use in Time.Format and Time.Parse
-// with --since and --until parameters for `docker logs` and `docker events`
-const (
-	rFC3339Local     = "2006-01-02T15:04:05"           // RFC3339 with local timezone
-	rFC3339NanoLocal = "2006-01-02T15:04:05.999999999" // RFC3339Nano with local timezone
-	dateWithZone     = "2006-01-02Z07:00"              // RFC3339 with time at 00:00:00
-	dateLocal        = "2006-01-02"                    // RFC3339 with local timezone and time at 00:00:00
-)
-
-// GetTimestamp tries to parse given string as golang duration,
-// then RFC3339 time and finally as a Unix timestamp. If
-// any of these were successful, it returns a Unix timestamp
-// as string otherwise returns the given value back.
-// In case of duration input, the returned timestamp is computed
-// as the given reference time minus the amount of the duration.
-func GetTimestamp(value string, reference time.Time) (string, error) {
-	if d, err := time.ParseDuration(value); value != "0" && err == nil {
-		return strconv.FormatInt(reference.Add(-d).Unix(), 10), nil
-	}
-
-	var format string
-	// if the string has a Z or a + or three dashes use parse otherwise use parseinlocation
-	parseInLocation := !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3)
-
-	if strings.Contains(value, ".") {
-		if parseInLocation {
-			format = rFC3339NanoLocal
-		} else {
-			format = time.RFC3339Nano
-		}
-	} else if strings.Contains(value, "T") {
-		// we want the number of colons in the T portion of the timestamp
-		tcolons := strings.Count(value, ":")
-		// if parseInLocation is off and we have a +/- zone offset (not Z) then
-		// there will be an extra colon in the input for the tz offset subtract that
-		// colon from the tcolons count
-		if !parseInLocation && !strings.ContainsAny(value, "zZ") && tcolons > 0 {
-			tcolons--
-		}
-		if parseInLocation {
-			switch tcolons {
-			case 0:
-				format = "2006-01-02T15"
-			case 1:
-				format = "2006-01-02T15:04"
-			default:
-				format = rFC3339Local
-			}
-		} else {
-			switch tcolons {
-			case 0:
-				format = "2006-01-02T15Z07:00"
-			case 1:
-				format = "2006-01-02T15:04Z07:00"
-			default:
-				format = time.RFC3339
-			}
-		}
-	} else if parseInLocation {
-		format = dateLocal
-	} else {
-		format = dateWithZone
-	}
-
-	var t time.Time
-	var err error
-
-	if parseInLocation {
-		t, err = time.ParseInLocation(format, value, time.FixedZone(reference.Zone()))
-	} else {
-		t, err = time.Parse(format, value)
-	}
-
-	if err != nil {
-		// if there is a `-` then it's an RFC3339 like timestamp
-		if strings.Contains(value, "-") {
-			return "", err // was probably an RFC3339 like timestamp but the parser failed with an error
-		}
-		if _, _, err := parseTimestamp(value); err != nil {
-			return "", fmt.Errorf("failed to parse value as time or duration: %q", value)
-		}
-		return value, nil // unix timestamp in and out case (meaning: the value passed at the command line is already in the right format for passing to the server)
-	}
-
-	return fmt.Sprintf("%d.%09d", t.Unix(), int64(t.Nanosecond())), nil
-}
-
-// ParseTimestamps returns seconds and nanoseconds from a timestamp that has
-// the format ("%d.%09d", time.Unix(), int64(time.Nanosecond())).
-// If the incoming nanosecond portion is longer than 9 digits it is truncated.
-// The expectation is that the seconds and nanoseconds will be used to create a
-// time variable.  For example:
-//
-//	seconds, nanoseconds, _ := ParseTimestamp("1136073600.000000001",0)
-//	since := time.Unix(seconds, nanoseconds)
-//
-// returns seconds as defaultSeconds if value == ""
-func ParseTimestamps(value string, defaultSeconds int64) (seconds int64, nanoseconds int64, err error) {
-	if value == "" {
-		return defaultSeconds, 0, nil
-	}
-	return parseTimestamp(value)
-}
-
-func parseTimestamp(value string) (sec int64, nsec int64, err error) {
-	s, n, ok := strings.Cut(value, ".")
-	sec, err = strconv.ParseInt(s, 10, 64)
-	if err != nil {
-		return sec, 0, err
-	}
-	if !ok {
-		return sec, 0, nil
-	}
-	nsec, err = strconv.ParseInt(n, 10, 64)
-	if err != nil {
-		return sec, nsec, err
-	}
-	// should already be in nanoseconds but just in case convert n to nanoseconds
-	nsec = int64(float64(nsec) * math.Pow(float64(10), float64(9-len(n))))
-	return sec, nsec, nil
-}
diff --git a/vendor/github.com/docker/docker/api/types/types.go b/vendor/github.com/docker/docker/api/types/types.go
deleted file mode 100644
index ea55813e6..000000000
--- a/vendor/github.com/docker/docker/api/types/types.go
+++ /dev/null
@@ -1,489 +0,0 @@
-package types // import "github.com/docker/docker/api/types"
-
-import (
-	"time"
-
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/image"
-	"github.com/docker/docker/api/types/mount"
-	"github.com/docker/docker/api/types/network"
-	"github.com/docker/docker/api/types/swarm"
-	"github.com/docker/docker/api/types/volume"
-	"github.com/docker/go-connections/nat"
-)
-
-const (
-	// MediaTypeRawStream is vendor specific MIME-Type set for raw TTY streams
-	MediaTypeRawStream = "application/vnd.docker.raw-stream"
-
-	// MediaTypeMultiplexedStream is vendor specific MIME-Type set for stdin/stdout/stderr multiplexed streams
-	MediaTypeMultiplexedStream = "application/vnd.docker.multiplexed-stream"
-)
-
-// RootFS returns Image's RootFS description including the layer IDs.
-type RootFS struct {
-	Type   string   `json:",omitempty"`
-	Layers []string `json:",omitempty"`
-}
-
-// ImageInspect contains response of Engine API:
-// GET "/images/{name:.*}/json"
-type ImageInspect struct {
-	// ID is the content-addressable ID of an image.
-	//
-	// This identifier is a content-addressable digest calculated from the
-	// image's configuration (which includes the digests of layers used by
-	// the image).
-	//
-	// Note that this digest differs from the `RepoDigests` below, which
-	// holds digests of image manifests that reference the image.
-	ID string `json:"Id"`
-
-	// RepoTags is a list of image names/tags in the local image cache that
-	// reference this image.
-	//
-	// Multiple image tags can refer to the same image, and this list may be
-	// empty if no tags reference the image, in which case the image is
-	// "untagged", in which case it can still be referenced by its ID.
-	RepoTags []string
-
-	// RepoDigests is a list of content-addressable digests of locally available
-	// image manifests that the image is referenced from. Multiple manifests can
-	// refer to the same image.
-	//
-	// These digests are usually only available if the image was either pulled
-	// from a registry, or if the image was pushed to a registry, which is when
-	// the manifest is generated and its digest calculated.
-	RepoDigests []string
-
-	// Parent is the ID of the parent image.
-	//
-	// Depending on how the image was created, this field may be empty and
-	// is only set for images that were built/created locally. This field
-	// is empty if the image was pulled from an image registry.
-	Parent string
-
-	// Comment is an optional message that can be set when committing or
-	// importing the image.
-	Comment string
-
-	// Created is the date and time at which the image was created, formatted in
-	// RFC 3339 nano-seconds (time.RFC3339Nano).
-	//
-	// This information is only available if present in the image,
-	// and omitted otherwise.
-	Created string `json:",omitempty"`
-
-	// Container is the ID of the container that was used to create the image.
-	//
-	// Depending on how the image was created, this field may be empty.
-	//
-	// Deprecated: this field is omitted in API v1.45, but kept for backward compatibility.
-	Container string `json:",omitempty"`
-
-	// ContainerConfig is an optional field containing the configuration of the
-	// container that was last committed when creating the image.
-	//
-	// Previous versions of Docker builder used this field to store build cache,
-	// and it is not in active use anymore.
-	//
-	// Deprecated: this field is omitted in API v1.45, but kept for backward compatibility.
-	ContainerConfig *container.Config `json:",omitempty"`
-
-	// DockerVersion is the version of Docker that was used to build the image.
-	//
-	// Depending on how the image was created, this field may be empty.
-	DockerVersion string
-
-	// Author is the name of the author that was specified when committing the
-	// image, or as specified through MAINTAINER (deprecated) in the Dockerfile.
-	Author string
-	Config *container.Config
-
-	// Architecture is the hardware CPU architecture that the image runs on.
-	Architecture string
-
-	// Variant is the CPU architecture variant (presently ARM-only).
-	Variant string `json:",omitempty"`
-
-	// OS is the Operating System the image is built to run on.
-	Os string
-
-	// OsVersion is the version of the Operating System the image is built to
-	// run on (especially for Windows).
-	OsVersion string `json:",omitempty"`
-
-	// Size is the total size of the image including all layers it is composed of.
-	Size int64
-
-	// VirtualSize is the total size of the image including all layers it is
-	// composed of.
-	//
-	// Deprecated: this field is omitted in API v1.44, but kept for backward compatibility. Use Size instead.
-	VirtualSize int64 `json:"VirtualSize,omitempty"`
-
-	// GraphDriver holds information about the storage driver used to store the
-	// container's and image's filesystem.
-	GraphDriver GraphDriverData
-
-	// RootFS contains information about the image's RootFS, including the
-	// layer IDs.
-	RootFS RootFS
-
-	// Metadata of the image in the local cache.
-	//
-	// This information is local to the daemon, and not part of the image itself.
-	Metadata image.Metadata
-}
-
-// Container contains response of Engine API:
-// GET "/containers/json"
-type Container struct {
-	ID         string `json:"Id"`
-	Names      []string
-	Image      string
-	ImageID    string
-	Command    string
-	Created    int64
-	Ports      []Port
-	SizeRw     int64 `json:",omitempty"`
-	SizeRootFs int64 `json:",omitempty"`
-	Labels     map[string]string
-	State      string
-	Status     string
-	HostConfig struct {
-		NetworkMode string            `json:",omitempty"`
-		Annotations map[string]string `json:",omitempty"`
-	}
-	NetworkSettings *SummaryNetworkSettings
-	Mounts          []MountPoint
-}
-
-// Ping contains response of Engine API:
-// GET "/_ping"
-type Ping struct {
-	APIVersion     string
-	OSType         string
-	Experimental   bool
-	BuilderVersion BuilderVersion
-
-	// SwarmStatus provides information about the current swarm status of the
-	// engine, obtained from the "Swarm" header in the API response.
-	//
-	// It can be a nil struct if the API version does not provide this header
-	// in the ping response, or if an error occurred, in which case the client
-	// should use other ways to get the current swarm status, such as the /swarm
-	// endpoint.
-	SwarmStatus *swarm.Status
-}
-
-// ComponentVersion describes the version information for a specific component.
-type ComponentVersion struct {
-	Name    string
-	Version string
-	Details map[string]string `json:",omitempty"`
-}
-
-// Version contains response of Engine API:
-// GET "/version"
-type Version struct {
-	Platform   struct{ Name string } `json:",omitempty"`
-	Components []ComponentVersion    `json:",omitempty"`
-
-	// The following fields are deprecated, they relate to the Engine component and are kept for backwards compatibility
-
-	Version       string
-	APIVersion    string `json:"ApiVersion"`
-	MinAPIVersion string `json:"MinAPIVersion,omitempty"`
-	GitCommit     string
-	GoVersion     string
-	Os            string
-	Arch          string
-	KernelVersion string `json:",omitempty"`
-	Experimental  bool   `json:",omitempty"`
-	BuildTime     string `json:",omitempty"`
-}
-
-// HealthcheckResult stores information about a single run of a healthcheck probe
-type HealthcheckResult struct {
-	Start    time.Time // Start is the time this check started
-	End      time.Time // End is the time this check ended
-	ExitCode int       // ExitCode meanings: 0=healthy, 1=unhealthy, 2=reserved (considered unhealthy), else=error running probe
-	Output   string    // Output from last check
-}
-
-// Health states
-const (
-	NoHealthcheck = "none"      // Indicates there is no healthcheck
-	Starting      = "starting"  // Starting indicates that the container is not yet ready
-	Healthy       = "healthy"   // Healthy indicates that the container is running correctly
-	Unhealthy     = "unhealthy" // Unhealthy indicates that the container has a problem
-)
-
-// Health stores information about the container's healthcheck results
-type Health struct {
-	Status        string               // Status is one of Starting, Healthy or Unhealthy
-	FailingStreak int                  // FailingStreak is the number of consecutive failures
-	Log           []*HealthcheckResult // Log contains the last few results (oldest first)
-}
-
-// ContainerState stores container's running state
-// it's part of ContainerJSONBase and will return by "inspect" command
-type ContainerState struct {
-	Status     string // String representation of the container state. Can be one of "created", "running", "paused", "restarting", "removing", "exited", or "dead"
-	Running    bool
-	Paused     bool
-	Restarting bool
-	OOMKilled  bool
-	Dead       bool
-	Pid        int
-	ExitCode   int
-	Error      string
-	StartedAt  string
-	FinishedAt string
-	Health     *Health `json:",omitempty"`
-}
-
-// ContainerJSONBase contains response of Engine API:
-// GET "/containers/{name:.*}/json"
-type ContainerJSONBase struct {
-	ID              string `json:"Id"`
-	Created         string
-	Path            string
-	Args            []string
-	State           *ContainerState
-	Image           string
-	ResolvConfPath  string
-	HostnamePath    string
-	HostsPath       string
-	LogPath         string
-	Node            *ContainerNode `json:",omitempty"` // Deprecated: Node was only propagated by Docker Swarm standalone API. It sill be removed in the next release.
-	Name            string
-	RestartCount    int
-	Driver          string
-	Platform        string
-	MountLabel      string
-	ProcessLabel    string
-	AppArmorProfile string
-	ExecIDs         []string
-	HostConfig      *container.HostConfig
-	GraphDriver     GraphDriverData
-	SizeRw          *int64 `json:",omitempty"`
-	SizeRootFs      *int64 `json:",omitempty"`
-}
-
-// ContainerJSON is newly used struct along with MountPoint
-type ContainerJSON struct {
-	*ContainerJSONBase
-	Mounts          []MountPoint
-	Config          *container.Config
-	NetworkSettings *NetworkSettings
-}
-
-// NetworkSettings exposes the network settings in the api
-type NetworkSettings struct {
-	NetworkSettingsBase
-	DefaultNetworkSettings
-	Networks map[string]*network.EndpointSettings
-}
-
-// SummaryNetworkSettings provides a summary of container's networks
-// in /containers/json
-type SummaryNetworkSettings struct {
-	Networks map[string]*network.EndpointSettings
-}
-
-// NetworkSettingsBase holds networking state for a container when inspecting it.
-type NetworkSettingsBase struct {
-	Bridge     string      // Bridge contains the name of the default bridge interface iff it was set through the daemon --bridge flag.
-	SandboxID  string      // SandboxID uniquely represents a container's network stack
-	SandboxKey string      // SandboxKey identifies the sandbox
-	Ports      nat.PortMap // Ports is a collection of PortBinding indexed by Port
-
-	// HairpinMode specifies if hairpin NAT should be enabled on the virtual interface
-	//
-	// Deprecated: This field is never set and will be removed in a future release.
-	HairpinMode bool
-	// LinkLocalIPv6Address is an IPv6 unicast address using the link-local prefix
-	//
-	// Deprecated: This field is never set and will be removed in a future release.
-	LinkLocalIPv6Address string
-	// LinkLocalIPv6PrefixLen is the prefix length of an IPv6 unicast address
-	//
-	// Deprecated: This field is never set and will be removed in a future release.
-	LinkLocalIPv6PrefixLen int
-	SecondaryIPAddresses   []network.Address // Deprecated: This field is never set and will be removed in a future release.
-	SecondaryIPv6Addresses []network.Address // Deprecated: This field is never set and will be removed in a future release.
-}
-
-// DefaultNetworkSettings holds network information
-// during the 2 release deprecation period.
-// It will be removed in Docker 1.11.
-type DefaultNetworkSettings struct {
-	EndpointID          string // EndpointID uniquely represents a service endpoint in a Sandbox
-	Gateway             string // Gateway holds the gateway address for the network
-	GlobalIPv6Address   string // GlobalIPv6Address holds network's global IPv6 address
-	GlobalIPv6PrefixLen int    // GlobalIPv6PrefixLen represents mask length of network's global IPv6 address
-	IPAddress           string // IPAddress holds the IPv4 address for the network
-	IPPrefixLen         int    // IPPrefixLen represents mask length of network's IPv4 address
-	IPv6Gateway         string // IPv6Gateway holds gateway address specific for IPv6
-	MacAddress          string // MacAddress holds the MAC address for the network
-}
-
-// MountPoint represents a mount point configuration inside the container.
-// This is used for reporting the mountpoints in use by a container.
-type MountPoint struct {
-	// Type is the type of mount, see `Type<foo>` definitions in
-	// github.com/docker/docker/api/types/mount.Type
-	Type mount.Type `json:",omitempty"`
-
-	// Name is the name reference to the underlying data defined by `Source`
-	// e.g., the volume name.
-	Name string `json:",omitempty"`
-
-	// Source is the source location of the mount.
-	//
-	// For volumes, this contains the storage location of the volume (within
-	// `/var/lib/docker/volumes/`). For bind-mounts, and `npipe`, this contains
-	// the source (host) part of the bind-mount. For `tmpfs` mount points, this
-	// field is empty.
-	Source string
-
-	// Destination is the path relative to the container root (`/`) where the
-	// Source is mounted inside the container.
-	Destination string
-
-	// Driver is the volume driver used to create the volume (if it is a volume).
-	Driver string `json:",omitempty"`
-
-	// Mode is a comma separated list of options supplied by the user when
-	// creating the bind/volume mount.
-	//
-	// The default is platform-specific (`"z"` on Linux, empty on Windows).
-	Mode string
-
-	// RW indicates whether the mount is mounted writable (read-write).
-	RW bool
-
-	// Propagation describes how mounts are propagated from the host into the
-	// mount point, and vice-versa. Refer to the Linux kernel documentation
-	// for details:
-	// https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt
-	//
-	// This field is not used on Windows.
-	Propagation mount.Propagation
-}
-
-// DiskUsageObject represents an object type used for disk usage query filtering.
-type DiskUsageObject string
-
-const (
-	// ContainerObject represents a container DiskUsageObject.
-	ContainerObject DiskUsageObject = "container"
-	// ImageObject represents an image DiskUsageObject.
-	ImageObject DiskUsageObject = "image"
-	// VolumeObject represents a volume DiskUsageObject.
-	VolumeObject DiskUsageObject = "volume"
-	// BuildCacheObject represents a build-cache DiskUsageObject.
-	BuildCacheObject DiskUsageObject = "build-cache"
-)
-
-// DiskUsageOptions holds parameters for system disk usage query.
-type DiskUsageOptions struct {
-	// Types specifies what object types to include in the response. If empty,
-	// all object types are returned.
-	Types []DiskUsageObject
-}
-
-// DiskUsage contains response of Engine API:
-// GET "/system/df"
-type DiskUsage struct {
-	LayersSize  int64
-	Images      []*image.Summary
-	Containers  []*Container
-	Volumes     []*volume.Volume
-	BuildCache  []*BuildCache
-	BuilderSize int64 `json:",omitempty"` // Deprecated: deprecated in API 1.38, and no longer used since API 1.40.
-}
-
-// BuildCachePruneReport contains the response for Engine API:
-// POST "/build/prune"
-type BuildCachePruneReport struct {
-	CachesDeleted  []string
-	SpaceReclaimed uint64
-}
-
-// SecretCreateResponse contains the information returned to a client
-// on the creation of a new secret.
-type SecretCreateResponse struct {
-	// ID is the id of the created secret.
-	ID string
-}
-
-// SecretListOptions holds parameters to list secrets
-type SecretListOptions struct {
-	Filters filters.Args
-}
-
-// ConfigCreateResponse contains the information returned to a client
-// on the creation of a new config.
-type ConfigCreateResponse struct {
-	// ID is the id of the created config.
-	ID string
-}
-
-// ConfigListOptions holds parameters to list configs
-type ConfigListOptions struct {
-	Filters filters.Args
-}
-
-// PushResult contains the tag, manifest digest, and manifest size from the
-// push. It's used to signal this information to the trust code in the client
-// so it can sign the manifest if necessary.
-type PushResult struct {
-	Tag    string
-	Digest string
-	Size   int
-}
-
-// BuildResult contains the image id of a successful build
-type BuildResult struct {
-	ID string
-}
-
-// BuildCache contains information about a build cache record.
-type BuildCache struct {
-	// ID is the unique ID of the build cache record.
-	ID string
-	// Parent is the ID of the parent build cache record.
-	//
-	// Deprecated: deprecated in API v1.42 and up, as it was deprecated in BuildKit; use Parents instead.
-	Parent string `json:"Parent,omitempty"`
-	// Parents is the list of parent build cache record IDs.
-	Parents []string `json:" Parents,omitempty"`
-	// Type is the cache record type.
-	Type string
-	// Description is a description of the build-step that produced the build cache.
-	Description string
-	// InUse indicates if the build cache is in use.
-	InUse bool
-	// Shared indicates if the build cache is shared.
-	Shared bool
-	// Size is the amount of disk space used by the build cache (in bytes).
-	Size int64
-	// CreatedAt is the date and time at which the build cache was created.
-	CreatedAt time.Time
-	// LastUsedAt is the date and time at which the build cache was last used.
-	LastUsedAt *time.Time
-	UsageCount int
-}
-
-// BuildCachePruneOptions hold parameters to prune the build cache
-type BuildCachePruneOptions struct {
-	All         bool
-	KeepStorage int64
-	Filters     filters.Args
-
-	// FIXME(thaJeztah): add new options; see https://github.com/moby/moby/issues/48639
-}
diff --git a/vendor/github.com/docker/docker/api/types/types_deprecated.go b/vendor/github.com/docker/docker/api/types/types_deprecated.go
deleted file mode 100644
index 43ffe104a..000000000
--- a/vendor/github.com/docker/docker/api/types/types_deprecated.go
+++ /dev/null
@@ -1,210 +0,0 @@
-package types
-
-import (
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/events"
-	"github.com/docker/docker/api/types/image"
-	"github.com/docker/docker/api/types/network"
-	"github.com/docker/docker/api/types/registry"
-	"github.com/docker/docker/api/types/volume"
-)
-
-// ImagesPruneReport contains the response for Engine API:
-// POST "/images/prune"
-//
-// Deprecated: use [image.PruneReport].
-type ImagesPruneReport = image.PruneReport
-
-// VolumesPruneReport contains the response for Engine API:
-// POST "/volumes/prune".
-//
-// Deprecated: use [volume.PruneReport].
-type VolumesPruneReport = volume.PruneReport
-
-// NetworkCreateRequest is the request message sent to the server for network create call.
-//
-// Deprecated: use [network.CreateRequest].
-type NetworkCreateRequest = network.CreateRequest
-
-// NetworkCreate is the expected body of the "create network" http request message
-//
-// Deprecated: use [network.CreateOptions].
-type NetworkCreate = network.CreateOptions
-
-// NetworkListOptions holds parameters to filter the list of networks with.
-//
-// Deprecated: use [network.ListOptions].
-type NetworkListOptions = network.ListOptions
-
-// NetworkCreateResponse is the response message sent by the server for network create call.
-//
-// Deprecated: use [network.CreateResponse].
-type NetworkCreateResponse = network.CreateResponse
-
-// NetworkInspectOptions holds parameters to inspect network.
-//
-// Deprecated: use [network.InspectOptions].
-type NetworkInspectOptions = network.InspectOptions
-
-// NetworkConnect represents the data to be used to connect a container to the network
-//
-// Deprecated: use [network.ConnectOptions].
-type NetworkConnect = network.ConnectOptions
-
-// NetworkDisconnect represents the data to be used to disconnect a container from the network
-//
-// Deprecated: use [network.DisconnectOptions].
-type NetworkDisconnect = network.DisconnectOptions
-
-// EndpointResource contains network resources allocated and used for a container in a network.
-//
-// Deprecated: use [network.EndpointResource].
-type EndpointResource = network.EndpointResource
-
-// NetworkResource is the body of the "get network" http response message/
-//
-// Deprecated: use [network.Inspect] or [network.Summary] (for list operations).
-type NetworkResource = network.Inspect
-
-// NetworksPruneReport contains the response for Engine API:
-// POST "/networks/prune"
-//
-// Deprecated: use [network.PruneReport].
-type NetworksPruneReport = network.PruneReport
-
-// ExecConfig is a small subset of the Config struct that holds the configuration
-// for the exec feature of docker.
-//
-// Deprecated: use [container.ExecOptions].
-type ExecConfig = container.ExecOptions
-
-// ExecStartCheck is a temp struct used by execStart
-// Config fields is part of ExecConfig in runconfig package
-//
-// Deprecated: use [container.ExecStartOptions] or [container.ExecAttachOptions].
-type ExecStartCheck = container.ExecStartOptions
-
-// ContainerExecInspect holds information returned by exec inspect.
-//
-// Deprecated: use [container.ExecInspect].
-type ContainerExecInspect = container.ExecInspect
-
-// ContainersPruneReport contains the response for Engine API:
-// POST "/containers/prune"
-//
-// Deprecated: use [container.PruneReport].
-type ContainersPruneReport = container.PruneReport
-
-// ContainerPathStat is used to encode the header from
-// GET "/containers/{name:.*}/archive"
-// "Name" is the file or directory name.
-//
-// Deprecated: use [container.PathStat].
-type ContainerPathStat = container.PathStat
-
-// CopyToContainerOptions holds information
-// about files to copy into a container.
-//
-// Deprecated: use [container.CopyToContainerOptions],
-type CopyToContainerOptions = container.CopyToContainerOptions
-
-// ContainerStats contains response of Engine API:
-// GET "/stats"
-//
-// Deprecated: use [container.StatsResponseReader].
-type ContainerStats = container.StatsResponseReader
-
-// ThrottlingData stores CPU throttling stats of one running container.
-// Not used on Windows.
-//
-// Deprecated: use [container.ThrottlingData].
-type ThrottlingData = container.ThrottlingData
-
-// CPUUsage stores All CPU stats aggregated since container inception.
-//
-// Deprecated: use [container.CPUUsage].
-type CPUUsage = container.CPUUsage
-
-// CPUStats aggregates and wraps all CPU related info of container
-//
-// Deprecated: use [container.CPUStats].
-type CPUStats = container.CPUStats
-
-// MemoryStats aggregates all memory stats since container inception on Linux.
-// Windows returns stats for commit and private working set only.
-//
-// Deprecated: use [container.MemoryStats].
-type MemoryStats = container.MemoryStats
-
-// BlkioStatEntry is one small entity to store a piece of Blkio stats
-// Not used on Windows.
-//
-// Deprecated: use [container.BlkioStatEntry].
-type BlkioStatEntry = container.BlkioStatEntry
-
-// BlkioStats stores All IO service stats for data read and write.
-// This is a Linux specific structure as the differences between expressing
-// block I/O on Windows and Linux are sufficiently significant to make
-// little sense attempting to morph into a combined structure.
-//
-// Deprecated: use [container.BlkioStats].
-type BlkioStats = container.BlkioStats
-
-// StorageStats is the disk I/O stats for read/write on Windows.
-//
-// Deprecated: use [container.StorageStats].
-type StorageStats = container.StorageStats
-
-// NetworkStats aggregates the network stats of one container
-//
-// Deprecated: use [container.NetworkStats].
-type NetworkStats = container.NetworkStats
-
-// PidsStats contains the stats of a container's pids
-//
-// Deprecated: use [container.PidsStats].
-type PidsStats = container.PidsStats
-
-// Stats is Ultimate struct aggregating all types of stats of one container
-//
-// Deprecated: use [container.Stats].
-type Stats = container.Stats
-
-// StatsJSON is newly used Networks
-//
-// Deprecated: use [container.StatsResponse].
-type StatsJSON = container.StatsResponse
-
-// EventsOptions holds parameters to filter events with.
-//
-// Deprecated: use [events.ListOptions].
-type EventsOptions = events.ListOptions
-
-// ImageSearchOptions holds parameters to search images with.
-//
-// Deprecated: use [registry.SearchOptions].
-type ImageSearchOptions = registry.SearchOptions
-
-// ImageImportSource holds source information for ImageImport
-//
-// Deprecated: use [image.ImportSource].
-type ImageImportSource image.ImportSource
-
-// ImageLoadResponse returns information to the client about a load process.
-//
-// Deprecated: use [image.LoadResponse].
-type ImageLoadResponse = image.LoadResponse
-
-// ContainerNode stores information about the node that a container
-// is running on.  It's only used by the Docker Swarm standalone API.
-//
-// Deprecated: ContainerNode was used for the classic Docker Swarm standalone API. It will be removed in the next release.
-type ContainerNode struct {
-	ID        string
-	IPAddress string `json:"IP"`
-	Addr      string
-	Name      string
-	Cpus      int
-	Memory    int64
-	Labels    map[string]string
-}
diff --git a/vendor/github.com/docker/docker/api/types/versions/compare.go b/vendor/github.com/docker/docker/api/types/versions/compare.go
deleted file mode 100644
index 621725a36..000000000
--- a/vendor/github.com/docker/docker/api/types/versions/compare.go
+++ /dev/null
@@ -1,65 +0,0 @@
-package versions // import "github.com/docker/docker/api/types/versions"
-
-import (
-	"strconv"
-	"strings"
-)
-
-// compare compares two version strings
-// returns -1 if v1 < v2, 1 if v1 > v2, 0 otherwise.
-func compare(v1, v2 string) int {
-	if v1 == v2 {
-		return 0
-	}
-	var (
-		currTab  = strings.Split(v1, ".")
-		otherTab = strings.Split(v2, ".")
-	)
-
-	maxVer := len(currTab)
-	if len(otherTab) > maxVer {
-		maxVer = len(otherTab)
-	}
-	for i := 0; i < maxVer; i++ {
-		var currInt, otherInt int
-
-		if len(currTab) > i {
-			currInt, _ = strconv.Atoi(currTab[i])
-		}
-		if len(otherTab) > i {
-			otherInt, _ = strconv.Atoi(otherTab[i])
-		}
-		if currInt > otherInt {
-			return 1
-		}
-		if otherInt > currInt {
-			return -1
-		}
-	}
-	return 0
-}
-
-// LessThan checks if a version is less than another
-func LessThan(v, other string) bool {
-	return compare(v, other) == -1
-}
-
-// LessThanOrEqualTo checks if a version is less than or equal to another
-func LessThanOrEqualTo(v, other string) bool {
-	return compare(v, other) <= 0
-}
-
-// GreaterThan checks if a version is greater than another
-func GreaterThan(v, other string) bool {
-	return compare(v, other) == 1
-}
-
-// GreaterThanOrEqualTo checks if a version is greater than or equal to another
-func GreaterThanOrEqualTo(v, other string) bool {
-	return compare(v, other) >= 0
-}
-
-// Equal checks if a version is equal to another
-func Equal(v, other string) bool {
-	return compare(v, other) == 0
-}
diff --git a/vendor/github.com/docker/docker/api/types/volume/cluster_volume.go b/vendor/github.com/docker/docker/api/types/volume/cluster_volume.go
deleted file mode 100644
index 618a48162..000000000
--- a/vendor/github.com/docker/docker/api/types/volume/cluster_volume.go
+++ /dev/null
@@ -1,420 +0,0 @@
-package volume
-
-import (
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// ClusterVolume contains options and information specific to, and only present
-// on, Swarm CSI cluster volumes.
-type ClusterVolume struct {
-	// ID is the Swarm ID of the volume. Because cluster volumes are Swarm
-	// objects, they have an ID, unlike non-cluster volumes, which only have a
-	// Name. This ID can be used to refer to the cluster volume.
-	ID string
-
-	// Meta is the swarm metadata about this volume.
-	swarm.Meta
-
-	// Spec is the cluster-specific options from which this volume is derived.
-	Spec ClusterVolumeSpec
-
-	// PublishStatus contains the status of the volume as it pertains to its
-	// publishing on Nodes.
-	PublishStatus []*PublishStatus `json:",omitempty"`
-
-	// Info is information about the global status of the volume.
-	Info *Info `json:",omitempty"`
-}
-
-// ClusterVolumeSpec contains the spec used to create this volume.
-type ClusterVolumeSpec struct {
-	// Group defines the volume group of this volume. Volumes belonging to the
-	// same group can be referred to by group name when creating Services.
-	// Referring to a volume by group instructs swarm to treat volumes in that
-	// group interchangeably for the purpose of scheduling. Volumes with an
-	// empty string for a group technically all belong to the same, emptystring
-	// group.
-	Group string `json:",omitempty"`
-
-	// AccessMode defines how the volume is used by tasks.
-	AccessMode *AccessMode `json:",omitempty"`
-
-	// AccessibilityRequirements specifies where in the cluster a volume must
-	// be accessible from.
-	//
-	// This field must be empty if the plugin does not support
-	// VOLUME_ACCESSIBILITY_CONSTRAINTS capabilities. If it is present but the
-	// plugin does not support it, volume will not be created.
-	//
-	// If AccessibilityRequirements is empty, but the plugin does support
-	// VOLUME_ACCESSIBILITY_CONSTRAINTS, then Swarmkit will assume the entire
-	// cluster is a valid target for the volume.
-	AccessibilityRequirements *TopologyRequirement `json:",omitempty"`
-
-	// CapacityRange defines the desired capacity that the volume should be
-	// created with. If nil, the plugin will decide the capacity.
-	CapacityRange *CapacityRange `json:",omitempty"`
-
-	// Secrets defines Swarm Secrets that are passed to the CSI storage plugin
-	// when operating on this volume.
-	Secrets []Secret `json:",omitempty"`
-
-	// Availability is the Volume's desired availability. Analogous to Node
-	// Availability, this allows the user to take volumes offline in order to
-	// update or delete them.
-	Availability Availability `json:",omitempty"`
-}
-
-// Availability specifies the availability of the volume.
-type Availability string
-
-const (
-	// AvailabilityActive indicates that the volume is active and fully
-	// schedulable on the cluster.
-	AvailabilityActive Availability = "active"
-
-	// AvailabilityPause indicates that no new workloads should use the
-	// volume, but existing workloads can continue to use it.
-	AvailabilityPause Availability = "pause"
-
-	// AvailabilityDrain indicates that all workloads using this volume
-	// should be rescheduled, and the volume unpublished from all nodes.
-	AvailabilityDrain Availability = "drain"
-)
-
-// AccessMode defines the access mode of a volume.
-type AccessMode struct {
-	// Scope defines the set of nodes this volume can be used on at one time.
-	Scope Scope `json:",omitempty"`
-
-	// Sharing defines the number and way that different tasks can use this
-	// volume at one time.
-	Sharing SharingMode `json:",omitempty"`
-
-	// MountVolume defines options for using this volume as a Mount-type
-	// volume.
-	//
-	// Either BlockVolume or MountVolume, but not both, must be present.
-	MountVolume *TypeMount `json:",omitempty"`
-
-	// BlockVolume defines options for using this volume as a Block-type
-	// volume.
-	//
-	// Either BlockVolume or MountVolume, but not both, must be present.
-	BlockVolume *TypeBlock `json:",omitempty"`
-}
-
-// Scope defines the Scope of a Cluster Volume. This is how many nodes a
-// Volume can be accessed simultaneously on.
-type Scope string
-
-const (
-	// ScopeSingleNode indicates the volume can be used on one node at a
-	// time.
-	ScopeSingleNode Scope = "single"
-
-	// ScopeMultiNode indicates the volume can be used on many nodes at
-	// the same time.
-	ScopeMultiNode Scope = "multi"
-)
-
-// SharingMode defines the Sharing of a Cluster Volume. This is how Tasks using a
-// Volume at the same time can use it.
-type SharingMode string
-
-const (
-	// SharingNone indicates that only one Task may use the Volume at a
-	// time.
-	SharingNone SharingMode = "none"
-
-	// SharingReadOnly indicates that the Volume may be shared by any
-	// number of Tasks, but they must be read-only.
-	SharingReadOnly SharingMode = "readonly"
-
-	// SharingOneWriter indicates that the Volume may be shared by any
-	// number of Tasks, but all after the first must be read-only.
-	SharingOneWriter SharingMode = "onewriter"
-
-	// SharingAll means that the Volume may be shared by any number of
-	// Tasks, as readers or writers.
-	SharingAll SharingMode = "all"
-)
-
-// TypeBlock defines options for using a volume as a block-type volume.
-//
-// Intentionally empty.
-type TypeBlock struct{}
-
-// TypeMount contains options for using a volume as a Mount-type
-// volume.
-type TypeMount struct {
-	// FsType specifies the filesystem type for the mount volume. Optional.
-	FsType string `json:",omitempty"`
-
-	// MountFlags defines flags to pass when mounting the volume. Optional.
-	MountFlags []string `json:",omitempty"`
-}
-
-// TopologyRequirement expresses the user's requirements for a volume's
-// accessible topology.
-type TopologyRequirement struct {
-	// Requisite specifies a list of Topologies, at least one of which the
-	// volume must be accessible from.
-	//
-	// Taken verbatim from the CSI Spec:
-	//
-	// Specifies the list of topologies the provisioned volume MUST be
-	// accessible from.
-	// This field is OPTIONAL. If TopologyRequirement is specified either
-	// requisite or preferred or both MUST be specified.
-	//
-	// If requisite is specified, the provisioned volume MUST be
-	// accessible from at least one of the requisite topologies.
-	//
-	// Given
-	//   x = number of topologies provisioned volume is accessible from
-	//   n = number of requisite topologies
-	// The CO MUST ensure n >= 1. The SP MUST ensure x >= 1
-	// If x==n, then the SP MUST make the provisioned volume available to
-	// all topologies from the list of requisite topologies. If it is
-	// unable to do so, the SP MUST fail the CreateVolume call.
-	// For example, if a volume should be accessible from a single zone,
-	// and requisite =
-	//   {"region": "R1", "zone": "Z2"}
-	// then the provisioned volume MUST be accessible from the "region"
-	// "R1" and the "zone" "Z2".
-	// Similarly, if a volume should be accessible from two zones, and
-	// requisite =
-	//   {"region": "R1", "zone": "Z2"},
-	//   {"region": "R1", "zone": "Z3"}
-	// then the provisioned volume MUST be accessible from the "region"
-	// "R1" and both "zone" "Z2" and "zone" "Z3".
-	//
-	// If x<n, then the SP SHALL choose x unique topologies from the list
-	// of requisite topologies. If it is unable to do so, the SP MUST fail
-	// the CreateVolume call.
-	// For example, if a volume should be accessible from a single zone,
-	// and requisite =
-	//   {"region": "R1", "zone": "Z2"},
-	//   {"region": "R1", "zone": "Z3"}
-	// then the SP may choose to make the provisioned volume available in
-	// either the "zone" "Z2" or the "zone" "Z3" in the "region" "R1".
-	// Similarly, if a volume should be accessible from two zones, and
-	// requisite =
-	//   {"region": "R1", "zone": "Z2"},
-	//   {"region": "R1", "zone": "Z3"},
-	//   {"region": "R1", "zone": "Z4"}
-	// then the provisioned volume MUST be accessible from any combination
-	// of two unique topologies: e.g. "R1/Z2" and "R1/Z3", or "R1/Z2" and
-	//  "R1/Z4", or "R1/Z3" and "R1/Z4".
-	//
-	// If x>n, then the SP MUST make the provisioned volume available from
-	// all topologies from the list of requisite topologies and MAY choose
-	// the remaining x-n unique topologies from the list of all possible
-	// topologies. If it is unable to do so, the SP MUST fail the
-	// CreateVolume call.
-	// For example, if a volume should be accessible from two zones, and
-	// requisite =
-	//   {"region": "R1", "zone": "Z2"}
-	// then the provisioned volume MUST be accessible from the "region"
-	// "R1" and the "zone" "Z2" and the SP may select the second zone
-	// independently, e.g. "R1/Z4".
-	Requisite []Topology `json:",omitempty"`
-
-	// Preferred is a list of Topologies that the volume should attempt to be
-	// provisioned in.
-	//
-	// Taken from the CSI spec:
-	//
-	// Specifies the list of topologies the CO would prefer the volume to
-	// be provisioned in.
-	//
-	// This field is OPTIONAL. If TopologyRequirement is specified either
-	// requisite or preferred or both MUST be specified.
-	//
-	// An SP MUST attempt to make the provisioned volume available using
-	// the preferred topologies in order from first to last.
-	//
-	// If requisite is specified, all topologies in preferred list MUST
-	// also be present in the list of requisite topologies.
-	//
-	// If the SP is unable to make the provisioned volume available
-	// from any of the preferred topologies, the SP MAY choose a topology
-	// from the list of requisite topologies.
-	// If the list of requisite topologies is not specified, then the SP
-	// MAY choose from the list of all possible topologies.
-	// If the list of requisite topologies is specified and the SP is
-	// unable to make the provisioned volume available from any of the
-	// requisite topologies it MUST fail the CreateVolume call.
-	//
-	// Example 1:
-	// Given a volume should be accessible from a single zone, and
-	// requisite =
-	//   {"region": "R1", "zone": "Z2"},
-	//   {"region": "R1", "zone": "Z3"}
-	// preferred =
-	//   {"region": "R1", "zone": "Z3"}
-	// then the SP SHOULD first attempt to make the provisioned volume
-	// available from "zone" "Z3" in the "region" "R1" and fall back to
-	// "zone" "Z2" in the "region" "R1" if that is not possible.
-	//
-	// Example 2:
-	// Given a volume should be accessible from a single zone, and
-	// requisite =
-	//   {"region": "R1", "zone": "Z2"},
-	//   {"region": "R1", "zone": "Z3"},
-	//   {"region": "R1", "zone": "Z4"},
-	//   {"region": "R1", "zone": "Z5"}
-	// preferred =
-	//   {"region": "R1", "zone": "Z4"},
-	//   {"region": "R1", "zone": "Z2"}
-	// then the SP SHOULD first attempt to make the provisioned volume
-	// accessible from "zone" "Z4" in the "region" "R1" and fall back to
-	// "zone" "Z2" in the "region" "R1" if that is not possible. If that
-	// is not possible, the SP may choose between either the "zone"
-	// "Z3" or "Z5" in the "region" "R1".
-	//
-	// Example 3:
-	// Given a volume should be accessible from TWO zones (because an
-	// opaque parameter in CreateVolumeRequest, for example, specifies
-	// the volume is accessible from two zones, aka synchronously
-	// replicated), and
-	// requisite =
-	//   {"region": "R1", "zone": "Z2"},
-	//   {"region": "R1", "zone": "Z3"},
-	//   {"region": "R1", "zone": "Z4"},
-	//   {"region": "R1", "zone": "Z5"}
-	// preferred =
-	//   {"region": "R1", "zone": "Z5"},
-	//   {"region": "R1", "zone": "Z3"}
-	// then the SP SHOULD first attempt to make the provisioned volume
-	// accessible from the combination of the two "zones" "Z5" and "Z3" in
-	// the "region" "R1". If that's not possible, it should fall back to
-	// a combination of "Z5" and other possibilities from the list of
-	// requisite. If that's not possible, it should fall back  to a
-	// combination of "Z3" and other possibilities from the list of
-	// requisite. If that's not possible, it should fall back  to a
-	// combination of other possibilities from the list of requisite.
-	Preferred []Topology `json:",omitempty"`
-}
-
-// Topology is a map of topological domains to topological segments.
-//
-// This description is taken verbatim from the CSI Spec:
-//
-// A topological domain is a sub-division of a cluster, like "region",
-// "zone", "rack", etc.
-// A topological segment is a specific instance of a topological domain,
-// like "zone3", "rack3", etc.
-// For example {"com.company/zone": "Z1", "com.company/rack": "R3"}
-// Valid keys have two segments: an OPTIONAL prefix and name, separated
-// by a slash (/), for example: "com.company.example/zone".
-// The key name segment is REQUIRED. The prefix is OPTIONAL.
-// The key name MUST be 63 characters or less, begin and end with an
-// alphanumeric character ([a-z0-9A-Z]), and contain only dashes (-),
-// underscores (_), dots (.), or alphanumerics in between, for example
-// "zone".
-// The key prefix MUST be 63 characters or less, begin and end with a
-// lower-case alphanumeric character ([a-z0-9]), contain only
-// dashes (-), dots (.), or lower-case alphanumerics in between, and
-// follow domain name notation format
-// (https://tools.ietf.org/html/rfc1035#section-2.3.1).
-// The key prefix SHOULD include the plugin's host company name and/or
-// the plugin name, to minimize the possibility of collisions with keys
-// from other plugins.
-// If a key prefix is specified, it MUST be identical across all
-// topology keys returned by the SP (across all RPCs).
-// Keys MUST be case-insensitive. Meaning the keys "Zone" and "zone"
-// MUST not both exist.
-// Each value (topological segment) MUST contain 1 or more strings.
-// Each string MUST be 63 characters or less and begin and end with an
-// alphanumeric character with '-', '_', '.', or alphanumerics in
-// between.
-type Topology struct {
-	Segments map[string]string `json:",omitempty"`
-}
-
-// CapacityRange describes the minimum and maximum capacity a volume should be
-// created with
-type CapacityRange struct {
-	// RequiredBytes specifies that a volume must be at least this big. The
-	// value of 0 indicates an unspecified minimum.
-	RequiredBytes int64
-
-	// LimitBytes specifies that a volume must not be bigger than this. The
-	// value of 0 indicates an unspecified maximum
-	LimitBytes int64
-}
-
-// Secret represents a Swarm Secret value that must be passed to the CSI
-// storage plugin when operating on this Volume. It represents one key-value
-// pair of possibly many.
-type Secret struct {
-	// Key is the name of the key of the key-value pair passed to the plugin.
-	Key string
-
-	// Secret is the swarm Secret object from which to read data. This can be a
-	// Secret name or ID. The Secret data is retrieved by Swarm and used as the
-	// value of the key-value pair passed to the plugin.
-	Secret string
-}
-
-// PublishState represents the state of a Volume as it pertains to its
-// use on a particular Node.
-type PublishState string
-
-const (
-	// StatePending indicates that the volume should be published on
-	// this node, but the call to ControllerPublishVolume has not been
-	// successfully completed yet and the result recorded by swarmkit.
-	StatePending PublishState = "pending-publish"
-
-	// StatePublished means the volume is published successfully to the node.
-	StatePublished PublishState = "published"
-
-	// StatePendingNodeUnpublish indicates that the Volume should be
-	// unpublished on the Node, and we're waiting for confirmation that it has
-	// done so.  After the Node has confirmed that the Volume has been
-	// unpublished, the state will move to StatePendingUnpublish.
-	StatePendingNodeUnpublish PublishState = "pending-node-unpublish"
-
-	// StatePendingUnpublish means the volume is still published to the node
-	// by the controller, awaiting the operation to unpublish it.
-	StatePendingUnpublish PublishState = "pending-controller-unpublish"
-)
-
-// PublishStatus represents the status of the volume as published to an
-// individual node
-type PublishStatus struct {
-	// NodeID is the ID of the swarm node this Volume is published to.
-	NodeID string `json:",omitempty"`
-
-	// State is the publish state of the volume.
-	State PublishState `json:",omitempty"`
-
-	// PublishContext is the PublishContext returned by the CSI plugin when
-	// a volume is published.
-	PublishContext map[string]string `json:",omitempty"`
-}
-
-// Info contains information about the Volume as a whole as provided by
-// the CSI storage plugin.
-type Info struct {
-	// CapacityBytes is the capacity of the volume in bytes. A value of 0
-	// indicates that the capacity is unknown.
-	CapacityBytes int64 `json:",omitempty"`
-
-	// VolumeContext is the context originating from the CSI storage plugin
-	// when the Volume is created.
-	VolumeContext map[string]string `json:",omitempty"`
-
-	// VolumeID is the ID of the Volume as seen by the CSI storage plugin. This
-	// is distinct from the Volume's Swarm ID, which is the ID used by all of
-	// the Docker Engine to refer to the Volume. If this field is blank, then
-	// the Volume has not been successfully created yet.
-	VolumeID string `json:",omitempty"`
-
-	// AccessibleTopology is the topology this volume is actually accessible
-	// from.
-	AccessibleTopology []Topology `json:",omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/volume/create_options.go b/vendor/github.com/docker/docker/api/types/volume/create_options.go
deleted file mode 100644
index 37c41a609..000000000
--- a/vendor/github.com/docker/docker/api/types/volume/create_options.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package volume
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// CreateOptions VolumeConfig
-//
-// Volume configuration
-// swagger:model CreateOptions
-type CreateOptions struct {
-
-	// cluster volume spec
-	ClusterVolumeSpec *ClusterVolumeSpec `json:"ClusterVolumeSpec,omitempty"`
-
-	// Name of the volume driver to use.
-	Driver string `json:"Driver,omitempty"`
-
-	// A mapping of driver options and values. These options are
-	// passed directly to the driver and are driver specific.
-	//
-	DriverOpts map[string]string `json:"DriverOpts,omitempty"`
-
-	// User-defined key/value metadata.
-	Labels map[string]string `json:"Labels,omitempty"`
-
-	// The new volume's name. If not specified, Docker generates a name.
-	//
-	Name string `json:"Name,omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/volume/list_response.go b/vendor/github.com/docker/docker/api/types/volume/list_response.go
deleted file mode 100644
index ca5192a2a..000000000
--- a/vendor/github.com/docker/docker/api/types/volume/list_response.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package volume
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// ListResponse VolumeListResponse
-//
-// Volume list response
-// swagger:model ListResponse
-type ListResponse struct {
-
-	// List of volumes
-	Volumes []*Volume `json:"Volumes"`
-
-	// Warnings that occurred when fetching the list of volumes.
-	//
-	Warnings []string `json:"Warnings"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/volume/options.go b/vendor/github.com/docker/docker/api/types/volume/options.go
deleted file mode 100644
index 0b9645e00..000000000
--- a/vendor/github.com/docker/docker/api/types/volume/options.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package volume // import "github.com/docker/docker/api/types/volume"
-
-import "github.com/docker/docker/api/types/filters"
-
-// ListOptions holds parameters to list volumes.
-type ListOptions struct {
-	Filters filters.Args
-}
-
-// PruneReport contains the response for Engine API:
-// POST "/volumes/prune"
-type PruneReport struct {
-	VolumesDeleted []string
-	SpaceReclaimed uint64
-}
diff --git a/vendor/github.com/docker/docker/api/types/volume/volume.go b/vendor/github.com/docker/docker/api/types/volume/volume.go
deleted file mode 100644
index ea7d555e5..000000000
--- a/vendor/github.com/docker/docker/api/types/volume/volume.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package volume
-
-// This file was generated by the swagger tool.
-// Editing this file might prove futile when you re-run the swagger generate command
-
-// Volume volume
-// swagger:model Volume
-type Volume struct {
-
-	// cluster volume
-	ClusterVolume *ClusterVolume `json:"ClusterVolume,omitempty"`
-
-	// Date/Time the volume was created.
-	CreatedAt string `json:"CreatedAt,omitempty"`
-
-	// Name of the volume driver used by the volume.
-	// Required: true
-	Driver string `json:"Driver"`
-
-	// User-defined key/value metadata.
-	// Required: true
-	Labels map[string]string `json:"Labels"`
-
-	// Mount path of the volume on the host.
-	// Required: true
-	Mountpoint string `json:"Mountpoint"`
-
-	// Name of the volume.
-	// Required: true
-	Name string `json:"Name"`
-
-	// The driver specific options used when creating the volume.
-	//
-	// Required: true
-	Options map[string]string `json:"Options"`
-
-	// The level at which the volume exists. Either `global` for cluster-wide,
-	// or `local` for machine level.
-	//
-	// Required: true
-	Scope string `json:"Scope"`
-
-	// Low-level details about the volume, provided by the volume driver.
-	// Details are returned as a map with key/value pairs:
-	// `{"key":"value","key2":"value2"}`.
-	//
-	// The `Status` field is optional, and is omitted if the volume driver
-	// does not support this feature.
-	//
-	Status map[string]interface{} `json:"Status,omitempty"`
-
-	// usage data
-	UsageData *UsageData `json:"UsageData,omitempty"`
-}
-
-// UsageData Usage details about the volume. This information is used by the
-// `GET /system/df` endpoint, and omitted in other endpoints.
-//
-// swagger:model UsageData
-type UsageData struct {
-
-	// The number of containers referencing this volume. This field
-	// is set to `-1` if the reference-count is not available.
-	//
-	// Required: true
-	RefCount int64 `json:"RefCount"`
-
-	// Amount of disk space used by the volume (in bytes). This information
-	// is only available for volumes created with the `"local"` volume
-	// driver. For volumes created with other volume drivers, this field
-	// is set to `-1` ("not available")
-	//
-	// Required: true
-	Size int64 `json:"Size"`
-}
diff --git a/vendor/github.com/docker/docker/api/types/volume/volume_update.go b/vendor/github.com/docker/docker/api/types/volume/volume_update.go
deleted file mode 100644
index f958f80a6..000000000
--- a/vendor/github.com/docker/docker/api/types/volume/volume_update.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package volume // import "github.com/docker/docker/api/types/volume"
-
-// UpdateOptions is configuration to update a Volume with.
-type UpdateOptions struct {
-	// Spec is the ClusterVolumeSpec to update the volume to.
-	Spec *ClusterVolumeSpec `json:"Spec,omitempty"`
-}
diff --git a/vendor/github.com/docker/docker/client/README.md b/vendor/github.com/docker/docker/client/README.md
deleted file mode 100644
index f8af3ab90..000000000
--- a/vendor/github.com/docker/docker/client/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Go client for the Docker Engine API
-
-The `docker` command uses this package to communicate with the daemon. It can
-also be used by your own Go applications to do anything the command-line
-interface does – running containers, pulling images, managing swarms, etc.
-
-For example, to list all containers (the equivalent of `docker ps --all`):
-
-```go
-package main
-
-import (
-	"context"
-	"fmt"
-
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/client"
-)
-
-func main() {
-	apiClient, err := client.NewClientWithOpts(client.FromEnv)
-	if err != nil {
-		panic(err)
-	}
-	defer apiClient.Close()
-
-	containers, err := apiClient.ContainerList(context.Background(), container.ListOptions{All: true})
-	if err != nil {
-		panic(err)
-	}
-
-	for _, ctr := range containers {
-		fmt.Printf("%s %s (status: %s)\n", ctr.ID, ctr.Image, ctr.Status)
-	}
-}
-```
-
-[Full documentation is available on pkg.go.dev.](https://pkg.go.dev/github.com/docker/docker/client)
diff --git a/vendor/github.com/docker/docker/client/build_cancel.go b/vendor/github.com/docker/docker/client/build_cancel.go
deleted file mode 100644
index b76bf366b..000000000
--- a/vendor/github.com/docker/docker/client/build_cancel.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-)
-
-// BuildCancel requests the daemon to cancel the ongoing build request.
-func (cli *Client) BuildCancel(ctx context.Context, id string) error {
-	query := url.Values{}
-	query.Set("id", id)
-
-	serverResp, err := cli.post(ctx, "/build/cancel", query, nil, nil)
-	ensureReaderClosed(serverResp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/build_prune.go b/vendor/github.com/docker/docker/client/build_prune.go
deleted file mode 100644
index 1a830f413..000000000
--- a/vendor/github.com/docker/docker/client/build_prune.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-	"strconv"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/filters"
-	"github.com/pkg/errors"
-)
-
-// BuildCachePrune requests the daemon to delete unused cache data
-func (cli *Client) BuildCachePrune(ctx context.Context, opts types.BuildCachePruneOptions) (*types.BuildCachePruneReport, error) {
-	if err := cli.NewVersionError(ctx, "1.31", "build prune"); err != nil {
-		return nil, err
-	}
-
-	report := types.BuildCachePruneReport{}
-
-	query := url.Values{}
-	if opts.All {
-		query.Set("all", "1")
-	}
-	query.Set("keep-storage", strconv.Itoa(int(opts.KeepStorage)))
-	f, err := filters.ToJSON(opts.Filters)
-	if err != nil {
-		return nil, errors.Wrap(err, "prune could not marshal filters option")
-	}
-	query.Set("filters", f)
-
-	serverResp, err := cli.post(ctx, "/build/prune", query, nil, nil)
-	defer ensureReaderClosed(serverResp)
-
-	if err != nil {
-		return nil, err
-	}
-
-	if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil {
-		return nil, errors.Wrap(err, "error retrieving disk usage")
-	}
-
-	return &report, nil
-}
diff --git a/vendor/github.com/docker/docker/client/checkpoint_create.go b/vendor/github.com/docker/docker/client/checkpoint_create.go
deleted file mode 100644
index 9746d288d..000000000
--- a/vendor/github.com/docker/docker/client/checkpoint_create.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-
-	"github.com/docker/docker/api/types/checkpoint"
-)
-
-// CheckpointCreate creates a checkpoint from the given container with the given name
-func (cli *Client) CheckpointCreate(ctx context.Context, container string, options checkpoint.CreateOptions) error {
-	resp, err := cli.post(ctx, "/containers/"+container+"/checkpoints", nil, options, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/checkpoint_delete.go b/vendor/github.com/docker/docker/client/checkpoint_delete.go
deleted file mode 100644
index b968c2b23..000000000
--- a/vendor/github.com/docker/docker/client/checkpoint_delete.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types/checkpoint"
-)
-
-// CheckpointDelete deletes the checkpoint with the given name from the given container
-func (cli *Client) CheckpointDelete(ctx context.Context, containerID string, options checkpoint.DeleteOptions) error {
-	query := url.Values{}
-	if options.CheckpointDir != "" {
-		query.Set("dir", options.CheckpointDir)
-	}
-
-	resp, err := cli.delete(ctx, "/containers/"+containerID+"/checkpoints/"+options.CheckpointID, query, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/checkpoint_list.go b/vendor/github.com/docker/docker/client/checkpoint_list.go
deleted file mode 100644
index 8feb1f3f7..000000000
--- a/vendor/github.com/docker/docker/client/checkpoint_list.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types/checkpoint"
-)
-
-// CheckpointList returns the checkpoints of the given container in the docker host
-func (cli *Client) CheckpointList(ctx context.Context, container string, options checkpoint.ListOptions) ([]checkpoint.Summary, error) {
-	var checkpoints []checkpoint.Summary
-
-	query := url.Values{}
-	if options.CheckpointDir != "" {
-		query.Set("dir", options.CheckpointDir)
-	}
-
-	resp, err := cli.get(ctx, "/containers/"+container+"/checkpoints", query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return checkpoints, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&checkpoints)
-	return checkpoints, err
-}
diff --git a/vendor/github.com/docker/docker/client/client.go b/vendor/github.com/docker/docker/client/client.go
deleted file mode 100644
index 46832d8a4..000000000
--- a/vendor/github.com/docker/docker/client/client.go
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
-Package client is a Go client for the Docker Engine API.
-
-For more information about the Engine API, see the documentation:
-https://docs.docker.com/reference/api/engine/
-
-# Usage
-
-You use the library by constructing a client object using [NewClientWithOpts]
-and calling methods on it. The client can be configured from environment
-variables by passing the [FromEnv] option, or configured manually by passing any
-of the other available [Opts].
-
-For example, to list running containers (the equivalent of "docker ps"):
-
-	package main
-
-	import (
-		"context"
-		"fmt"
-
-		"github.com/docker/docker/api/types/container"
-		"github.com/docker/docker/client"
-	)
-
-	func main() {
-		cli, err := client.NewClientWithOpts(client.FromEnv)
-		if err != nil {
-			panic(err)
-		}
-
-		containers, err := cli.ContainerList(context.Background(), container.ListOptions{})
-		if err != nil {
-			panic(err)
-		}
-
-		for _, ctr := range containers {
-			fmt.Printf("%s %s\n", ctr.ID, ctr.Image)
-		}
-	}
-*/
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"crypto/tls"
-	"net"
-	"net/http"
-	"net/url"
-	"path"
-	"strings"
-	"sync"
-	"sync/atomic"
-	"time"
-
-	"github.com/docker/docker/api"
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/versions"
-	"github.com/docker/go-connections/sockets"
-	"github.com/pkg/errors"
-	"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
-	"go.opentelemetry.io/otel/trace"
-)
-
-// DummyHost is a hostname used for local communication.
-//
-// It acts as a valid formatted hostname for local connections (such as "unix://"
-// or "npipe://") which do not require a hostname. It should never be resolved,
-// but uses the special-purpose ".localhost" TLD (as defined in [RFC 2606, Section 2]
-// and [RFC 6761, Section 6.3]).
-//
-// [RFC 7230, Section 5.4] defines that an empty header must be used for such
-// cases:
-//
-//	If the authority component is missing or undefined for the target URI,
-//	then a client MUST send a Host header field with an empty field-value.
-//
-// However, [Go stdlib] enforces the semantics of HTTP(S) over TCP, does not
-// allow an empty header to be used, and requires req.URL.Scheme to be either
-// "http" or "https".
-//
-// For further details, refer to:
-//
-//   - https://github.com/docker/engine-api/issues/189
-//   - https://github.com/golang/go/issues/13624
-//   - https://github.com/golang/go/issues/61076
-//   - https://github.com/moby/moby/issues/45935
-//
-// [RFC 2606, Section 2]: https://www.rfc-editor.org/rfc/rfc2606.html#section-2
-// [RFC 6761, Section 6.3]: https://www.rfc-editor.org/rfc/rfc6761#section-6.3
-// [RFC 7230, Section 5.4]: https://datatracker.ietf.org/doc/html/rfc7230#section-5.4
-// [Go stdlib]: https://github.com/golang/go/blob/6244b1946bc2101b01955468f1be502dbadd6807/src/net/http/transport.go#L558-L569
-const DummyHost = "api.moby.localhost"
-
-// fallbackAPIVersion is the version to fallback to if API-version negotiation
-// fails. This version is the highest version of the API before API-version
-// negotiation was introduced. If negotiation fails (or no API version was
-// included in the API response), we assume the API server uses the most
-// recent version before negotiation was introduced.
-const fallbackAPIVersion = "1.24"
-
-// Client is the API client that performs all operations
-// against a docker server.
-type Client struct {
-	// scheme sets the scheme for the client
-	scheme string
-	// host holds the server address to connect to
-	host string
-	// proto holds the client protocol i.e. unix.
-	proto string
-	// addr holds the client address.
-	addr string
-	// basePath holds the path to prepend to the requests.
-	basePath string
-	// client used to send and receive http requests.
-	client *http.Client
-	// version of the server to talk to.
-	version string
-	// userAgent is the User-Agent header to use for HTTP requests. It takes
-	// precedence over User-Agent headers set in customHTTPHeaders, and other
-	// header variables. When set to an empty string, the User-Agent header
-	// is removed, and no header is sent.
-	userAgent *string
-	// custom HTTP headers configured by users.
-	customHTTPHeaders map[string]string
-	// manualOverride is set to true when the version was set by users.
-	manualOverride bool
-
-	// negotiateVersion indicates if the client should automatically negotiate
-	// the API version to use when making requests. API version negotiation is
-	// performed on the first request, after which negotiated is set to "true"
-	// so that subsequent requests do not re-negotiate.
-	negotiateVersion bool
-
-	// negotiated indicates that API version negotiation took place
-	negotiated atomic.Bool
-
-	// negotiateLock is used to single-flight the version negotiation process
-	negotiateLock sync.Mutex
-
-	tp trace.TracerProvider
-
-	// When the client transport is an *http.Transport (default) we need to do some extra things (like closing idle connections).
-	// Store the original transport as the http.Client transport will be wrapped with tracing libs.
-	baseTransport *http.Transport
-}
-
-// ErrRedirect is the error returned by checkRedirect when the request is non-GET.
-var ErrRedirect = errors.New("unexpected redirect in response")
-
-// CheckRedirect specifies the policy for dealing with redirect responses. It
-// can be set on [http.Client.CheckRedirect] to prevent HTTP redirects for
-// non-GET requests. It returns an [ErrRedirect] for non-GET request, otherwise
-// returns a [http.ErrUseLastResponse], which is special-cased by http.Client
-// to use the last response.
-//
-// Go 1.8 changed behavior for HTTP redirects (specifically 301, 307, and 308)
-// in the client. The client (and by extension API client) can be made to send
-// a request like "POST /containers//start" where what would normally be in the
-// name section of the URL is empty. This triggers an HTTP 301 from the daemon.
-//
-// In go 1.8 this 301 is converted to a GET request, and ends up getting
-// a 404 from the daemon. This behavior change manifests in the client in that
-// before, the 301 was not followed and the client did not generate an error,
-// but now results in a message like "Error response from daemon: page not found".
-func CheckRedirect(_ *http.Request, via []*http.Request) error {
-	if via[0].Method == http.MethodGet {
-		return http.ErrUseLastResponse
-	}
-	return ErrRedirect
-}
-
-// NewClientWithOpts initializes a new API client with a default HTTPClient, and
-// default API host and version. It also initializes the custom HTTP headers to
-// add to each request.
-//
-// It takes an optional list of [Opt] functional arguments, which are applied in
-// the order they're provided, which allows modifying the defaults when creating
-// the client. For example, the following initializes a client that configures
-// itself with values from environment variables ([FromEnv]), and has automatic
-// API version negotiation enabled ([WithAPIVersionNegotiation]).
-//
-//	cli, err := client.NewClientWithOpts(
-//		client.FromEnv,
-//		client.WithAPIVersionNegotiation(),
-//	)
-func NewClientWithOpts(ops ...Opt) (*Client, error) {
-	hostURL, err := ParseHostURL(DefaultDockerHost)
-	if err != nil {
-		return nil, err
-	}
-
-	client, err := defaultHTTPClient(hostURL)
-	if err != nil {
-		return nil, err
-	}
-	c := &Client{
-		host:    DefaultDockerHost,
-		version: api.DefaultVersion,
-		client:  client,
-		proto:   hostURL.Scheme,
-		addr:    hostURL.Host,
-	}
-
-	for _, op := range ops {
-		if err := op(c); err != nil {
-			return nil, err
-		}
-	}
-
-	if tr, ok := c.client.Transport.(*http.Transport); ok {
-		// Store the base transport before we wrap it in tracing libs below
-		// This is used, as an example, to close idle connections when the client is closed
-		c.baseTransport = tr
-	}
-
-	if c.scheme == "" {
-		// TODO(stevvooe): This isn't really the right way to write clients in Go.
-		// `NewClient` should probably only take an `*http.Client` and work from there.
-		// Unfortunately, the model of having a host-ish/url-thingy as the connection
-		// string has us confusing protocol and transport layers. We continue doing
-		// this to avoid breaking existing clients but this should be addressed.
-		if c.tlsConfig() != nil {
-			c.scheme = "https"
-		} else {
-			c.scheme = "http"
-		}
-	}
-
-	c.client.Transport = otelhttp.NewTransport(
-		c.client.Transport,
-		otelhttp.WithTracerProvider(c.tp),
-		otelhttp.WithSpanNameFormatter(func(_ string, req *http.Request) string {
-			return req.Method + " " + req.URL.Path
-		}),
-	)
-
-	return c, nil
-}
-
-func (cli *Client) tlsConfig() *tls.Config {
-	if cli.baseTransport == nil {
-		return nil
-	}
-	return cli.baseTransport.TLSClientConfig
-}
-
-func defaultHTTPClient(hostURL *url.URL) (*http.Client, error) {
-	transport := &http.Transport{}
-	// Necessary to prevent long-lived processes using the
-	// client from leaking connections due to idle connections
-	// not being released.
-	// TODO: see if we can also address this from the server side,
-	// or in go-connections.
-	// see: https://github.com/moby/moby/issues/45539
-	transport.MaxIdleConns = 6
-	transport.IdleConnTimeout = 30 * time.Second
-	err := sockets.ConfigureTransport(transport, hostURL.Scheme, hostURL.Host)
-	if err != nil {
-		return nil, err
-	}
-	return &http.Client{
-		Transport:     transport,
-		CheckRedirect: CheckRedirect,
-	}, nil
-}
-
-// Close the transport used by the client
-func (cli *Client) Close() error {
-	if cli.baseTransport != nil {
-		cli.baseTransport.CloseIdleConnections()
-		return nil
-	}
-	return nil
-}
-
-// checkVersion manually triggers API version negotiation (if configured).
-// This allows for version-dependent code to use the same version as will
-// be negotiated when making the actual requests, and for which cases
-// we cannot do the negotiation lazily.
-func (cli *Client) checkVersion(ctx context.Context) error {
-	if !cli.manualOverride && cli.negotiateVersion && !cli.negotiated.Load() {
-		// Ensure exclusive write access to version and negotiated fields
-		cli.negotiateLock.Lock()
-		defer cli.negotiateLock.Unlock()
-
-		// May have been set during last execution of critical zone
-		if cli.negotiated.Load() {
-			return nil
-		}
-
-		ping, err := cli.Ping(ctx)
-		if err != nil {
-			return err
-		}
-		cli.negotiateAPIVersionPing(ping)
-	}
-	return nil
-}
-
-// getAPIPath returns the versioned request path to call the API.
-// It appends the query parameters to the path if they are not empty.
-func (cli *Client) getAPIPath(ctx context.Context, p string, query url.Values) string {
-	var apiPath string
-	_ = cli.checkVersion(ctx)
-	if cli.version != "" {
-		v := strings.TrimPrefix(cli.version, "v")
-		apiPath = path.Join(cli.basePath, "/v"+v, p)
-	} else {
-		apiPath = path.Join(cli.basePath, p)
-	}
-	return (&url.URL{Path: apiPath, RawQuery: query.Encode()}).String()
-}
-
-// ClientVersion returns the API version used by this client.
-func (cli *Client) ClientVersion() string {
-	return cli.version
-}
-
-// NegotiateAPIVersion queries the API and updates the version to match the API
-// version. NegotiateAPIVersion downgrades the client's API version to match the
-// APIVersion if the ping version is lower than the default version. If the API
-// version reported by the server is higher than the maximum version supported
-// by the client, it uses the client's maximum version.
-//
-// If a manual override is in place, either through the "DOCKER_API_VERSION"
-// ([EnvOverrideAPIVersion]) environment variable, or if the client is initialized
-// with a fixed version ([WithVersion]), no negotiation is performed.
-//
-// If the API server's ping response does not contain an API version, or if the
-// client did not get a successful ping response, it assumes it is connected with
-// an old daemon that does not support API version negotiation, in which case it
-// downgrades to the latest version of the API before version negotiation was
-// added (1.24).
-func (cli *Client) NegotiateAPIVersion(ctx context.Context) {
-	if !cli.manualOverride {
-		// Avoid concurrent modification of version-related fields
-		cli.negotiateLock.Lock()
-		defer cli.negotiateLock.Unlock()
-
-		ping, err := cli.Ping(ctx)
-		if err != nil {
-			// FIXME(thaJeztah): Ping returns an error when failing to connect to the API; we should not swallow the error here, and instead returning it.
-			return
-		}
-		cli.negotiateAPIVersionPing(ping)
-	}
-}
-
-// NegotiateAPIVersionPing downgrades the client's API version to match the
-// APIVersion in the ping response. If the API version in pingResponse is higher
-// than the maximum version supported by the client, it uses the client's maximum
-// version.
-//
-// If a manual override is in place, either through the "DOCKER_API_VERSION"
-// ([EnvOverrideAPIVersion]) environment variable, or if the client is initialized
-// with a fixed version ([WithVersion]), no negotiation is performed.
-//
-// If the API server's ping response does not contain an API version, we assume
-// we are connected with an old daemon without API version negotiation support,
-// and downgrade to the latest version of the API before version negotiation was
-// added (1.24).
-func (cli *Client) NegotiateAPIVersionPing(pingResponse types.Ping) {
-	if !cli.manualOverride {
-		// Avoid concurrent modification of version-related fields
-		cli.negotiateLock.Lock()
-		defer cli.negotiateLock.Unlock()
-
-		cli.negotiateAPIVersionPing(pingResponse)
-	}
-}
-
-// negotiateAPIVersionPing queries the API and updates the version to match the
-// API version from the ping response.
-func (cli *Client) negotiateAPIVersionPing(pingResponse types.Ping) {
-	// default to the latest version before versioning headers existed
-	if pingResponse.APIVersion == "" {
-		pingResponse.APIVersion = fallbackAPIVersion
-	}
-
-	// if the client is not initialized with a version, start with the latest supported version
-	if cli.version == "" {
-		cli.version = api.DefaultVersion
-	}
-
-	// if server version is lower than the client version, downgrade
-	if versions.LessThan(pingResponse.APIVersion, cli.version) {
-		cli.version = pingResponse.APIVersion
-	}
-
-	// Store the results, so that automatic API version negotiation (if enabled)
-	// won't be performed on the next request.
-	if cli.negotiateVersion {
-		cli.negotiated.Store(true)
-	}
-}
-
-// DaemonHost returns the host address used by the client
-func (cli *Client) DaemonHost() string {
-	return cli.host
-}
-
-// HTTPClient returns a copy of the HTTP client bound to the server
-func (cli *Client) HTTPClient() *http.Client {
-	c := *cli.client
-	return &c
-}
-
-// ParseHostURL parses a url string, validates the string is a host url, and
-// returns the parsed URL
-func ParseHostURL(host string) (*url.URL, error) {
-	proto, addr, ok := strings.Cut(host, "://")
-	if !ok || addr == "" {
-		return nil, errors.Errorf("unable to parse docker host `%s`", host)
-	}
-
-	var basePath string
-	if proto == "tcp" {
-		parsed, err := url.Parse("tcp://" + addr)
-		if err != nil {
-			return nil, err
-		}
-		addr = parsed.Host
-		basePath = parsed.Path
-	}
-	return &url.URL{
-		Scheme: proto,
-		Host:   addr,
-		Path:   basePath,
-	}, nil
-}
-
-func (cli *Client) dialerFromTransport() func(context.Context, string, string) (net.Conn, error) {
-	if cli.baseTransport == nil || cli.baseTransport.DialContext == nil {
-		return nil
-	}
-
-	if cli.baseTransport.TLSClientConfig != nil {
-		// When using a tls config we don't use the configured dialer but instead a fallback dialer...
-		// Note: It seems like this should use the normal dialer and wrap the returned net.Conn in a tls.Conn
-		// I honestly don't know why it doesn't do that, but it doesn't and such a change is entirely unrelated to the change in this commit.
-		return nil
-	}
-	return cli.baseTransport.DialContext
-}
-
-// Dialer returns a dialer for a raw stream connection, with an HTTP/1.1 header,
-// that can be used for proxying the daemon connection. It is used by
-// ["docker dial-stdio"].
-//
-// ["docker dial-stdio"]: https://github.com/docker/cli/pull/1014
-func (cli *Client) Dialer() func(context.Context) (net.Conn, error) {
-	return func(ctx context.Context) (net.Conn, error) {
-		if dialFn := cli.dialerFromTransport(); dialFn != nil {
-			return dialFn(ctx, cli.proto, cli.addr)
-		}
-		switch cli.proto {
-		case "unix":
-			return net.Dial(cli.proto, cli.addr)
-		case "npipe":
-			return sockets.DialPipe(cli.addr, 32*time.Second)
-		default:
-			if tlsConfig := cli.tlsConfig(); tlsConfig != nil {
-				return tls.Dial(cli.proto, cli.addr, tlsConfig)
-			}
-			return net.Dial(cli.proto, cli.addr)
-		}
-	}
-}
diff --git a/vendor/github.com/docker/docker/client/client_deprecated.go b/vendor/github.com/docker/docker/client/client_deprecated.go
deleted file mode 100644
index 9e366ce20..000000000
--- a/vendor/github.com/docker/docker/client/client_deprecated.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package client
-
-import "net/http"
-
-// NewClient initializes a new API client for the given host and API version.
-// It uses the given http client as transport.
-// It also initializes the custom http headers to add to each request.
-//
-// It won't send any version information if the version number is empty. It is
-// highly recommended that you set a version or your client may break if the
-// server is upgraded.
-//
-// Deprecated: use [NewClientWithOpts] passing the [WithHost], [WithVersion],
-// [WithHTTPClient] and [WithHTTPHeaders] options. We recommend enabling API
-// version negotiation by passing the [WithAPIVersionNegotiation] option instead
-// of WithVersion.
-func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) {
-	return NewClientWithOpts(WithHost(host), WithVersion(version), WithHTTPClient(client), WithHTTPHeaders(httpHeaders))
-}
-
-// NewEnvClient initializes a new API client based on environment variables.
-// See FromEnv for a list of support environment variables.
-//
-// Deprecated: use [NewClientWithOpts] passing the [FromEnv] option.
-func NewEnvClient() (*Client, error) {
-	return NewClientWithOpts(FromEnv)
-}
diff --git a/vendor/github.com/docker/docker/client/config_create.go b/vendor/github.com/docker/docker/client/config_create.go
deleted file mode 100644
index 3deb4a8e2..000000000
--- a/vendor/github.com/docker/docker/client/config_create.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// ConfigCreate creates a new config.
-func (cli *Client) ConfigCreate(ctx context.Context, config swarm.ConfigSpec) (types.ConfigCreateResponse, error) {
-	var response types.ConfigCreateResponse
-	if err := cli.NewVersionError(ctx, "1.30", "config create"); err != nil {
-		return response, err
-	}
-	resp, err := cli.post(ctx, "/configs/create", nil, config, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return response, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&response)
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/config_inspect.go b/vendor/github.com/docker/docker/client/config_inspect.go
deleted file mode 100644
index 2c6c7cb36..000000000
--- a/vendor/github.com/docker/docker/client/config_inspect.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"io"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// ConfigInspectWithRaw returns the config information with raw data
-func (cli *Client) ConfigInspectWithRaw(ctx context.Context, id string) (swarm.Config, []byte, error) {
-	if id == "" {
-		return swarm.Config{}, nil, objectNotFoundError{object: "config", id: id}
-	}
-	if err := cli.NewVersionError(ctx, "1.30", "config inspect"); err != nil {
-		return swarm.Config{}, nil, err
-	}
-	resp, err := cli.get(ctx, "/configs/"+id, nil, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return swarm.Config{}, nil, err
-	}
-
-	body, err := io.ReadAll(resp.body)
-	if err != nil {
-		return swarm.Config{}, nil, err
-	}
-
-	var config swarm.Config
-	rdr := bytes.NewReader(body)
-	err = json.NewDecoder(rdr).Decode(&config)
-
-	return config, body, err
-}
diff --git a/vendor/github.com/docker/docker/client/config_list.go b/vendor/github.com/docker/docker/client/config_list.go
deleted file mode 100644
index 14dd3813e..000000000
--- a/vendor/github.com/docker/docker/client/config_list.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// ConfigList returns the list of configs.
-func (cli *Client) ConfigList(ctx context.Context, options types.ConfigListOptions) ([]swarm.Config, error) {
-	if err := cli.NewVersionError(ctx, "1.30", "config list"); err != nil {
-		return nil, err
-	}
-	query := url.Values{}
-
-	if options.Filters.Len() > 0 {
-		filterJSON, err := filters.ToJSON(options.Filters)
-		if err != nil {
-			return nil, err
-		}
-
-		query.Set("filters", filterJSON)
-	}
-
-	resp, err := cli.get(ctx, "/configs", query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return nil, err
-	}
-
-	var configs []swarm.Config
-	err = json.NewDecoder(resp.body).Decode(&configs)
-	return configs, err
-}
diff --git a/vendor/github.com/docker/docker/client/config_remove.go b/vendor/github.com/docker/docker/client/config_remove.go
deleted file mode 100644
index d05b0113a..000000000
--- a/vendor/github.com/docker/docker/client/config_remove.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import "context"
-
-// ConfigRemove removes a config.
-func (cli *Client) ConfigRemove(ctx context.Context, id string) error {
-	if err := cli.NewVersionError(ctx, "1.30", "config remove"); err != nil {
-		return err
-	}
-	resp, err := cli.delete(ctx, "/configs/"+id, nil, nil)
-	defer ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/config_update.go b/vendor/github.com/docker/docker/client/config_update.go
deleted file mode 100644
index 6995861df..000000000
--- a/vendor/github.com/docker/docker/client/config_update.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// ConfigUpdate attempts to update a config
-func (cli *Client) ConfigUpdate(ctx context.Context, id string, version swarm.Version, config swarm.ConfigSpec) error {
-	if err := cli.NewVersionError(ctx, "1.30", "config update"); err != nil {
-		return err
-	}
-	query := url.Values{}
-	query.Set("version", version.String())
-	resp, err := cli.post(ctx, "/configs/"+id+"/update", query, config, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/container_attach.go b/vendor/github.com/docker/docker/client/container_attach.go
deleted file mode 100644
index 6a32e5f66..000000000
--- a/vendor/github.com/docker/docker/client/container_attach.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/http"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/container"
-)
-
-// ContainerAttach attaches a connection to a container in the server.
-// It returns a types.HijackedConnection with the hijacked connection
-// and the a reader to get output. It's up to the called to close
-// the hijacked connection by calling types.HijackedResponse.Close.
-//
-// The stream format on the response will be in one of two formats:
-//
-// If the container is using a TTY, there is only a single stream (stdout), and
-// data is copied directly from the container output stream, no extra
-// multiplexing or headers.
-//
-// If the container is *not* using a TTY, streams for stdout and stderr are
-// multiplexed.
-// The format of the multiplexed stream is as follows:
-//
-//	[8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}[]byte{OUTPUT}
-//
-// STREAM_TYPE can be 1 for stdout and 2 for stderr
-//
-// SIZE1, SIZE2, SIZE3, and SIZE4 are four bytes of uint32 encoded as big endian.
-// This is the size of OUTPUT.
-//
-// You can use github.com/docker/docker/pkg/stdcopy.StdCopy to demultiplex this
-// stream.
-func (cli *Client) ContainerAttach(ctx context.Context, container string, options container.AttachOptions) (types.HijackedResponse, error) {
-	query := url.Values{}
-	if options.Stream {
-		query.Set("stream", "1")
-	}
-	if options.Stdin {
-		query.Set("stdin", "1")
-	}
-	if options.Stdout {
-		query.Set("stdout", "1")
-	}
-	if options.Stderr {
-		query.Set("stderr", "1")
-	}
-	if options.DetachKeys != "" {
-		query.Set("detachKeys", options.DetachKeys)
-	}
-	if options.Logs {
-		query.Set("logs", "1")
-	}
-
-	return cli.postHijacked(ctx, "/containers/"+container+"/attach", query, nil, http.Header{
-		"Content-Type": {"text/plain"},
-	})
-}
diff --git a/vendor/github.com/docker/docker/client/container_commit.go b/vendor/github.com/docker/docker/client/container_commit.go
deleted file mode 100644
index 26b3f0915..000000000
--- a/vendor/github.com/docker/docker/client/container_commit.go
+++ /dev/null
@@ -1,56 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"errors"
-	"net/url"
-
-	"github.com/distribution/reference"
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/container"
-)
-
-// ContainerCommit applies changes to a container and creates a new tagged image.
-func (cli *Client) ContainerCommit(ctx context.Context, container string, options container.CommitOptions) (types.IDResponse, error) {
-	var repository, tag string
-	if options.Reference != "" {
-		ref, err := reference.ParseNormalizedNamed(options.Reference)
-		if err != nil {
-			return types.IDResponse{}, err
-		}
-
-		if _, isCanonical := ref.(reference.Canonical); isCanonical {
-			return types.IDResponse{}, errors.New("refusing to create a tag with a digest reference")
-		}
-		ref = reference.TagNameOnly(ref)
-
-		if tagged, ok := ref.(reference.Tagged); ok {
-			tag = tagged.Tag()
-		}
-		repository = reference.FamiliarName(ref)
-	}
-
-	query := url.Values{}
-	query.Set("container", container)
-	query.Set("repo", repository)
-	query.Set("tag", tag)
-	query.Set("comment", options.Comment)
-	query.Set("author", options.Author)
-	for _, change := range options.Changes {
-		query.Add("changes", change)
-	}
-	if !options.Pause {
-		query.Set("pause", "0")
-	}
-
-	var response types.IDResponse
-	resp, err := cli.post(ctx, "/commit", query, options.Config, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return response, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&response)
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/container_copy.go b/vendor/github.com/docker/docker/client/container_copy.go
deleted file mode 100644
index 8490a3b15..000000000
--- a/vendor/github.com/docker/docker/client/container_copy.go
+++ /dev/null
@@ -1,93 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/base64"
-	"encoding/json"
-	"fmt"
-	"io"
-	"net/http"
-	"net/url"
-	"path/filepath"
-	"strings"
-
-	"github.com/docker/docker/api/types/container"
-)
-
-// ContainerStatPath returns stat information about a path inside the container filesystem.
-func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path string) (container.PathStat, error) {
-	query := url.Values{}
-	query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API.
-
-	urlStr := "/containers/" + containerID + "/archive"
-	response, err := cli.head(ctx, urlStr, query, nil)
-	defer ensureReaderClosed(response)
-	if err != nil {
-		return container.PathStat{}, err
-	}
-	return getContainerPathStatFromHeader(response.header)
-}
-
-// CopyToContainer copies content into the container filesystem.
-// Note that `content` must be a Reader for a TAR archive
-func (cli *Client) CopyToContainer(ctx context.Context, containerID, dstPath string, content io.Reader, options container.CopyToContainerOptions) error {
-	query := url.Values{}
-	query.Set("path", filepath.ToSlash(dstPath)) // Normalize the paths used in the API.
-	// Do not allow for an existing directory to be overwritten by a non-directory and vice versa.
-	if !options.AllowOverwriteDirWithFile {
-		query.Set("noOverwriteDirNonDir", "true")
-	}
-
-	if options.CopyUIDGID {
-		query.Set("copyUIDGID", "true")
-	}
-
-	apiPath := "/containers/" + containerID + "/archive"
-
-	response, err := cli.putRaw(ctx, apiPath, query, content, nil)
-	defer ensureReaderClosed(response)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-// CopyFromContainer gets the content from the container and returns it as a Reader
-// for a TAR archive to manipulate it in the host. It's up to the caller to close the reader.
-func (cli *Client) CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, container.PathStat, error) {
-	query := make(url.Values, 1)
-	query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API.
-
-	apiPath := "/containers/" + containerID + "/archive"
-	response, err := cli.get(ctx, apiPath, query, nil)
-	if err != nil {
-		return nil, container.PathStat{}, err
-	}
-
-	// In order to get the copy behavior right, we need to know information
-	// about both the source and the destination. The response headers include
-	// stat info about the source that we can use in deciding exactly how to
-	// copy it locally. Along with the stat info about the local destination,
-	// we have everything we need to handle the multiple possibilities there
-	// can be when copying a file/dir from one location to another file/dir.
-	stat, err := getContainerPathStatFromHeader(response.header)
-	if err != nil {
-		return nil, stat, fmt.Errorf("unable to get resource stat from response: %s", err)
-	}
-	return response.body, stat, err
-}
-
-func getContainerPathStatFromHeader(header http.Header) (container.PathStat, error) {
-	var stat container.PathStat
-
-	encodedStat := header.Get("X-Docker-Container-Path-Stat")
-	statDecoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(encodedStat))
-
-	err := json.NewDecoder(statDecoder).Decode(&stat)
-	if err != nil {
-		err = fmt.Errorf("unable to decode container path stat header: %s", err)
-	}
-
-	return stat, err
-}
diff --git a/vendor/github.com/docker/docker/client/container_create.go b/vendor/github.com/docker/docker/client/container_create.go
deleted file mode 100644
index 5442d4267..000000000
--- a/vendor/github.com/docker/docker/client/container_create.go
+++ /dev/null
@@ -1,116 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-	"path"
-
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/network"
-	"github.com/docker/docker/api/types/versions"
-	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
-)
-
-type configWrapper struct {
-	*container.Config
-	HostConfig       *container.HostConfig
-	NetworkingConfig *network.NetworkingConfig
-}
-
-// ContainerCreate creates a new container based on the given configuration.
-// It can be associated with a name, but it's not mandatory.
-func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *ocispec.Platform, containerName string) (container.CreateResponse, error) {
-	var response container.CreateResponse
-
-	// Make sure we negotiated (if the client is configured to do so),
-	// as code below contains API-version specific handling of options.
-	//
-	// Normally, version-negotiation (if enabled) would not happen until
-	// the API request is made.
-	if err := cli.checkVersion(ctx); err != nil {
-		return response, err
-	}
-
-	if err := cli.NewVersionError(ctx, "1.25", "stop timeout"); config != nil && config.StopTimeout != nil && err != nil {
-		return response, err
-	}
-	if err := cli.NewVersionError(ctx, "1.41", "specify container image platform"); platform != nil && err != nil {
-		return response, err
-	}
-	if err := cli.NewVersionError(ctx, "1.44", "specify health-check start interval"); config != nil && config.Healthcheck != nil && config.Healthcheck.StartInterval != 0 && err != nil {
-		return response, err
-	}
-	if err := cli.NewVersionError(ctx, "1.44", "specify mac-address per network"); hasEndpointSpecificMacAddress(networkingConfig) && err != nil {
-		return response, err
-	}
-
-	if hostConfig != nil {
-		if versions.LessThan(cli.ClientVersion(), "1.25") {
-			// When using API 1.24 and under, the client is responsible for removing the container
-			hostConfig.AutoRemove = false
-		}
-		if versions.GreaterThanOrEqualTo(cli.ClientVersion(), "1.42") || versions.LessThan(cli.ClientVersion(), "1.40") {
-			// KernelMemory was added in API 1.40, and deprecated in API 1.42
-			hostConfig.KernelMemory = 0
-		}
-		if platform != nil && platform.OS == "linux" && versions.LessThan(cli.ClientVersion(), "1.42") {
-			// When using API under 1.42, the Linux daemon doesn't respect the ConsoleSize
-			hostConfig.ConsoleSize = [2]uint{0, 0}
-		}
-	}
-
-	// Since API 1.44, the container-wide MacAddress is deprecated and will trigger a WARNING if it's specified.
-	if versions.GreaterThanOrEqualTo(cli.ClientVersion(), "1.44") {
-		config.MacAddress = "" //nolint:staticcheck // ignore SA1019: field is deprecated, but still used on API < v1.44.
-	}
-
-	query := url.Values{}
-	if p := formatPlatform(platform); p != "" {
-		query.Set("platform", p)
-	}
-
-	if containerName != "" {
-		query.Set("name", containerName)
-	}
-
-	body := configWrapper{
-		Config:           config,
-		HostConfig:       hostConfig,
-		NetworkingConfig: networkingConfig,
-	}
-
-	serverResp, err := cli.post(ctx, "/containers/create", query, body, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return response, err
-	}
-
-	err = json.NewDecoder(serverResp.body).Decode(&response)
-	return response, err
-}
-
-// formatPlatform returns a formatted string representing platform (e.g. linux/arm/v7).
-//
-// Similar to containerd's platforms.Format(), but does allow components to be
-// omitted (e.g. pass "architecture" only, without "os":
-// https://github.com/containerd/containerd/blob/v1.5.2/platforms/platforms.go#L243-L263
-func formatPlatform(platform *ocispec.Platform) string {
-	if platform == nil {
-		return ""
-	}
-	return path.Join(platform.OS, platform.Architecture, platform.Variant)
-}
-
-// hasEndpointSpecificMacAddress checks whether one of the endpoint in networkingConfig has a MacAddress defined.
-func hasEndpointSpecificMacAddress(networkingConfig *network.NetworkingConfig) bool {
-	if networkingConfig == nil {
-		return false
-	}
-	for _, endpoint := range networkingConfig.EndpointsConfig {
-		if endpoint.MacAddress != "" {
-			return true
-		}
-	}
-	return false
-}
diff --git a/vendor/github.com/docker/docker/client/container_diff.go b/vendor/github.com/docker/docker/client/container_diff.go
deleted file mode 100644
index c22c819a7..000000000
--- a/vendor/github.com/docker/docker/client/container_diff.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types/container"
-)
-
-// ContainerDiff shows differences in a container filesystem since it was started.
-func (cli *Client) ContainerDiff(ctx context.Context, containerID string) ([]container.FilesystemChange, error) {
-	var changes []container.FilesystemChange
-
-	serverResp, err := cli.get(ctx, "/containers/"+containerID+"/changes", url.Values{}, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return changes, err
-	}
-
-	err = json.NewDecoder(serverResp.body).Decode(&changes)
-	return changes, err
-}
diff --git a/vendor/github.com/docker/docker/client/container_exec.go b/vendor/github.com/docker/docker/client/container_exec.go
deleted file mode 100644
index 9379448d1..000000000
--- a/vendor/github.com/docker/docker/client/container_exec.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/http"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/versions"
-)
-
-// ContainerExecCreate creates a new exec configuration to run an exec process.
-func (cli *Client) ContainerExecCreate(ctx context.Context, container string, options container.ExecOptions) (types.IDResponse, error) {
-	var response types.IDResponse
-
-	// Make sure we negotiated (if the client is configured to do so),
-	// as code below contains API-version specific handling of options.
-	//
-	// Normally, version-negotiation (if enabled) would not happen until
-	// the API request is made.
-	if err := cli.checkVersion(ctx); err != nil {
-		return response, err
-	}
-
-	if err := cli.NewVersionError(ctx, "1.25", "env"); len(options.Env) != 0 && err != nil {
-		return response, err
-	}
-	if versions.LessThan(cli.ClientVersion(), "1.42") {
-		options.ConsoleSize = nil
-	}
-
-	resp, err := cli.post(ctx, "/containers/"+container+"/exec", nil, options, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return response, err
-	}
-	err = json.NewDecoder(resp.body).Decode(&response)
-	return response, err
-}
-
-// ContainerExecStart starts an exec process already created in the docker host.
-func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config container.ExecStartOptions) error {
-	if versions.LessThan(cli.ClientVersion(), "1.42") {
-		config.ConsoleSize = nil
-	}
-	resp, err := cli.post(ctx, "/exec/"+execID+"/start", nil, config, nil)
-	ensureReaderClosed(resp)
-	return err
-}
-
-// ContainerExecAttach attaches a connection to an exec process in the server.
-// It returns a types.HijackedConnection with the hijacked connection
-// and the a reader to get output. It's up to the called to close
-// the hijacked connection by calling types.HijackedResponse.Close.
-func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config container.ExecAttachOptions) (types.HijackedResponse, error) {
-	if versions.LessThan(cli.ClientVersion(), "1.42") {
-		config.ConsoleSize = nil
-	}
-	return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, http.Header{
-		"Content-Type": {"application/json"},
-	})
-}
-
-// ContainerExecInspect returns information about a specific exec process on the docker host.
-func (cli *Client) ContainerExecInspect(ctx context.Context, execID string) (container.ExecInspect, error) {
-	var response container.ExecInspect
-	resp, err := cli.get(ctx, "/exec/"+execID+"/json", nil, nil)
-	if err != nil {
-		return response, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&response)
-	ensureReaderClosed(resp)
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/container_export.go b/vendor/github.com/docker/docker/client/container_export.go
deleted file mode 100644
index d0c0a5cba..000000000
--- a/vendor/github.com/docker/docker/client/container_export.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/url"
-)
-
-// ContainerExport retrieves the raw contents of a container
-// and returns them as an io.ReadCloser. It's up to the caller
-// to close the stream.
-func (cli *Client) ContainerExport(ctx context.Context, containerID string) (io.ReadCloser, error) {
-	serverResp, err := cli.get(ctx, "/containers/"+containerID+"/export", url.Values{}, nil)
-	if err != nil {
-		return nil, err
-	}
-
-	return serverResp.body, nil
-}
diff --git a/vendor/github.com/docker/docker/client/container_inspect.go b/vendor/github.com/docker/docker/client/container_inspect.go
deleted file mode 100644
index d48f0d3a6..000000000
--- a/vendor/github.com/docker/docker/client/container_inspect.go
+++ /dev/null
@@ -1,53 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"io"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-)
-
-// ContainerInspect returns the container information.
-func (cli *Client) ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error) {
-	if containerID == "" {
-		return types.ContainerJSON{}, objectNotFoundError{object: "container", id: containerID}
-	}
-	serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", nil, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return types.ContainerJSON{}, err
-	}
-
-	var response types.ContainerJSON
-	err = json.NewDecoder(serverResp.body).Decode(&response)
-	return response, err
-}
-
-// ContainerInspectWithRaw returns the container information and its raw representation.
-func (cli *Client) ContainerInspectWithRaw(ctx context.Context, containerID string, getSize bool) (types.ContainerJSON, []byte, error) {
-	if containerID == "" {
-		return types.ContainerJSON{}, nil, objectNotFoundError{object: "container", id: containerID}
-	}
-	query := url.Values{}
-	if getSize {
-		query.Set("size", "1")
-	}
-	serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", query, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return types.ContainerJSON{}, nil, err
-	}
-
-	body, err := io.ReadAll(serverResp.body)
-	if err != nil {
-		return types.ContainerJSON{}, nil, err
-	}
-
-	var response types.ContainerJSON
-	rdr := bytes.NewReader(body)
-	err = json.NewDecoder(rdr).Decode(&response)
-	return response, body, err
-}
diff --git a/vendor/github.com/docker/docker/client/container_kill.go b/vendor/github.com/docker/docker/client/container_kill.go
deleted file mode 100644
index 7c9529f1e..000000000
--- a/vendor/github.com/docker/docker/client/container_kill.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-)
-
-// ContainerKill terminates the container process but does not remove the container from the docker host.
-func (cli *Client) ContainerKill(ctx context.Context, containerID, signal string) error {
-	query := url.Values{}
-	if signal != "" {
-		query.Set("signal", signal)
-	}
-
-	resp, err := cli.post(ctx, "/containers/"+containerID+"/kill", query, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/container_list.go b/vendor/github.com/docker/docker/client/container_list.go
deleted file mode 100644
index 782e1b3c6..000000000
--- a/vendor/github.com/docker/docker/client/container_list.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-	"strconv"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/filters"
-)
-
-// ContainerList returns the list of containers in the docker host.
-func (cli *Client) ContainerList(ctx context.Context, options container.ListOptions) ([]types.Container, error) {
-	query := url.Values{}
-
-	if options.All {
-		query.Set("all", "1")
-	}
-
-	if options.Limit > 0 {
-		query.Set("limit", strconv.Itoa(options.Limit))
-	}
-
-	if options.Since != "" {
-		query.Set("since", options.Since)
-	}
-
-	if options.Before != "" {
-		query.Set("before", options.Before)
-	}
-
-	if options.Size {
-		query.Set("size", "1")
-	}
-
-	if options.Filters.Len() > 0 {
-		//nolint:staticcheck // ignore SA1019 for old code
-		filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filters)
-		if err != nil {
-			return nil, err
-		}
-
-		query.Set("filters", filterJSON)
-	}
-
-	resp, err := cli.get(ctx, "/containers/json", query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return nil, err
-	}
-
-	var containers []types.Container
-	err = json.NewDecoder(resp.body).Decode(&containers)
-	return containers, err
-}
diff --git a/vendor/github.com/docker/docker/client/container_logs.go b/vendor/github.com/docker/docker/client/container_logs.go
deleted file mode 100644
index 61197d840..000000000
--- a/vendor/github.com/docker/docker/client/container_logs.go
+++ /dev/null
@@ -1,80 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/url"
-	"time"
-
-	"github.com/docker/docker/api/types/container"
-	timetypes "github.com/docker/docker/api/types/time"
-	"github.com/pkg/errors"
-)
-
-// ContainerLogs returns the logs generated by a container in an io.ReadCloser.
-// It's up to the caller to close the stream.
-//
-// The stream format on the response will be in one of two formats:
-//
-// If the container is using a TTY, there is only a single stream (stdout), and
-// data is copied directly from the container output stream, no extra
-// multiplexing or headers.
-//
-// If the container is *not* using a TTY, streams for stdout and stderr are
-// multiplexed.
-// The format of the multiplexed stream is as follows:
-//
-//	[8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}[]byte{OUTPUT}
-//
-// STREAM_TYPE can be 1 for stdout and 2 for stderr
-//
-// SIZE1, SIZE2, SIZE3, and SIZE4 are four bytes of uint32 encoded as big endian.
-// This is the size of OUTPUT.
-//
-// You can use github.com/docker/docker/pkg/stdcopy.StdCopy to demultiplex this
-// stream.
-func (cli *Client) ContainerLogs(ctx context.Context, container string, options container.LogsOptions) (io.ReadCloser, error) {
-	query := url.Values{}
-	if options.ShowStdout {
-		query.Set("stdout", "1")
-	}
-
-	if options.ShowStderr {
-		query.Set("stderr", "1")
-	}
-
-	if options.Since != "" {
-		ts, err := timetypes.GetTimestamp(options.Since, time.Now())
-		if err != nil {
-			return nil, errors.Wrap(err, `invalid value for "since"`)
-		}
-		query.Set("since", ts)
-	}
-
-	if options.Until != "" {
-		ts, err := timetypes.GetTimestamp(options.Until, time.Now())
-		if err != nil {
-			return nil, errors.Wrap(err, `invalid value for "until"`)
-		}
-		query.Set("until", ts)
-	}
-
-	if options.Timestamps {
-		query.Set("timestamps", "1")
-	}
-
-	if options.Details {
-		query.Set("details", "1")
-	}
-
-	if options.Follow {
-		query.Set("follow", "1")
-	}
-	query.Set("tail", options.Tail)
-
-	resp, err := cli.get(ctx, "/containers/"+container+"/logs", query, nil)
-	if err != nil {
-		return nil, err
-	}
-	return resp.body, nil
-}
diff --git a/vendor/github.com/docker/docker/client/container_pause.go b/vendor/github.com/docker/docker/client/container_pause.go
deleted file mode 100644
index 5e7271a37..000000000
--- a/vendor/github.com/docker/docker/client/container_pause.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import "context"
-
-// ContainerPause pauses the main process of a given container without terminating it.
-func (cli *Client) ContainerPause(ctx context.Context, containerID string) error {
-	resp, err := cli.post(ctx, "/containers/"+containerID+"/pause", nil, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/container_prune.go b/vendor/github.com/docker/docker/client/container_prune.go
deleted file mode 100644
index 29c922da7..000000000
--- a/vendor/github.com/docker/docker/client/container_prune.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"fmt"
-
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/filters"
-)
-
-// ContainersPrune requests the daemon to delete unused data
-func (cli *Client) ContainersPrune(ctx context.Context, pruneFilters filters.Args) (container.PruneReport, error) {
-	var report container.PruneReport
-
-	if err := cli.NewVersionError(ctx, "1.25", "container prune"); err != nil {
-		return report, err
-	}
-
-	query, err := getFiltersQuery(pruneFilters)
-	if err != nil {
-		return report, err
-	}
-
-	serverResp, err := cli.post(ctx, "/containers/prune", query, nil, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return report, err
-	}
-
-	if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil {
-		return report, fmt.Errorf("Error retrieving disk usage: %v", err)
-	}
-
-	return report, nil
-}
diff --git a/vendor/github.com/docker/docker/client/container_remove.go b/vendor/github.com/docker/docker/client/container_remove.go
deleted file mode 100644
index 39f7b106a..000000000
--- a/vendor/github.com/docker/docker/client/container_remove.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types/container"
-)
-
-// ContainerRemove kills and removes a container from the docker host.
-func (cli *Client) ContainerRemove(ctx context.Context, containerID string, options container.RemoveOptions) error {
-	query := url.Values{}
-	if options.RemoveVolumes {
-		query.Set("v", "1")
-	}
-	if options.RemoveLinks {
-		query.Set("link", "1")
-	}
-
-	if options.Force {
-		query.Set("force", "1")
-	}
-
-	resp, err := cli.delete(ctx, "/containers/"+containerID, query, nil)
-	defer ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/container_rename.go b/vendor/github.com/docker/docker/client/container_rename.go
deleted file mode 100644
index 240fdf552..000000000
--- a/vendor/github.com/docker/docker/client/container_rename.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-)
-
-// ContainerRename changes the name of a given container.
-func (cli *Client) ContainerRename(ctx context.Context, containerID, newContainerName string) error {
-	query := url.Values{}
-	query.Set("name", newContainerName)
-	resp, err := cli.post(ctx, "/containers/"+containerID+"/rename", query, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/container_resize.go b/vendor/github.com/docker/docker/client/container_resize.go
deleted file mode 100644
index 5cfd01d47..000000000
--- a/vendor/github.com/docker/docker/client/container_resize.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-	"strconv"
-
-	"github.com/docker/docker/api/types/container"
-)
-
-// ContainerResize changes the size of the tty for a container.
-func (cli *Client) ContainerResize(ctx context.Context, containerID string, options container.ResizeOptions) error {
-	return cli.resize(ctx, "/containers/"+containerID, options.Height, options.Width)
-}
-
-// ContainerExecResize changes the size of the tty for an exec process running inside a container.
-func (cli *Client) ContainerExecResize(ctx context.Context, execID string, options container.ResizeOptions) error {
-	return cli.resize(ctx, "/exec/"+execID, options.Height, options.Width)
-}
-
-func (cli *Client) resize(ctx context.Context, basePath string, height, width uint) error {
-	query := url.Values{}
-	query.Set("h", strconv.Itoa(int(height)))
-	query.Set("w", strconv.Itoa(int(width)))
-
-	resp, err := cli.post(ctx, basePath+"/resize", query, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/container_restart.go b/vendor/github.com/docker/docker/client/container_restart.go
deleted file mode 100644
index 02b5079bc..000000000
--- a/vendor/github.com/docker/docker/client/container_restart.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-	"strconv"
-
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/versions"
-)
-
-// ContainerRestart stops and starts a container again.
-// It makes the daemon wait for the container to be up again for
-// a specific amount of time, given the timeout.
-func (cli *Client) ContainerRestart(ctx context.Context, containerID string, options container.StopOptions) error {
-	query := url.Values{}
-	if options.Timeout != nil {
-		query.Set("t", strconv.Itoa(*options.Timeout))
-	}
-	if options.Signal != "" {
-		// Make sure we negotiated (if the client is configured to do so),
-		// as code below contains API-version specific handling of options.
-		//
-		// Normally, version-negotiation (if enabled) would not happen until
-		// the API request is made.
-		if err := cli.checkVersion(ctx); err != nil {
-			return err
-		}
-		if versions.GreaterThanOrEqualTo(cli.version, "1.42") {
-			query.Set("signal", options.Signal)
-		}
-	}
-	resp, err := cli.post(ctx, "/containers/"+containerID+"/restart", query, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/container_start.go b/vendor/github.com/docker/docker/client/container_start.go
deleted file mode 100644
index 33ba85f24..000000000
--- a/vendor/github.com/docker/docker/client/container_start.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types/container"
-)
-
-// ContainerStart sends a request to the docker daemon to start a container.
-func (cli *Client) ContainerStart(ctx context.Context, containerID string, options container.StartOptions) error {
-	query := url.Values{}
-	if len(options.CheckpointID) != 0 {
-		query.Set("checkpoint", options.CheckpointID)
-	}
-	if len(options.CheckpointDir) != 0 {
-		query.Set("checkpoint-dir", options.CheckpointDir)
-	}
-
-	resp, err := cli.post(ctx, "/containers/"+containerID+"/start", query, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/container_stats.go b/vendor/github.com/docker/docker/client/container_stats.go
deleted file mode 100644
index b5641daee..000000000
--- a/vendor/github.com/docker/docker/client/container_stats.go
+++ /dev/null
@@ -1,46 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types/container"
-)
-
-// ContainerStats returns near realtime stats for a given container.
-// It's up to the caller to close the io.ReadCloser returned.
-func (cli *Client) ContainerStats(ctx context.Context, containerID string, stream bool) (container.StatsResponseReader, error) {
-	query := url.Values{}
-	query.Set("stream", "0")
-	if stream {
-		query.Set("stream", "1")
-	}
-
-	resp, err := cli.get(ctx, "/containers/"+containerID+"/stats", query, nil)
-	if err != nil {
-		return container.StatsResponseReader{}, err
-	}
-
-	return container.StatsResponseReader{
-		Body:   resp.body,
-		OSType: getDockerOS(resp.header.Get("Server")),
-	}, nil
-}
-
-// ContainerStatsOneShot gets a single stat entry from a container.
-// It differs from `ContainerStats` in that the API should not wait to prime the stats
-func (cli *Client) ContainerStatsOneShot(ctx context.Context, containerID string) (container.StatsResponseReader, error) {
-	query := url.Values{}
-	query.Set("stream", "0")
-	query.Set("one-shot", "1")
-
-	resp, err := cli.get(ctx, "/containers/"+containerID+"/stats", query, nil)
-	if err != nil {
-		return container.StatsResponseReader{}, err
-	}
-
-	return container.StatsResponseReader{
-		Body:   resp.body,
-		OSType: getDockerOS(resp.header.Get("Server")),
-	}, nil
-}
diff --git a/vendor/github.com/docker/docker/client/container_stop.go b/vendor/github.com/docker/docker/client/container_stop.go
deleted file mode 100644
index 7c98a354b..000000000
--- a/vendor/github.com/docker/docker/client/container_stop.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-	"strconv"
-
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/versions"
-)
-
-// ContainerStop stops a container. In case the container fails to stop
-// gracefully within a time frame specified by the timeout argument,
-// it is forcefully terminated (killed).
-//
-// If the timeout is nil, the container's StopTimeout value is used, if set,
-// otherwise the engine default. A negative timeout value can be specified,
-// meaning no timeout, i.e. no forceful termination is performed.
-func (cli *Client) ContainerStop(ctx context.Context, containerID string, options container.StopOptions) error {
-	query := url.Values{}
-	if options.Timeout != nil {
-		query.Set("t", strconv.Itoa(*options.Timeout))
-	}
-	if options.Signal != "" {
-		// Make sure we negotiated (if the client is configured to do so),
-		// as code below contains API-version specific handling of options.
-		//
-		// Normally, version-negotiation (if enabled) would not happen until
-		// the API request is made.
-		if err := cli.checkVersion(ctx); err != nil {
-			return err
-		}
-		if versions.GreaterThanOrEqualTo(cli.version, "1.42") {
-			query.Set("signal", options.Signal)
-		}
-	}
-	resp, err := cli.post(ctx, "/containers/"+containerID+"/stop", query, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/container_top.go b/vendor/github.com/docker/docker/client/container_top.go
deleted file mode 100644
index a5b78999b..000000000
--- a/vendor/github.com/docker/docker/client/container_top.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-	"strings"
-
-	"github.com/docker/docker/api/types/container"
-)
-
-// ContainerTop shows process information from within a container.
-func (cli *Client) ContainerTop(ctx context.Context, containerID string, arguments []string) (container.ContainerTopOKBody, error) {
-	var response container.ContainerTopOKBody
-	query := url.Values{}
-	if len(arguments) > 0 {
-		query.Set("ps_args", strings.Join(arguments, " "))
-	}
-
-	resp, err := cli.get(ctx, "/containers/"+containerID+"/top", query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return response, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&response)
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/container_unpause.go b/vendor/github.com/docker/docker/client/container_unpause.go
deleted file mode 100644
index 1d8f87316..000000000
--- a/vendor/github.com/docker/docker/client/container_unpause.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import "context"
-
-// ContainerUnpause resumes the process execution within a container
-func (cli *Client) ContainerUnpause(ctx context.Context, containerID string) error {
-	resp, err := cli.post(ctx, "/containers/"+containerID+"/unpause", nil, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/container_update.go b/vendor/github.com/docker/docker/client/container_update.go
deleted file mode 100644
index bf68a5300..000000000
--- a/vendor/github.com/docker/docker/client/container_update.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-
-	"github.com/docker/docker/api/types/container"
-)
-
-// ContainerUpdate updates the resources of a container.
-func (cli *Client) ContainerUpdate(ctx context.Context, containerID string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) {
-	var response container.ContainerUpdateOKBody
-	serverResp, err := cli.post(ctx, "/containers/"+containerID+"/update", nil, updateConfig, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return response, err
-	}
-
-	err = json.NewDecoder(serverResp.body).Decode(&response)
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/container_wait.go b/vendor/github.com/docker/docker/client/container_wait.go
deleted file mode 100644
index 8bb6be0a1..000000000
--- a/vendor/github.com/docker/docker/client/container_wait.go
+++ /dev/null
@@ -1,117 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"errors"
-	"io"
-	"net/url"
-
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/versions"
-)
-
-const containerWaitErrorMsgLimit = 2 * 1024 /* Max: 2KiB */
-
-// ContainerWait waits until the specified container is in a certain state
-// indicated by the given condition, either "not-running" (default),
-// "next-exit", or "removed".
-//
-// If this client's API version is before 1.30, condition is ignored and
-// ContainerWait will return immediately with the two channels, as the server
-// will wait as if the condition were "not-running".
-//
-// If this client's API version is at least 1.30, ContainerWait blocks until
-// the request has been acknowledged by the server (with a response header),
-// then returns two channels on which the caller can wait for the exit status
-// of the container or an error if there was a problem either beginning the
-// wait request or in getting the response. This allows the caller to
-// synchronize ContainerWait with other calls, such as specifying a
-// "next-exit" condition before issuing a ContainerStart request.
-func (cli *Client) ContainerWait(ctx context.Context, containerID string, condition container.WaitCondition) (<-chan container.WaitResponse, <-chan error) {
-	resultC := make(chan container.WaitResponse)
-	errC := make(chan error, 1)
-
-	// Make sure we negotiated (if the client is configured to do so),
-	// as code below contains API-version specific handling of options.
-	//
-	// Normally, version-negotiation (if enabled) would not happen until
-	// the API request is made.
-	if err := cli.checkVersion(ctx); err != nil {
-		errC <- err
-		return resultC, errC
-	}
-	if versions.LessThan(cli.ClientVersion(), "1.30") {
-		return cli.legacyContainerWait(ctx, containerID)
-	}
-
-	query := url.Values{}
-	if condition != "" {
-		query.Set("condition", string(condition))
-	}
-
-	resp, err := cli.post(ctx, "/containers/"+containerID+"/wait", query, nil, nil)
-	if err != nil {
-		defer ensureReaderClosed(resp)
-		errC <- err
-		return resultC, errC
-	}
-
-	go func() {
-		defer ensureReaderClosed(resp)
-
-		body := resp.body
-		responseText := bytes.NewBuffer(nil)
-		stream := io.TeeReader(body, responseText)
-
-		var res container.WaitResponse
-		if err := json.NewDecoder(stream).Decode(&res); err != nil {
-			// NOTE(nicks): The /wait API does not work well with HTTP proxies.
-			// At any time, the proxy could cut off the response stream.
-			//
-			// But because the HTTP status has already been written, the proxy's
-			// only option is to write a plaintext error message.
-			//
-			// If there's a JSON parsing error, read the real error message
-			// off the body and send it to the client.
-			if errors.As(err, new(*json.SyntaxError)) {
-				_, _ = io.ReadAll(io.LimitReader(stream, containerWaitErrorMsgLimit))
-				errC <- errors.New(responseText.String())
-			} else {
-				errC <- err
-			}
-			return
-		}
-
-		resultC <- res
-	}()
-
-	return resultC, errC
-}
-
-// legacyContainerWait returns immediately and doesn't have an option to wait
-// until the container is removed.
-func (cli *Client) legacyContainerWait(ctx context.Context, containerID string) (<-chan container.WaitResponse, <-chan error) {
-	resultC := make(chan container.WaitResponse)
-	errC := make(chan error)
-
-	go func() {
-		resp, err := cli.post(ctx, "/containers/"+containerID+"/wait", nil, nil, nil)
-		if err != nil {
-			errC <- err
-			return
-		}
-		defer ensureReaderClosed(resp)
-
-		var res container.WaitResponse
-		if err := json.NewDecoder(resp.body).Decode(&res); err != nil {
-			errC <- err
-			return
-		}
-
-		resultC <- res
-	}()
-
-	return resultC, errC
-}
diff --git a/vendor/github.com/docker/docker/client/disk_usage.go b/vendor/github.com/docker/docker/client/disk_usage.go
deleted file mode 100644
index ba0d92e9e..000000000
--- a/vendor/github.com/docker/docker/client/disk_usage.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"fmt"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-)
-
-// DiskUsage requests the current data usage from the daemon
-func (cli *Client) DiskUsage(ctx context.Context, options types.DiskUsageOptions) (types.DiskUsage, error) {
-	var query url.Values
-	if len(options.Types) > 0 {
-		query = url.Values{}
-		for _, t := range options.Types {
-			query.Add("type", string(t))
-		}
-	}
-
-	serverResp, err := cli.get(ctx, "/system/df", query, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return types.DiskUsage{}, err
-	}
-
-	var du types.DiskUsage
-	if err := json.NewDecoder(serverResp.body).Decode(&du); err != nil {
-		return types.DiskUsage{}, fmt.Errorf("Error retrieving disk usage: %v", err)
-	}
-	return du, nil
-}
diff --git a/vendor/github.com/docker/docker/client/distribution_inspect.go b/vendor/github.com/docker/docker/client/distribution_inspect.go
deleted file mode 100644
index 68e6ec5ed..000000000
--- a/vendor/github.com/docker/docker/client/distribution_inspect.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/http"
-	"net/url"
-
-	"github.com/docker/docker/api/types/registry"
-)
-
-// DistributionInspect returns the image digest with the full manifest.
-func (cli *Client) DistributionInspect(ctx context.Context, imageRef, encodedRegistryAuth string) (registry.DistributionInspect, error) {
-	// Contact the registry to retrieve digest and platform information
-	var distributionInspect registry.DistributionInspect
-	if imageRef == "" {
-		return distributionInspect, objectNotFoundError{object: "distribution", id: imageRef}
-	}
-
-	if err := cli.NewVersionError(ctx, "1.30", "distribution inspect"); err != nil {
-		return distributionInspect, err
-	}
-
-	var headers http.Header
-	if encodedRegistryAuth != "" {
-		headers = http.Header{
-			registry.AuthHeader: {encodedRegistryAuth},
-		}
-	}
-
-	resp, err := cli.get(ctx, "/distribution/"+imageRef+"/json", url.Values{}, headers)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return distributionInspect, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&distributionInspect)
-	return distributionInspect, err
-}
diff --git a/vendor/github.com/docker/docker/client/envvars.go b/vendor/github.com/docker/docker/client/envvars.go
deleted file mode 100644
index 61dd45c1d..000000000
--- a/vendor/github.com/docker/docker/client/envvars.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-const (
-	// EnvOverrideHost is the name of the environment variable that can be used
-	// to override the default host to connect to (DefaultDockerHost).
-	//
-	// This env-var is read by FromEnv and WithHostFromEnv and when set to a
-	// non-empty value, takes precedence over the default host (which is platform
-	// specific), or any host already set.
-	EnvOverrideHost = "DOCKER_HOST"
-
-	// EnvOverrideAPIVersion is the name of the environment variable that can
-	// be used to override the API version to use. Value should be
-	// formatted as MAJOR.MINOR, for example, "1.19".
-	//
-	// This env-var is read by FromEnv and WithVersionFromEnv and when set to a
-	// non-empty value, takes precedence over API version negotiation.
-	//
-	// This environment variable should be used for debugging purposes only, as
-	// it can set the client to use an incompatible (or invalid) API version.
-	EnvOverrideAPIVersion = "DOCKER_API_VERSION"
-
-	// EnvOverrideCertPath is the name of the environment variable that can be
-	// used to specify the directory from which to load the TLS certificates
-	// (ca.pem, cert.pem, key.pem) from. These certificates are used to configure
-	// the Client for a TCP connection protected by TLS client authentication.
-	//
-	// TLS certificate verification is enabled by default if the Client is configured
-	// to use a TLS connection. Refer to EnvTLSVerify below to learn how to
-	// disable verification for testing purposes.
-	//
-	// WARNING: Access to the remote API is equivalent to root access to the
-	// host where the daemon runs. Do not expose the API without protection,
-	// and only if needed. Make sure you are familiar with the "daemon attack
-	// surface" (https://docs.docker.com/go/attack-surface/).
-	//
-	// For local access to the API, it is recommended to connect with the daemon
-	// using the default local socket connection (on Linux), or the named pipe
-	// (on Windows).
-	//
-	// If you need to access the API of a remote daemon, consider using an SSH
-	// (ssh://) connection, which is easier to set up, and requires no additional
-	// configuration if the host is accessible using ssh.
-	//
-	// If you cannot use the alternatives above, and you must expose the API over
-	// a TCP connection, refer to https://docs.docker.com/engine/security/protect-access/
-	// to learn how to configure the daemon and client to use a TCP connection
-	// with TLS client authentication. Make sure you know the differences between
-	// a regular TLS connection and a TLS connection protected by TLS client
-	// authentication, and verify that the API cannot be accessed by other clients.
-	EnvOverrideCertPath = "DOCKER_CERT_PATH"
-
-	// EnvTLSVerify is the name of the environment variable that can be used to
-	// enable or disable TLS certificate verification. When set to a non-empty
-	// value, TLS certificate verification is enabled, and the client is configured
-	// to use a TLS connection, using certificates from the default directories
-	// (within `~/.docker`); refer to EnvOverrideCertPath above for additional
-	// details.
-	//
-	// WARNING: Access to the remote API is equivalent to root access to the
-	// host where the daemon runs. Do not expose the API without protection,
-	// and only if needed. Make sure you are familiar with the "daemon attack
-	// surface" (https://docs.docker.com/go/attack-surface/).
-	//
-	// Before setting up your client and daemon to use a TCP connection with TLS
-	// client authentication, consider using one of the alternatives mentioned
-	// in EnvOverrideCertPath above.
-	//
-	// Disabling TLS certificate verification (for testing purposes)
-	//
-	// TLS certificate verification is enabled by default if the Client is configured
-	// to use a TLS connection, and it is highly recommended to keep verification
-	// enabled to prevent machine-in-the-middle attacks. Refer to the documentation
-	// at https://docs.docker.com/engine/security/protect-access/ and pages linked
-	// from that page to learn how to configure the daemon and client to use a
-	// TCP connection with TLS client authentication enabled.
-	//
-	// Set the "DOCKER_TLS_VERIFY" environment to an empty string ("") to
-	// disable TLS certificate verification. Disabling verification is insecure,
-	// so should only be done for testing purposes. From the Go documentation
-	// (https://pkg.go.dev/crypto/tls#Config):
-	//
-	// InsecureSkipVerify controls whether a client verifies the server's
-	// certificate chain and host name. If InsecureSkipVerify is true, crypto/tls
-	// accepts any certificate presented by the server and any host name in that
-	// certificate. In this mode, TLS is susceptible to machine-in-the-middle
-	// attacks unless custom verification is used. This should be used only for
-	// testing or in combination with VerifyConnection or VerifyPeerCertificate.
-	EnvTLSVerify = "DOCKER_TLS_VERIFY"
-)
diff --git a/vendor/github.com/docker/docker/client/errors.go b/vendor/github.com/docker/docker/client/errors.go
deleted file mode 100644
index 0d01e243f..000000000
--- a/vendor/github.com/docker/docker/client/errors.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"fmt"
-
-	"github.com/docker/docker/api/types/versions"
-	"github.com/docker/docker/errdefs"
-	"github.com/pkg/errors"
-)
-
-// errConnectionFailed implements an error returned when connection failed.
-type errConnectionFailed struct {
-	error
-}
-
-// Error returns a string representation of an errConnectionFailed
-func (e errConnectionFailed) Error() string {
-	return e.error.Error()
-}
-
-func (e errConnectionFailed) Unwrap() error {
-	return e.error
-}
-
-// IsErrConnectionFailed returns true if the error is caused by connection failed.
-func IsErrConnectionFailed(err error) bool {
-	return errors.As(err, &errConnectionFailed{})
-}
-
-// ErrorConnectionFailed returns an error with host in the error message when connection to docker daemon failed.
-func ErrorConnectionFailed(host string) error {
-	var err error
-	if host == "" {
-		err = fmt.Errorf("Cannot connect to the Docker daemon. Is the docker daemon running on this host?")
-	} else {
-		err = fmt.Errorf("Cannot connect to the Docker daemon at %s. Is the docker daemon running?", host)
-	}
-	return errConnectionFailed{error: err}
-}
-
-// IsErrNotFound returns true if the error is a NotFound error, which is returned
-// by the API when some object is not found. It is an alias for [errdefs.IsNotFound].
-func IsErrNotFound(err error) bool {
-	return errdefs.IsNotFound(err)
-}
-
-type objectNotFoundError struct {
-	object string
-	id     string
-}
-
-func (e objectNotFoundError) NotFound() {}
-
-func (e objectNotFoundError) Error() string {
-	return fmt.Sprintf("Error: No such %s: %s", e.object, e.id)
-}
-
-// NewVersionError returns an error if the APIVersion required is less than the
-// current supported version.
-//
-// It performs API-version negotiation if the Client is configured with this
-// option, otherwise it assumes the latest API version is used.
-func (cli *Client) NewVersionError(ctx context.Context, APIrequired, feature string) error {
-	// Make sure we negotiated (if the client is configured to do so),
-	// as code below contains API-version specific handling of options.
-	//
-	// Normally, version-negotiation (if enabled) would not happen until
-	// the API request is made.
-	if err := cli.checkVersion(ctx); err != nil {
-		return err
-	}
-	if cli.version != "" && versions.LessThan(cli.version, APIrequired) {
-		return fmt.Errorf("%q requires API version %s, but the Docker daemon API version is %s", feature, APIrequired, cli.version)
-	}
-	return nil
-}
diff --git a/vendor/github.com/docker/docker/client/events.go b/vendor/github.com/docker/docker/client/events.go
deleted file mode 100644
index d3ab26bed..000000000
--- a/vendor/github.com/docker/docker/client/events.go
+++ /dev/null
@@ -1,100 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-	"time"
-
-	"github.com/docker/docker/api/types/events"
-	"github.com/docker/docker/api/types/filters"
-	timetypes "github.com/docker/docker/api/types/time"
-)
-
-// Events returns a stream of events in the daemon. It's up to the caller to close the stream
-// by cancelling the context. Once the stream has been completely read an io.EOF error will
-// be sent over the error channel. If an error is sent all processing will be stopped. It's up
-// to the caller to reopen the stream in the event of an error by reinvoking this method.
-func (cli *Client) Events(ctx context.Context, options events.ListOptions) (<-chan events.Message, <-chan error) {
-	messages := make(chan events.Message)
-	errs := make(chan error, 1)
-
-	started := make(chan struct{})
-	go func() {
-		defer close(errs)
-
-		query, err := buildEventsQueryParams(cli.version, options)
-		if err != nil {
-			close(started)
-			errs <- err
-			return
-		}
-
-		resp, err := cli.get(ctx, "/events", query, nil)
-		if err != nil {
-			close(started)
-			errs <- err
-			return
-		}
-		defer resp.body.Close()
-
-		decoder := json.NewDecoder(resp.body)
-
-		close(started)
-		for {
-			select {
-			case <-ctx.Done():
-				errs <- ctx.Err()
-				return
-			default:
-				var event events.Message
-				if err := decoder.Decode(&event); err != nil {
-					errs <- err
-					return
-				}
-
-				select {
-				case messages <- event:
-				case <-ctx.Done():
-					errs <- ctx.Err()
-					return
-				}
-			}
-		}
-	}()
-	<-started
-
-	return messages, errs
-}
-
-func buildEventsQueryParams(cliVersion string, options events.ListOptions) (url.Values, error) {
-	query := url.Values{}
-	ref := time.Now()
-
-	if options.Since != "" {
-		ts, err := timetypes.GetTimestamp(options.Since, ref)
-		if err != nil {
-			return nil, err
-		}
-		query.Set("since", ts)
-	}
-
-	if options.Until != "" {
-		ts, err := timetypes.GetTimestamp(options.Until, ref)
-		if err != nil {
-			return nil, err
-		}
-		query.Set("until", ts)
-	}
-
-	if options.Filters.Len() > 0 {
-		//nolint:staticcheck // ignore SA1019 for old code
-		filterJSON, err := filters.ToParamWithVersion(cliVersion, options.Filters)
-		if err != nil {
-			return nil, err
-		}
-		query.Set("filters", filterJSON)
-	}
-
-	return query, nil
-}
diff --git a/vendor/github.com/docker/docker/client/image_build.go b/vendor/github.com/docker/docker/client/image_build.go
deleted file mode 100644
index d294ddc8b..000000000
--- a/vendor/github.com/docker/docker/client/image_build.go
+++ /dev/null
@@ -1,144 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/base64"
-	"encoding/json"
-	"io"
-	"net/http"
-	"net/url"
-	"strconv"
-	"strings"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/container"
-)
-
-// ImageBuild sends a request to the daemon to build images.
-// The Body in the response implements an io.ReadCloser and it's up to the caller to
-// close it.
-func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error) {
-	query, err := cli.imageBuildOptionsToQuery(ctx, options)
-	if err != nil {
-		return types.ImageBuildResponse{}, err
-	}
-
-	buf, err := json.Marshal(options.AuthConfigs)
-	if err != nil {
-		return types.ImageBuildResponse{}, err
-	}
-
-	headers := http.Header{}
-	headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf))
-	headers.Set("Content-Type", "application/x-tar")
-
-	serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers)
-	if err != nil {
-		return types.ImageBuildResponse{}, err
-	}
-
-	return types.ImageBuildResponse{
-		Body:   serverResp.body,
-		OSType: getDockerOS(serverResp.header.Get("Server")),
-	}, nil
-}
-
-func (cli *Client) imageBuildOptionsToQuery(ctx context.Context, options types.ImageBuildOptions) (url.Values, error) {
-	query := url.Values{
-		"t":           options.Tags,
-		"securityopt": options.SecurityOpt,
-		"extrahosts":  options.ExtraHosts,
-	}
-	if options.SuppressOutput {
-		query.Set("q", "1")
-	}
-	if options.RemoteContext != "" {
-		query.Set("remote", options.RemoteContext)
-	}
-	if options.NoCache {
-		query.Set("nocache", "1")
-	}
-	if options.Remove {
-		query.Set("rm", "1")
-	} else {
-		query.Set("rm", "0")
-	}
-
-	if options.ForceRemove {
-		query.Set("forcerm", "1")
-	}
-
-	if options.PullParent {
-		query.Set("pull", "1")
-	}
-
-	if options.Squash {
-		if err := cli.NewVersionError(ctx, "1.25", "squash"); err != nil {
-			return query, err
-		}
-		query.Set("squash", "1")
-	}
-
-	if !container.Isolation.IsDefault(options.Isolation) {
-		query.Set("isolation", string(options.Isolation))
-	}
-
-	query.Set("cpusetcpus", options.CPUSetCPUs)
-	query.Set("networkmode", options.NetworkMode)
-	query.Set("cpusetmems", options.CPUSetMems)
-	query.Set("cpushares", strconv.FormatInt(options.CPUShares, 10))
-	query.Set("cpuquota", strconv.FormatInt(options.CPUQuota, 10))
-	query.Set("cpuperiod", strconv.FormatInt(options.CPUPeriod, 10))
-	query.Set("memory", strconv.FormatInt(options.Memory, 10))
-	query.Set("memswap", strconv.FormatInt(options.MemorySwap, 10))
-	query.Set("cgroupparent", options.CgroupParent)
-	query.Set("shmsize", strconv.FormatInt(options.ShmSize, 10))
-	query.Set("dockerfile", options.Dockerfile)
-	query.Set("target", options.Target)
-
-	ulimitsJSON, err := json.Marshal(options.Ulimits)
-	if err != nil {
-		return query, err
-	}
-	query.Set("ulimits", string(ulimitsJSON))
-
-	buildArgsJSON, err := json.Marshal(options.BuildArgs)
-	if err != nil {
-		return query, err
-	}
-	query.Set("buildargs", string(buildArgsJSON))
-
-	labelsJSON, err := json.Marshal(options.Labels)
-	if err != nil {
-		return query, err
-	}
-	query.Set("labels", string(labelsJSON))
-
-	cacheFromJSON, err := json.Marshal(options.CacheFrom)
-	if err != nil {
-		return query, err
-	}
-	query.Set("cachefrom", string(cacheFromJSON))
-	if options.SessionID != "" {
-		query.Set("session", options.SessionID)
-	}
-	if options.Platform != "" {
-		if err := cli.NewVersionError(ctx, "1.32", "platform"); err != nil {
-			return query, err
-		}
-		query.Set("platform", strings.ToLower(options.Platform))
-	}
-	if options.BuildID != "" {
-		query.Set("buildid", options.BuildID)
-	}
-	query.Set("version", string(options.Version))
-
-	if options.Outputs != nil {
-		outputsJSON, err := json.Marshal(options.Outputs)
-		if err != nil {
-			return query, err
-		}
-		query.Set("outputs", string(outputsJSON))
-	}
-	return query, nil
-}
diff --git a/vendor/github.com/docker/docker/client/image_create.go b/vendor/github.com/docker/docker/client/image_create.go
deleted file mode 100644
index 7c7873dca..000000000
--- a/vendor/github.com/docker/docker/client/image_create.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/http"
-	"net/url"
-	"strings"
-
-	"github.com/distribution/reference"
-	"github.com/docker/docker/api/types/image"
-	"github.com/docker/docker/api/types/registry"
-)
-
-// ImageCreate creates a new image based on the parent options.
-// It returns the JSON content in the response body.
-func (cli *Client) ImageCreate(ctx context.Context, parentReference string, options image.CreateOptions) (io.ReadCloser, error) {
-	ref, err := reference.ParseNormalizedNamed(parentReference)
-	if err != nil {
-		return nil, err
-	}
-
-	query := url.Values{}
-	query.Set("fromImage", reference.FamiliarName(ref))
-	query.Set("tag", getAPITagFromNamedRef(ref))
-	if options.Platform != "" {
-		query.Set("platform", strings.ToLower(options.Platform))
-	}
-	resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
-	if err != nil {
-		return nil, err
-	}
-	return resp.body, nil
-}
-
-func (cli *Client) tryImageCreate(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) {
-	return cli.post(ctx, "/images/create", query, nil, http.Header{
-		registry.AuthHeader: {registryAuth},
-	})
-}
diff --git a/vendor/github.com/docker/docker/client/image_history.go b/vendor/github.com/docker/docker/client/image_history.go
deleted file mode 100644
index b5bea10d8..000000000
--- a/vendor/github.com/docker/docker/client/image_history.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types/image"
-)
-
-// ImageHistory returns the changes in an image in history format.
-func (cli *Client) ImageHistory(ctx context.Context, imageID string) ([]image.HistoryResponseItem, error) {
-	var history []image.HistoryResponseItem
-	serverResp, err := cli.get(ctx, "/images/"+imageID+"/history", url.Values{}, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return history, err
-	}
-
-	err = json.NewDecoder(serverResp.body).Decode(&history)
-	return history, err
-}
diff --git a/vendor/github.com/docker/docker/client/image_import.go b/vendor/github.com/docker/docker/client/image_import.go
deleted file mode 100644
index 43d55eda8..000000000
--- a/vendor/github.com/docker/docker/client/image_import.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/url"
-	"strings"
-
-	"github.com/distribution/reference"
-	"github.com/docker/docker/api/types/image"
-)
-
-// ImageImport creates a new image based on the source options.
-// It returns the JSON content in the response body.
-func (cli *Client) ImageImport(ctx context.Context, source image.ImportSource, ref string, options image.ImportOptions) (io.ReadCloser, error) {
-	if ref != "" {
-		// Check if the given image name can be resolved
-		if _, err := reference.ParseNormalizedNamed(ref); err != nil {
-			return nil, err
-		}
-	}
-
-	query := url.Values{}
-	query.Set("fromSrc", source.SourceName)
-	query.Set("repo", ref)
-	query.Set("tag", options.Tag)
-	query.Set("message", options.Message)
-	if options.Platform != "" {
-		query.Set("platform", strings.ToLower(options.Platform))
-	}
-	for _, change := range options.Changes {
-		query.Add("changes", change)
-	}
-
-	resp, err := cli.postRaw(ctx, "/images/create", query, source.Source, nil)
-	if err != nil {
-		return nil, err
-	}
-	return resp.body, nil
-}
diff --git a/vendor/github.com/docker/docker/client/image_inspect.go b/vendor/github.com/docker/docker/client/image_inspect.go
deleted file mode 100644
index 1de10e5a0..000000000
--- a/vendor/github.com/docker/docker/client/image_inspect.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"io"
-
-	"github.com/docker/docker/api/types"
-)
-
-// ImageInspectWithRaw returns the image information and its raw representation.
-func (cli *Client) ImageInspectWithRaw(ctx context.Context, imageID string) (types.ImageInspect, []byte, error) {
-	if imageID == "" {
-		return types.ImageInspect{}, nil, objectNotFoundError{object: "image", id: imageID}
-	}
-	serverResp, err := cli.get(ctx, "/images/"+imageID+"/json", nil, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return types.ImageInspect{}, nil, err
-	}
-
-	body, err := io.ReadAll(serverResp.body)
-	if err != nil {
-		return types.ImageInspect{}, nil, err
-	}
-
-	var response types.ImageInspect
-	rdr := bytes.NewReader(body)
-	err = json.NewDecoder(rdr).Decode(&response)
-	return response, body, err
-}
diff --git a/vendor/github.com/docker/docker/client/image_list.go b/vendor/github.com/docker/docker/client/image_list.go
deleted file mode 100644
index bef679431..000000000
--- a/vendor/github.com/docker/docker/client/image_list.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/image"
-	"github.com/docker/docker/api/types/versions"
-)
-
-// ImageList returns a list of images in the docker host.
-//
-// Experimental: Setting the [options.Manifest] will populate
-// [image.Summary.Manifests] with information about image manifests.
-// This is experimental and might change in the future without any backward
-// compatibility.
-func (cli *Client) ImageList(ctx context.Context, options image.ListOptions) ([]image.Summary, error) {
-	var images []image.Summary
-
-	// Make sure we negotiated (if the client is configured to do so),
-	// as code below contains API-version specific handling of options.
-	//
-	// Normally, version-negotiation (if enabled) would not happen until
-	// the API request is made.
-	if err := cli.checkVersion(ctx); err != nil {
-		return images, err
-	}
-
-	query := url.Values{}
-
-	optionFilters := options.Filters
-	referenceFilters := optionFilters.Get("reference")
-	if versions.LessThan(cli.version, "1.25") && len(referenceFilters) > 0 {
-		query.Set("filter", referenceFilters[0])
-		for _, filterValue := range referenceFilters {
-			optionFilters.Del("reference", filterValue)
-		}
-	}
-	if optionFilters.Len() > 0 {
-		//nolint:staticcheck // ignore SA1019 for old code
-		filterJSON, err := filters.ToParamWithVersion(cli.version, optionFilters)
-		if err != nil {
-			return images, err
-		}
-		query.Set("filters", filterJSON)
-	}
-	if options.All {
-		query.Set("all", "1")
-	}
-	if options.SharedSize && versions.GreaterThanOrEqualTo(cli.version, "1.42") {
-		query.Set("shared-size", "1")
-	}
-	if options.Manifests && versions.GreaterThanOrEqualTo(cli.version, "1.47") {
-		query.Set("manifests", "1")
-	}
-
-	serverResp, err := cli.get(ctx, "/images/json", query, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return images, err
-	}
-
-	err = json.NewDecoder(serverResp.body).Decode(&images)
-	return images, err
-}
diff --git a/vendor/github.com/docker/docker/client/image_load.go b/vendor/github.com/docker/docker/client/image_load.go
deleted file mode 100644
index c68f0013e..000000000
--- a/vendor/github.com/docker/docker/client/image_load.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/http"
-	"net/url"
-
-	"github.com/docker/docker/api/types/image"
-)
-
-// ImageLoad loads an image in the docker host from the client host.
-// It's up to the caller to close the io.ReadCloser in the
-// ImageLoadResponse returned by this function.
-func (cli *Client) ImageLoad(ctx context.Context, input io.Reader, quiet bool) (image.LoadResponse, error) {
-	v := url.Values{}
-	v.Set("quiet", "0")
-	if quiet {
-		v.Set("quiet", "1")
-	}
-	resp, err := cli.postRaw(ctx, "/images/load", v, input, http.Header{
-		"Content-Type": {"application/x-tar"},
-	})
-	if err != nil {
-		return image.LoadResponse{}, err
-	}
-	return image.LoadResponse{
-		Body: resp.body,
-		JSON: resp.header.Get("Content-Type") == "application/json",
-	}, nil
-}
diff --git a/vendor/github.com/docker/docker/client/image_prune.go b/vendor/github.com/docker/docker/client/image_prune.go
deleted file mode 100644
index 5ee987e24..000000000
--- a/vendor/github.com/docker/docker/client/image_prune.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"fmt"
-
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/image"
-)
-
-// ImagesPrune requests the daemon to delete unused data
-func (cli *Client) ImagesPrune(ctx context.Context, pruneFilters filters.Args) (image.PruneReport, error) {
-	var report image.PruneReport
-
-	if err := cli.NewVersionError(ctx, "1.25", "image prune"); err != nil {
-		return report, err
-	}
-
-	query, err := getFiltersQuery(pruneFilters)
-	if err != nil {
-		return report, err
-	}
-
-	serverResp, err := cli.post(ctx, "/images/prune", query, nil, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return report, err
-	}
-
-	if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil {
-		return report, fmt.Errorf("Error retrieving disk usage: %v", err)
-	}
-
-	return report, nil
-}
diff --git a/vendor/github.com/docker/docker/client/image_pull.go b/vendor/github.com/docker/docker/client/image_pull.go
deleted file mode 100644
index 1634c4c80..000000000
--- a/vendor/github.com/docker/docker/client/image_pull.go
+++ /dev/null
@@ -1,64 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/url"
-	"strings"
-
-	"github.com/distribution/reference"
-	"github.com/docker/docker/api/types/image"
-	"github.com/docker/docker/errdefs"
-)
-
-// ImagePull requests the docker host to pull an image from a remote registry.
-// It executes the privileged function if the operation is unauthorized
-// and it tries one more time.
-// It's up to the caller to handle the io.ReadCloser and close it properly.
-//
-// FIXME(vdemeester): there is currently used in a few way in docker/docker
-// - if not in trusted content, ref is used to pass the whole reference, and tag is empty
-// - if in trusted content, ref is used to pass the reference name, and tag for the digest
-func (cli *Client) ImagePull(ctx context.Context, refStr string, options image.PullOptions) (io.ReadCloser, error) {
-	ref, err := reference.ParseNormalizedNamed(refStr)
-	if err != nil {
-		return nil, err
-	}
-
-	query := url.Values{}
-	query.Set("fromImage", reference.FamiliarName(ref))
-	if !options.All {
-		query.Set("tag", getAPITagFromNamedRef(ref))
-	}
-	if options.Platform != "" {
-		query.Set("platform", strings.ToLower(options.Platform))
-	}
-
-	resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
-	if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
-		newAuthHeader, privilegeErr := options.PrivilegeFunc(ctx)
-		if privilegeErr != nil {
-			return nil, privilegeErr
-		}
-		resp, err = cli.tryImageCreate(ctx, query, newAuthHeader)
-	}
-	if err != nil {
-		return nil, err
-	}
-	return resp.body, nil
-}
-
-// getAPITagFromNamedRef returns a tag from the specified reference.
-// This function is necessary as long as the docker "server" api expects
-// digests to be sent as tags and makes a distinction between the name
-// and tag/digest part of a reference.
-func getAPITagFromNamedRef(ref reference.Named) string {
-	if digested, ok := ref.(reference.Digested); ok {
-		return digested.Digest().String()
-	}
-	ref = reference.TagNameOnly(ref)
-	if tagged, ok := ref.(reference.Tagged); ok {
-		return tagged.Tag()
-	}
-	return ""
-}
diff --git a/vendor/github.com/docker/docker/client/image_push.go b/vendor/github.com/docker/docker/client/image_push.go
deleted file mode 100644
index 16f9c4651..000000000
--- a/vendor/github.com/docker/docker/client/image_push.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"io"
-	"net/http"
-	"net/url"
-
-	"github.com/distribution/reference"
-	"github.com/docker/docker/api/types/image"
-	"github.com/docker/docker/api/types/registry"
-	"github.com/docker/docker/errdefs"
-)
-
-// ImagePush requests the docker host to push an image to a remote registry.
-// It executes the privileged function if the operation is unauthorized
-// and it tries one more time.
-// It's up to the caller to handle the io.ReadCloser and close it properly.
-func (cli *Client) ImagePush(ctx context.Context, image string, options image.PushOptions) (io.ReadCloser, error) {
-	ref, err := reference.ParseNormalizedNamed(image)
-	if err != nil {
-		return nil, err
-	}
-
-	if _, isCanonical := ref.(reference.Canonical); isCanonical {
-		return nil, errors.New("cannot push a digest reference")
-	}
-
-	name := reference.FamiliarName(ref)
-	query := url.Values{}
-	if !options.All {
-		ref = reference.TagNameOnly(ref)
-		if tagged, ok := ref.(reference.Tagged); ok {
-			query.Set("tag", tagged.Tag())
-		}
-	}
-
-	if options.Platform != nil {
-		if err := cli.NewVersionError(ctx, "1.46", "platform"); err != nil {
-			return nil, err
-		}
-
-		p := *options.Platform
-		pJson, err := json.Marshal(p)
-		if err != nil {
-			return nil, fmt.Errorf("invalid platform: %v", err)
-		}
-
-		query.Set("platform", string(pJson))
-	}
-
-	resp, err := cli.tryImagePush(ctx, name, query, options.RegistryAuth)
-	if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
-		newAuthHeader, privilegeErr := options.PrivilegeFunc(ctx)
-		if privilegeErr != nil {
-			return nil, privilegeErr
-		}
-		resp, err = cli.tryImagePush(ctx, name, query, newAuthHeader)
-	}
-	if err != nil {
-		return nil, err
-	}
-	return resp.body, nil
-}
-
-func (cli *Client) tryImagePush(ctx context.Context, imageID string, query url.Values, registryAuth string) (serverResponse, error) {
-	return cli.post(ctx, "/images/"+imageID+"/push", query, nil, http.Header{
-		registry.AuthHeader: {registryAuth},
-	})
-}
diff --git a/vendor/github.com/docker/docker/client/image_remove.go b/vendor/github.com/docker/docker/client/image_remove.go
deleted file mode 100644
index 652d1bfa3..000000000
--- a/vendor/github.com/docker/docker/client/image_remove.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types/image"
-)
-
-// ImageRemove removes an image from the docker host.
-func (cli *Client) ImageRemove(ctx context.Context, imageID string, options image.RemoveOptions) ([]image.DeleteResponse, error) {
-	query := url.Values{}
-
-	if options.Force {
-		query.Set("force", "1")
-	}
-	if !options.PruneChildren {
-		query.Set("noprune", "1")
-	}
-
-	var dels []image.DeleteResponse
-	resp, err := cli.delete(ctx, "/images/"+imageID, query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return dels, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&dels)
-	return dels, err
-}
diff --git a/vendor/github.com/docker/docker/client/image_save.go b/vendor/github.com/docker/docker/client/image_save.go
deleted file mode 100644
index d1314e4b2..000000000
--- a/vendor/github.com/docker/docker/client/image_save.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/url"
-)
-
-// ImageSave retrieves one or more images from the docker host as an io.ReadCloser.
-// It's up to the caller to store the images and close the stream.
-func (cli *Client) ImageSave(ctx context.Context, imageIDs []string) (io.ReadCloser, error) {
-	query := url.Values{
-		"names": imageIDs,
-	}
-
-	resp, err := cli.get(ctx, "/images/get", query, nil)
-	if err != nil {
-		return nil, err
-	}
-	return resp.body, nil
-}
diff --git a/vendor/github.com/docker/docker/client/image_search.go b/vendor/github.com/docker/docker/client/image_search.go
deleted file mode 100644
index 0a0745757..000000000
--- a/vendor/github.com/docker/docker/client/image_search.go
+++ /dev/null
@@ -1,54 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/http"
-	"net/url"
-	"strconv"
-
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/registry"
-	"github.com/docker/docker/errdefs"
-)
-
-// ImageSearch makes the docker host search by a term in a remote registry.
-// The list of results is not sorted in any fashion.
-func (cli *Client) ImageSearch(ctx context.Context, term string, options registry.SearchOptions) ([]registry.SearchResult, error) {
-	var results []registry.SearchResult
-	query := url.Values{}
-	query.Set("term", term)
-	if options.Limit > 0 {
-		query.Set("limit", strconv.Itoa(options.Limit))
-	}
-
-	if options.Filters.Len() > 0 {
-		filterJSON, err := filters.ToJSON(options.Filters)
-		if err != nil {
-			return results, err
-		}
-		query.Set("filters", filterJSON)
-	}
-
-	resp, err := cli.tryImageSearch(ctx, query, options.RegistryAuth)
-	defer ensureReaderClosed(resp)
-	if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
-		newAuthHeader, privilegeErr := options.PrivilegeFunc(ctx)
-		if privilegeErr != nil {
-			return results, privilegeErr
-		}
-		resp, err = cli.tryImageSearch(ctx, query, newAuthHeader)
-	}
-	if err != nil {
-		return results, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&results)
-	return results, err
-}
-
-func (cli *Client) tryImageSearch(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) {
-	return cli.get(ctx, "/images/search", query, http.Header{
-		registry.AuthHeader: {registryAuth},
-	})
-}
diff --git a/vendor/github.com/docker/docker/client/image_tag.go b/vendor/github.com/docker/docker/client/image_tag.go
deleted file mode 100644
index ea6b4a1e6..000000000
--- a/vendor/github.com/docker/docker/client/image_tag.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/distribution/reference"
-	"github.com/pkg/errors"
-)
-
-// ImageTag tags an image in the docker host
-func (cli *Client) ImageTag(ctx context.Context, source, target string) error {
-	if _, err := reference.ParseAnyReference(source); err != nil {
-		return errors.Wrapf(err, "Error parsing reference: %q is not a valid repository/tag", source)
-	}
-
-	ref, err := reference.ParseNormalizedNamed(target)
-	if err != nil {
-		return errors.Wrapf(err, "Error parsing reference: %q is not a valid repository/tag", target)
-	}
-
-	if _, isCanonical := ref.(reference.Canonical); isCanonical {
-		return errors.New("refusing to create a tag with a digest reference")
-	}
-
-	ref = reference.TagNameOnly(ref)
-
-	query := url.Values{}
-	query.Set("repo", reference.FamiliarName(ref))
-	if tagged, ok := ref.(reference.Tagged); ok {
-		query.Set("tag", tagged.Tag())
-	}
-
-	resp, err := cli.post(ctx, "/images/"+source+"/tag", query, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/info.go b/vendor/github.com/docker/docker/client/info.go
deleted file mode 100644
index cc3fcc467..000000000
--- a/vendor/github.com/docker/docker/client/info.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"fmt"
-	"net/url"
-
-	"github.com/docker/docker/api/types/system"
-)
-
-// Info returns information about the docker server.
-func (cli *Client) Info(ctx context.Context) (system.Info, error) {
-	var info system.Info
-	serverResp, err := cli.get(ctx, "/info", url.Values{}, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return info, err
-	}
-
-	if err := json.NewDecoder(serverResp.body).Decode(&info); err != nil {
-		return info, fmt.Errorf("Error reading remote info: %v", err)
-	}
-
-	return info, nil
-}
diff --git a/vendor/github.com/docker/docker/client/interface.go b/vendor/github.com/docker/docker/client/interface.go
deleted file mode 100644
index cc60a5d13..000000000
--- a/vendor/github.com/docker/docker/client/interface.go
+++ /dev/null
@@ -1,202 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net"
-	"net/http"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/container"
-	"github.com/docker/docker/api/types/events"
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/image"
-	"github.com/docker/docker/api/types/network"
-	"github.com/docker/docker/api/types/registry"
-	"github.com/docker/docker/api/types/swarm"
-	"github.com/docker/docker/api/types/system"
-	"github.com/docker/docker/api/types/volume"
-	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
-)
-
-// CommonAPIClient is the common methods between stable and experimental versions of APIClient.
-type CommonAPIClient interface {
-	ConfigAPIClient
-	ContainerAPIClient
-	DistributionAPIClient
-	ImageAPIClient
-	NodeAPIClient
-	NetworkAPIClient
-	PluginAPIClient
-	ServiceAPIClient
-	SwarmAPIClient
-	SecretAPIClient
-	SystemAPIClient
-	VolumeAPIClient
-	ClientVersion() string
-	DaemonHost() string
-	HTTPClient() *http.Client
-	ServerVersion(ctx context.Context) (types.Version, error)
-	NegotiateAPIVersion(ctx context.Context)
-	NegotiateAPIVersionPing(types.Ping)
-	DialHijack(ctx context.Context, url, proto string, meta map[string][]string) (net.Conn, error)
-	Dialer() func(context.Context) (net.Conn, error)
-	Close() error
-}
-
-// ContainerAPIClient defines API client methods for the containers
-type ContainerAPIClient interface {
-	ContainerAttach(ctx context.Context, container string, options container.AttachOptions) (types.HijackedResponse, error)
-	ContainerCommit(ctx context.Context, container string, options container.CommitOptions) (types.IDResponse, error)
-	ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *ocispec.Platform, containerName string) (container.CreateResponse, error)
-	ContainerDiff(ctx context.Context, container string) ([]container.FilesystemChange, error)
-	ContainerExecAttach(ctx context.Context, execID string, options container.ExecAttachOptions) (types.HijackedResponse, error)
-	ContainerExecCreate(ctx context.Context, container string, options container.ExecOptions) (types.IDResponse, error)
-	ContainerExecInspect(ctx context.Context, execID string) (container.ExecInspect, error)
-	ContainerExecResize(ctx context.Context, execID string, options container.ResizeOptions) error
-	ContainerExecStart(ctx context.Context, execID string, options container.ExecStartOptions) error
-	ContainerExport(ctx context.Context, container string) (io.ReadCloser, error)
-	ContainerInspect(ctx context.Context, container string) (types.ContainerJSON, error)
-	ContainerInspectWithRaw(ctx context.Context, container string, getSize bool) (types.ContainerJSON, []byte, error)
-	ContainerKill(ctx context.Context, container, signal string) error
-	ContainerList(ctx context.Context, options container.ListOptions) ([]types.Container, error)
-	ContainerLogs(ctx context.Context, container string, options container.LogsOptions) (io.ReadCloser, error)
-	ContainerPause(ctx context.Context, container string) error
-	ContainerRemove(ctx context.Context, container string, options container.RemoveOptions) error
-	ContainerRename(ctx context.Context, container, newContainerName string) error
-	ContainerResize(ctx context.Context, container string, options container.ResizeOptions) error
-	ContainerRestart(ctx context.Context, container string, options container.StopOptions) error
-	ContainerStatPath(ctx context.Context, container, path string) (container.PathStat, error)
-	ContainerStats(ctx context.Context, container string, stream bool) (container.StatsResponseReader, error)
-	ContainerStatsOneShot(ctx context.Context, container string) (container.StatsResponseReader, error)
-	ContainerStart(ctx context.Context, container string, options container.StartOptions) error
-	ContainerStop(ctx context.Context, container string, options container.StopOptions) error
-	ContainerTop(ctx context.Context, container string, arguments []string) (container.ContainerTopOKBody, error)
-	ContainerUnpause(ctx context.Context, container string) error
-	ContainerUpdate(ctx context.Context, container string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error)
-	ContainerWait(ctx context.Context, container string, condition container.WaitCondition) (<-chan container.WaitResponse, <-chan error)
-	CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, container.PathStat, error)
-	CopyToContainer(ctx context.Context, container, path string, content io.Reader, options container.CopyToContainerOptions) error
-	ContainersPrune(ctx context.Context, pruneFilters filters.Args) (container.PruneReport, error)
-}
-
-// DistributionAPIClient defines API client methods for the registry
-type DistributionAPIClient interface {
-	DistributionInspect(ctx context.Context, image, encodedRegistryAuth string) (registry.DistributionInspect, error)
-}
-
-// ImageAPIClient defines API client methods for the images
-type ImageAPIClient interface {
-	ImageBuild(ctx context.Context, context io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error)
-	BuildCachePrune(ctx context.Context, opts types.BuildCachePruneOptions) (*types.BuildCachePruneReport, error)
-	BuildCancel(ctx context.Context, id string) error
-	ImageCreate(ctx context.Context, parentReference string, options image.CreateOptions) (io.ReadCloser, error)
-	ImageHistory(ctx context.Context, image string) ([]image.HistoryResponseItem, error)
-	ImageImport(ctx context.Context, source image.ImportSource, ref string, options image.ImportOptions) (io.ReadCloser, error)
-	ImageInspectWithRaw(ctx context.Context, image string) (types.ImageInspect, []byte, error)
-	ImageList(ctx context.Context, options image.ListOptions) ([]image.Summary, error)
-	ImageLoad(ctx context.Context, input io.Reader, quiet bool) (image.LoadResponse, error)
-	ImagePull(ctx context.Context, ref string, options image.PullOptions) (io.ReadCloser, error)
-	ImagePush(ctx context.Context, ref string, options image.PushOptions) (io.ReadCloser, error)
-	ImageRemove(ctx context.Context, image string, options image.RemoveOptions) ([]image.DeleteResponse, error)
-	ImageSearch(ctx context.Context, term string, options registry.SearchOptions) ([]registry.SearchResult, error)
-	ImageSave(ctx context.Context, images []string) (io.ReadCloser, error)
-	ImageTag(ctx context.Context, image, ref string) error
-	ImagesPrune(ctx context.Context, pruneFilter filters.Args) (image.PruneReport, error)
-}
-
-// NetworkAPIClient defines API client methods for the networks
-type NetworkAPIClient interface {
-	NetworkConnect(ctx context.Context, network, container string, config *network.EndpointSettings) error
-	NetworkCreate(ctx context.Context, name string, options network.CreateOptions) (network.CreateResponse, error)
-	NetworkDisconnect(ctx context.Context, network, container string, force bool) error
-	NetworkInspect(ctx context.Context, network string, options network.InspectOptions) (network.Inspect, error)
-	NetworkInspectWithRaw(ctx context.Context, network string, options network.InspectOptions) (network.Inspect, []byte, error)
-	NetworkList(ctx context.Context, options network.ListOptions) ([]network.Summary, error)
-	NetworkRemove(ctx context.Context, network string) error
-	NetworksPrune(ctx context.Context, pruneFilter filters.Args) (network.PruneReport, error)
-}
-
-// NodeAPIClient defines API client methods for the nodes
-type NodeAPIClient interface {
-	NodeInspectWithRaw(ctx context.Context, nodeID string) (swarm.Node, []byte, error)
-	NodeList(ctx context.Context, options types.NodeListOptions) ([]swarm.Node, error)
-	NodeRemove(ctx context.Context, nodeID string, options types.NodeRemoveOptions) error
-	NodeUpdate(ctx context.Context, nodeID string, version swarm.Version, node swarm.NodeSpec) error
-}
-
-// PluginAPIClient defines API client methods for the plugins
-type PluginAPIClient interface {
-	PluginList(ctx context.Context, filter filters.Args) (types.PluginsListResponse, error)
-	PluginRemove(ctx context.Context, name string, options types.PluginRemoveOptions) error
-	PluginEnable(ctx context.Context, name string, options types.PluginEnableOptions) error
-	PluginDisable(ctx context.Context, name string, options types.PluginDisableOptions) error
-	PluginInstall(ctx context.Context, name string, options types.PluginInstallOptions) (io.ReadCloser, error)
-	PluginUpgrade(ctx context.Context, name string, options types.PluginInstallOptions) (io.ReadCloser, error)
-	PluginPush(ctx context.Context, name string, registryAuth string) (io.ReadCloser, error)
-	PluginSet(ctx context.Context, name string, args []string) error
-	PluginInspectWithRaw(ctx context.Context, name string) (*types.Plugin, []byte, error)
-	PluginCreate(ctx context.Context, createContext io.Reader, options types.PluginCreateOptions) error
-}
-
-// ServiceAPIClient defines API client methods for the services
-type ServiceAPIClient interface {
-	ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (swarm.ServiceCreateResponse, error)
-	ServiceInspectWithRaw(ctx context.Context, serviceID string, options types.ServiceInspectOptions) (swarm.Service, []byte, error)
-	ServiceList(ctx context.Context, options types.ServiceListOptions) ([]swarm.Service, error)
-	ServiceRemove(ctx context.Context, serviceID string) error
-	ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (swarm.ServiceUpdateResponse, error)
-	ServiceLogs(ctx context.Context, serviceID string, options container.LogsOptions) (io.ReadCloser, error)
-	TaskLogs(ctx context.Context, taskID string, options container.LogsOptions) (io.ReadCloser, error)
-	TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error)
-	TaskList(ctx context.Context, options types.TaskListOptions) ([]swarm.Task, error)
-}
-
-// SwarmAPIClient defines API client methods for the swarm
-type SwarmAPIClient interface {
-	SwarmInit(ctx context.Context, req swarm.InitRequest) (string, error)
-	SwarmJoin(ctx context.Context, req swarm.JoinRequest) error
-	SwarmGetUnlockKey(ctx context.Context) (types.SwarmUnlockKeyResponse, error)
-	SwarmUnlock(ctx context.Context, req swarm.UnlockRequest) error
-	SwarmLeave(ctx context.Context, force bool) error
-	SwarmInspect(ctx context.Context) (swarm.Swarm, error)
-	SwarmUpdate(ctx context.Context, version swarm.Version, swarm swarm.Spec, flags swarm.UpdateFlags) error
-}
-
-// SystemAPIClient defines API client methods for the system
-type SystemAPIClient interface {
-	Events(ctx context.Context, options events.ListOptions) (<-chan events.Message, <-chan error)
-	Info(ctx context.Context) (system.Info, error)
-	RegistryLogin(ctx context.Context, auth registry.AuthConfig) (registry.AuthenticateOKBody, error)
-	DiskUsage(ctx context.Context, options types.DiskUsageOptions) (types.DiskUsage, error)
-	Ping(ctx context.Context) (types.Ping, error)
-}
-
-// VolumeAPIClient defines API client methods for the volumes
-type VolumeAPIClient interface {
-	VolumeCreate(ctx context.Context, options volume.CreateOptions) (volume.Volume, error)
-	VolumeInspect(ctx context.Context, volumeID string) (volume.Volume, error)
-	VolumeInspectWithRaw(ctx context.Context, volumeID string) (volume.Volume, []byte, error)
-	VolumeList(ctx context.Context, options volume.ListOptions) (volume.ListResponse, error)
-	VolumeRemove(ctx context.Context, volumeID string, force bool) error
-	VolumesPrune(ctx context.Context, pruneFilter filters.Args) (volume.PruneReport, error)
-	VolumeUpdate(ctx context.Context, volumeID string, version swarm.Version, options volume.UpdateOptions) error
-}
-
-// SecretAPIClient defines API client methods for secrets
-type SecretAPIClient interface {
-	SecretList(ctx context.Context, options types.SecretListOptions) ([]swarm.Secret, error)
-	SecretCreate(ctx context.Context, secret swarm.SecretSpec) (types.SecretCreateResponse, error)
-	SecretRemove(ctx context.Context, id string) error
-	SecretInspectWithRaw(ctx context.Context, name string) (swarm.Secret, []byte, error)
-	SecretUpdate(ctx context.Context, id string, version swarm.Version, secret swarm.SecretSpec) error
-}
-
-// ConfigAPIClient defines API client methods for configs
-type ConfigAPIClient interface {
-	ConfigList(ctx context.Context, options types.ConfigListOptions) ([]swarm.Config, error)
-	ConfigCreate(ctx context.Context, config swarm.ConfigSpec) (types.ConfigCreateResponse, error)
-	ConfigRemove(ctx context.Context, id string) error
-	ConfigInspectWithRaw(ctx context.Context, name string) (swarm.Config, []byte, error)
-	ConfigUpdate(ctx context.Context, id string, version swarm.Version, config swarm.ConfigSpec) error
-}
diff --git a/vendor/github.com/docker/docker/client/interface_experimental.go b/vendor/github.com/docker/docker/client/interface_experimental.go
deleted file mode 100644
index c585c1045..000000000
--- a/vendor/github.com/docker/docker/client/interface_experimental.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-
-	"github.com/docker/docker/api/types/checkpoint"
-)
-
-type apiClientExperimental interface {
-	CheckpointAPIClient
-}
-
-// CheckpointAPIClient defines API client methods for the checkpoints
-type CheckpointAPIClient interface {
-	CheckpointCreate(ctx context.Context, container string, options checkpoint.CreateOptions) error
-	CheckpointDelete(ctx context.Context, container string, options checkpoint.DeleteOptions) error
-	CheckpointList(ctx context.Context, container string, options checkpoint.ListOptions) ([]checkpoint.Summary, error)
-}
diff --git a/vendor/github.com/docker/docker/client/interface_stable.go b/vendor/github.com/docker/docker/client/interface_stable.go
deleted file mode 100644
index 5502cd742..000000000
--- a/vendor/github.com/docker/docker/client/interface_stable.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-// APIClient is an interface that clients that talk with a docker server must implement.
-type APIClient interface {
-	CommonAPIClient
-	apiClientExperimental
-}
-
-// Ensure that Client always implements APIClient.
-var _ APIClient = &Client{}
diff --git a/vendor/github.com/docker/docker/client/login.go b/vendor/github.com/docker/docker/client/login.go
deleted file mode 100644
index 19e985e0b..000000000
--- a/vendor/github.com/docker/docker/client/login.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types/registry"
-)
-
-// RegistryLogin authenticates the docker server with a given docker registry.
-// It returns unauthorizedError when the authentication fails.
-func (cli *Client) RegistryLogin(ctx context.Context, auth registry.AuthConfig) (registry.AuthenticateOKBody, error) {
-	resp, err := cli.post(ctx, "/auth", url.Values{}, auth, nil)
-	defer ensureReaderClosed(resp)
-
-	if err != nil {
-		return registry.AuthenticateOKBody{}, err
-	}
-
-	var response registry.AuthenticateOKBody
-	err = json.NewDecoder(resp.body).Decode(&response)
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/network_connect.go b/vendor/github.com/docker/docker/client/network_connect.go
deleted file mode 100644
index 8daf89063..000000000
--- a/vendor/github.com/docker/docker/client/network_connect.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-
-	"github.com/docker/docker/api/types/network"
-)
-
-// NetworkConnect connects a container to an existent network in the docker host.
-func (cli *Client) NetworkConnect(ctx context.Context, networkID, containerID string, config *network.EndpointSettings) error {
-	nc := network.ConnectOptions{
-		Container:      containerID,
-		EndpointConfig: config,
-	}
-	resp, err := cli.post(ctx, "/networks/"+networkID+"/connect", nil, nc, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/network_create.go b/vendor/github.com/docker/docker/client/network_create.go
deleted file mode 100644
index 850e31cc9..000000000
--- a/vendor/github.com/docker/docker/client/network_create.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-
-	"github.com/docker/docker/api/types/network"
-	"github.com/docker/docker/api/types/versions"
-)
-
-// NetworkCreate creates a new network in the docker host.
-func (cli *Client) NetworkCreate(ctx context.Context, name string, options network.CreateOptions) (network.CreateResponse, error) {
-	var response network.CreateResponse
-
-	// Make sure we negotiated (if the client is configured to do so),
-	// as code below contains API-version specific handling of options.
-	//
-	// Normally, version-negotiation (if enabled) would not happen until
-	// the API request is made.
-	if err := cli.checkVersion(ctx); err != nil {
-		return response, err
-	}
-
-	networkCreateRequest := network.CreateRequest{
-		CreateOptions: options,
-		Name:          name,
-	}
-	if versions.LessThan(cli.version, "1.44") {
-		enabled := true
-		networkCreateRequest.CheckDuplicate = &enabled //nolint:staticcheck // ignore SA1019: CheckDuplicate is deprecated since API v1.44.
-	}
-
-	serverResp, err := cli.post(ctx, "/networks/create", nil, networkCreateRequest, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return response, err
-	}
-
-	err = json.NewDecoder(serverResp.body).Decode(&response)
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/network_disconnect.go b/vendor/github.com/docker/docker/client/network_disconnect.go
deleted file mode 100644
index aaf428d85..000000000
--- a/vendor/github.com/docker/docker/client/network_disconnect.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-
-	"github.com/docker/docker/api/types/network"
-)
-
-// NetworkDisconnect disconnects a container from an existent network in the docker host.
-func (cli *Client) NetworkDisconnect(ctx context.Context, networkID, containerID string, force bool) error {
-	nd := network.DisconnectOptions{
-		Container: containerID,
-		Force:     force,
-	}
-	resp, err := cli.post(ctx, "/networks/"+networkID+"/disconnect", nil, nd, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/network_inspect.go b/vendor/github.com/docker/docker/client/network_inspect.go
deleted file mode 100644
index afc47de6f..000000000
--- a/vendor/github.com/docker/docker/client/network_inspect.go
+++ /dev/null
@@ -1,46 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"io"
-	"net/url"
-
-	"github.com/docker/docker/api/types/network"
-)
-
-// NetworkInspect returns the information for a specific network configured in the docker host.
-func (cli *Client) NetworkInspect(ctx context.Context, networkID string, options network.InspectOptions) (network.Inspect, error) {
-	networkResource, _, err := cli.NetworkInspectWithRaw(ctx, networkID, options)
-	return networkResource, err
-}
-
-// NetworkInspectWithRaw returns the information for a specific network configured in the docker host and its raw representation.
-func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string, options network.InspectOptions) (network.Inspect, []byte, error) {
-	if networkID == "" {
-		return network.Inspect{}, nil, objectNotFoundError{object: "network", id: networkID}
-	}
-	query := url.Values{}
-	if options.Verbose {
-		query.Set("verbose", "true")
-	}
-	if options.Scope != "" {
-		query.Set("scope", options.Scope)
-	}
-
-	resp, err := cli.get(ctx, "/networks/"+networkID, query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return network.Inspect{}, nil, err
-	}
-
-	raw, err := io.ReadAll(resp.body)
-	if err != nil {
-		return network.Inspect{}, nil, err
-	}
-
-	var nw network.Inspect
-	err = json.NewDecoder(bytes.NewReader(raw)).Decode(&nw)
-	return nw, raw, err
-}
diff --git a/vendor/github.com/docker/docker/client/network_list.go b/vendor/github.com/docker/docker/client/network_list.go
deleted file mode 100644
index 72957d47f..000000000
--- a/vendor/github.com/docker/docker/client/network_list.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/network"
-)
-
-// NetworkList returns the list of networks configured in the docker host.
-func (cli *Client) NetworkList(ctx context.Context, options network.ListOptions) ([]network.Summary, error) {
-	query := url.Values{}
-	if options.Filters.Len() > 0 {
-		//nolint:staticcheck // ignore SA1019 for old code
-		filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filters)
-		if err != nil {
-			return nil, err
-		}
-
-		query.Set("filters", filterJSON)
-	}
-	var networkResources []network.Summary
-	resp, err := cli.get(ctx, "/networks", query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return networkResources, err
-	}
-	err = json.NewDecoder(resp.body).Decode(&networkResources)
-	return networkResources, err
-}
diff --git a/vendor/github.com/docker/docker/client/network_prune.go b/vendor/github.com/docker/docker/client/network_prune.go
deleted file mode 100644
index 708cc61a4..000000000
--- a/vendor/github.com/docker/docker/client/network_prune.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"fmt"
-
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/network"
-)
-
-// NetworksPrune requests the daemon to delete unused networks
-func (cli *Client) NetworksPrune(ctx context.Context, pruneFilters filters.Args) (network.PruneReport, error) {
-	var report network.PruneReport
-
-	if err := cli.NewVersionError(ctx, "1.25", "network prune"); err != nil {
-		return report, err
-	}
-
-	query, err := getFiltersQuery(pruneFilters)
-	if err != nil {
-		return report, err
-	}
-
-	serverResp, err := cli.post(ctx, "/networks/prune", query, nil, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return report, err
-	}
-
-	if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil {
-		return report, fmt.Errorf("Error retrieving network prune report: %v", err)
-	}
-
-	return report, nil
-}
diff --git a/vendor/github.com/docker/docker/client/network_remove.go b/vendor/github.com/docker/docker/client/network_remove.go
deleted file mode 100644
index 9d6c6cef0..000000000
--- a/vendor/github.com/docker/docker/client/network_remove.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import "context"
-
-// NetworkRemove removes an existent network from the docker host.
-func (cli *Client) NetworkRemove(ctx context.Context, networkID string) error {
-	resp, err := cli.delete(ctx, "/networks/"+networkID, nil, nil)
-	defer ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/node_inspect.go b/vendor/github.com/docker/docker/client/node_inspect.go
deleted file mode 100644
index 95ab9b1be..000000000
--- a/vendor/github.com/docker/docker/client/node_inspect.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"io"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// NodeInspectWithRaw returns the node information.
-func (cli *Client) NodeInspectWithRaw(ctx context.Context, nodeID string) (swarm.Node, []byte, error) {
-	if nodeID == "" {
-		return swarm.Node{}, nil, objectNotFoundError{object: "node", id: nodeID}
-	}
-	serverResp, err := cli.get(ctx, "/nodes/"+nodeID, nil, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return swarm.Node{}, nil, err
-	}
-
-	body, err := io.ReadAll(serverResp.body)
-	if err != nil {
-		return swarm.Node{}, nil, err
-	}
-
-	var response swarm.Node
-	rdr := bytes.NewReader(body)
-	err = json.NewDecoder(rdr).Decode(&response)
-	return response, body, err
-}
diff --git a/vendor/github.com/docker/docker/client/node_list.go b/vendor/github.com/docker/docker/client/node_list.go
deleted file mode 100644
index 1a9e6bfb1..000000000
--- a/vendor/github.com/docker/docker/client/node_list.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// NodeList returns the list of nodes.
-func (cli *Client) NodeList(ctx context.Context, options types.NodeListOptions) ([]swarm.Node, error) {
-	query := url.Values{}
-
-	if options.Filters.Len() > 0 {
-		filterJSON, err := filters.ToJSON(options.Filters)
-		if err != nil {
-			return nil, err
-		}
-
-		query.Set("filters", filterJSON)
-	}
-
-	resp, err := cli.get(ctx, "/nodes", query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return nil, err
-	}
-
-	var nodes []swarm.Node
-	err = json.NewDecoder(resp.body).Decode(&nodes)
-	return nodes, err
-}
diff --git a/vendor/github.com/docker/docker/client/node_remove.go b/vendor/github.com/docker/docker/client/node_remove.go
deleted file mode 100644
index e44436deb..000000000
--- a/vendor/github.com/docker/docker/client/node_remove.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-)
-
-// NodeRemove removes a Node.
-func (cli *Client) NodeRemove(ctx context.Context, nodeID string, options types.NodeRemoveOptions) error {
-	query := url.Values{}
-	if options.Force {
-		query.Set("force", "1")
-	}
-
-	resp, err := cli.delete(ctx, "/nodes/"+nodeID, query, nil)
-	defer ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/node_update.go b/vendor/github.com/docker/docker/client/node_update.go
deleted file mode 100644
index 0d0fc3b78..000000000
--- a/vendor/github.com/docker/docker/client/node_update.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// NodeUpdate updates a Node.
-func (cli *Client) NodeUpdate(ctx context.Context, nodeID string, version swarm.Version, node swarm.NodeSpec) error {
-	query := url.Values{}
-	query.Set("version", version.String())
-	resp, err := cli.post(ctx, "/nodes/"+nodeID+"/update", query, node, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/options.go b/vendor/github.com/docker/docker/client/options.go
deleted file mode 100644
index ddb0ca399..000000000
--- a/vendor/github.com/docker/docker/client/options.go
+++ /dev/null
@@ -1,233 +0,0 @@
-package client
-
-import (
-	"context"
-	"net"
-	"net/http"
-	"os"
-	"path/filepath"
-	"time"
-
-	"github.com/docker/go-connections/sockets"
-	"github.com/docker/go-connections/tlsconfig"
-	"github.com/pkg/errors"
-	"go.opentelemetry.io/otel/trace"
-)
-
-// Opt is a configuration option to initialize a [Client].
-type Opt func(*Client) error
-
-// FromEnv configures the client with values from environment variables. It
-// is the equivalent of using the [WithTLSClientConfigFromEnv], [WithHostFromEnv],
-// and [WithVersionFromEnv] options.
-//
-// FromEnv uses the following environment variables:
-//
-//   - DOCKER_HOST ([EnvOverrideHost]) to set the URL to the docker server.
-//   - DOCKER_API_VERSION ([EnvOverrideAPIVersion]) to set the version of the
-//     API to use, leave empty for latest.
-//   - DOCKER_CERT_PATH ([EnvOverrideCertPath]) to specify the directory from
-//     which to load the TLS certificates ("ca.pem", "cert.pem", "key.pem').
-//   - DOCKER_TLS_VERIFY ([EnvTLSVerify]) to enable or disable TLS verification
-//     (off by default).
-func FromEnv(c *Client) error {
-	ops := []Opt{
-		WithTLSClientConfigFromEnv(),
-		WithHostFromEnv(),
-		WithVersionFromEnv(),
-	}
-	for _, op := range ops {
-		if err := op(c); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// WithDialContext applies the dialer to the client transport. This can be
-// used to set the Timeout and KeepAlive settings of the client. It returns
-// an error if the client does not have a [http.Transport] configured.
-func WithDialContext(dialContext func(ctx context.Context, network, addr string) (net.Conn, error)) Opt {
-	return func(c *Client) error {
-		if transport, ok := c.client.Transport.(*http.Transport); ok {
-			transport.DialContext = dialContext
-			return nil
-		}
-		return errors.Errorf("cannot apply dialer to transport: %T", c.client.Transport)
-	}
-}
-
-// WithHost overrides the client host with the specified one.
-func WithHost(host string) Opt {
-	return func(c *Client) error {
-		hostURL, err := ParseHostURL(host)
-		if err != nil {
-			return err
-		}
-		c.host = host
-		c.proto = hostURL.Scheme
-		c.addr = hostURL.Host
-		c.basePath = hostURL.Path
-		if transport, ok := c.client.Transport.(*http.Transport); ok {
-			return sockets.ConfigureTransport(transport, c.proto, c.addr)
-		}
-		return errors.Errorf("cannot apply host to transport: %T", c.client.Transport)
-	}
-}
-
-// WithHostFromEnv overrides the client host with the host specified in the
-// DOCKER_HOST ([EnvOverrideHost]) environment variable. If DOCKER_HOST is not set,
-// or set to an empty value, the host is not modified.
-func WithHostFromEnv() Opt {
-	return func(c *Client) error {
-		if host := os.Getenv(EnvOverrideHost); host != "" {
-			return WithHost(host)(c)
-		}
-		return nil
-	}
-}
-
-// WithHTTPClient overrides the client's HTTP client with the specified one.
-func WithHTTPClient(client *http.Client) Opt {
-	return func(c *Client) error {
-		if client != nil {
-			c.client = client
-		}
-		return nil
-	}
-}
-
-// WithTimeout configures the time limit for requests made by the HTTP client.
-func WithTimeout(timeout time.Duration) Opt {
-	return func(c *Client) error {
-		c.client.Timeout = timeout
-		return nil
-	}
-}
-
-// WithUserAgent configures the User-Agent header to use for HTTP requests.
-// It overrides any User-Agent set in headers. When set to an empty string,
-// the User-Agent header is removed, and no header is sent.
-func WithUserAgent(ua string) Opt {
-	return func(c *Client) error {
-		c.userAgent = &ua
-		return nil
-	}
-}
-
-// WithHTTPHeaders appends custom HTTP headers to the client's default headers.
-// It does not allow for built-in headers (such as "User-Agent", if set) to
-// be overridden. Also see [WithUserAgent].
-func WithHTTPHeaders(headers map[string]string) Opt {
-	return func(c *Client) error {
-		c.customHTTPHeaders = headers
-		return nil
-	}
-}
-
-// WithScheme overrides the client scheme with the specified one.
-func WithScheme(scheme string) Opt {
-	return func(c *Client) error {
-		c.scheme = scheme
-		return nil
-	}
-}
-
-// WithTLSClientConfig applies a TLS config to the client transport.
-func WithTLSClientConfig(cacertPath, certPath, keyPath string) Opt {
-	return func(c *Client) error {
-		transport, ok := c.client.Transport.(*http.Transport)
-		if !ok {
-			return errors.Errorf("cannot apply tls config to transport: %T", c.client.Transport)
-		}
-		config, err := tlsconfig.Client(tlsconfig.Options{
-			CAFile:             cacertPath,
-			CertFile:           certPath,
-			KeyFile:            keyPath,
-			ExclusiveRootPools: true,
-		})
-		if err != nil {
-			return errors.Wrap(err, "failed to create tls config")
-		}
-		transport.TLSClientConfig = config
-		return nil
-	}
-}
-
-// WithTLSClientConfigFromEnv configures the client's TLS settings with the
-// settings in the DOCKER_CERT_PATH ([EnvOverrideCertPath]) and DOCKER_TLS_VERIFY
-// ([EnvTLSVerify]) environment variables. If DOCKER_CERT_PATH is not set or empty,
-// TLS configuration is not modified.
-//
-// WithTLSClientConfigFromEnv uses the following environment variables:
-//
-//   - DOCKER_CERT_PATH ([EnvOverrideCertPath]) to specify the directory from
-//     which to load the TLS certificates ("ca.pem", "cert.pem", "key.pem").
-//   - DOCKER_TLS_VERIFY ([EnvTLSVerify]) to enable or disable TLS verification
-//     (off by default).
-func WithTLSClientConfigFromEnv() Opt {
-	return func(c *Client) error {
-		dockerCertPath := os.Getenv(EnvOverrideCertPath)
-		if dockerCertPath == "" {
-			return nil
-		}
-		tlsc, err := tlsconfig.Client(tlsconfig.Options{
-			CAFile:             filepath.Join(dockerCertPath, "ca.pem"),
-			CertFile:           filepath.Join(dockerCertPath, "cert.pem"),
-			KeyFile:            filepath.Join(dockerCertPath, "key.pem"),
-			InsecureSkipVerify: os.Getenv(EnvTLSVerify) == "",
-		})
-		if err != nil {
-			return err
-		}
-
-		c.client = &http.Client{
-			Transport:     &http.Transport{TLSClientConfig: tlsc},
-			CheckRedirect: CheckRedirect,
-		}
-		return nil
-	}
-}
-
-// WithVersion overrides the client version with the specified one. If an empty
-// version is provided, the value is ignored to allow version negotiation
-// (see [WithAPIVersionNegotiation]).
-func WithVersion(version string) Opt {
-	return func(c *Client) error {
-		if version != "" {
-			c.version = version
-			c.manualOverride = true
-		}
-		return nil
-	}
-}
-
-// WithVersionFromEnv overrides the client version with the version specified in
-// the DOCKER_API_VERSION ([EnvOverrideAPIVersion]) environment variable.
-// If DOCKER_API_VERSION is not set, or set to an empty value, the version
-// is not modified.
-func WithVersionFromEnv() Opt {
-	return func(c *Client) error {
-		return WithVersion(os.Getenv(EnvOverrideAPIVersion))(c)
-	}
-}
-
-// WithAPIVersionNegotiation enables automatic API version negotiation for the client.
-// With this option enabled, the client automatically negotiates the API version
-// to use when making requests. API version negotiation is performed on the first
-// request; subsequent requests do not re-negotiate.
-func WithAPIVersionNegotiation() Opt {
-	return func(c *Client) error {
-		c.negotiateVersion = true
-		return nil
-	}
-}
-
-// WithTraceProvider sets the trace provider for the client.
-// If this is not set then the global trace provider will be used.
-func WithTraceProvider(provider trace.TracerProvider) Opt {
-	return func(c *Client) error {
-		c.tp = provider
-		return nil
-	}
-}
diff --git a/vendor/github.com/docker/docker/client/ping.go b/vendor/github.com/docker/docker/client/ping.go
deleted file mode 100644
index 7c43268b3..000000000
--- a/vendor/github.com/docker/docker/client/ping.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/http"
-	"path"
-	"strings"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/swarm"
-	"github.com/docker/docker/errdefs"
-)
-
-// Ping pings the server and returns the value of the "Docker-Experimental",
-// "Builder-Version", "OS-Type" & "API-Version" headers. It attempts to use
-// a HEAD request on the endpoint, but falls back to GET if HEAD is not supported
-// by the daemon. It ignores internal server errors returned by the API, which
-// may be returned if the daemon is in an unhealthy state, but returns errors
-// for other non-success status codes, failing to connect to the API, or failing
-// to parse the API response.
-func (cli *Client) Ping(ctx context.Context) (types.Ping, error) {
-	var ping types.Ping
-
-	// Using cli.buildRequest() + cli.doRequest() instead of cli.sendRequest()
-	// because ping requests are used during API version negotiation, so we want
-	// to hit the non-versioned /_ping endpoint, not /v1.xx/_ping
-	req, err := cli.buildRequest(ctx, http.MethodHead, path.Join(cli.basePath, "/_ping"), nil, nil)
-	if err != nil {
-		return ping, err
-	}
-	serverResp, err := cli.doRequest(req)
-	if err == nil {
-		defer ensureReaderClosed(serverResp)
-		switch serverResp.statusCode {
-		case http.StatusOK, http.StatusInternalServerError:
-			// Server handled the request, so parse the response
-			return parsePingResponse(cli, serverResp)
-		}
-	} else if IsErrConnectionFailed(err) {
-		return ping, err
-	}
-
-	// HEAD failed; fallback to GET.
-	req.Method = http.MethodGet
-	serverResp, err = cli.doRequest(req)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return ping, err
-	}
-	return parsePingResponse(cli, serverResp)
-}
-
-func parsePingResponse(cli *Client, resp serverResponse) (types.Ping, error) {
-	var ping types.Ping
-	if resp.header == nil {
-		err := cli.checkResponseErr(resp)
-		return ping, errdefs.FromStatusCode(err, resp.statusCode)
-	}
-	ping.APIVersion = resp.header.Get("Api-Version")
-	ping.OSType = resp.header.Get("Ostype")
-	if resp.header.Get("Docker-Experimental") == "true" {
-		ping.Experimental = true
-	}
-	if bv := resp.header.Get("Builder-Version"); bv != "" {
-		ping.BuilderVersion = types.BuilderVersion(bv)
-	}
-	if si := resp.header.Get("Swarm"); si != "" {
-		state, role, _ := strings.Cut(si, "/")
-		ping.SwarmStatus = &swarm.Status{
-			NodeState:        swarm.LocalNodeState(state),
-			ControlAvailable: role == "manager",
-		}
-	}
-	err := cli.checkResponseErr(resp)
-	return ping, errdefs.FromStatusCode(err, resp.statusCode)
-}
diff --git a/vendor/github.com/docker/docker/client/plugin_create.go b/vendor/github.com/docker/docker/client/plugin_create.go
deleted file mode 100644
index b95dbaf68..000000000
--- a/vendor/github.com/docker/docker/client/plugin_create.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/http"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-)
-
-// PluginCreate creates a plugin
-func (cli *Client) PluginCreate(ctx context.Context, createContext io.Reader, createOptions types.PluginCreateOptions) error {
-	headers := http.Header(make(map[string][]string))
-	headers.Set("Content-Type", "application/x-tar")
-
-	query := url.Values{}
-	query.Set("name", createOptions.RepoName)
-
-	resp, err := cli.postRaw(ctx, "/plugins/create", query, createContext, headers)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/plugin_disable.go b/vendor/github.com/docker/docker/client/plugin_disable.go
deleted file mode 100644
index 01f6574f9..000000000
--- a/vendor/github.com/docker/docker/client/plugin_disable.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-)
-
-// PluginDisable disables a plugin
-func (cli *Client) PluginDisable(ctx context.Context, name string, options types.PluginDisableOptions) error {
-	query := url.Values{}
-	if options.Force {
-		query.Set("force", "1")
-	}
-	resp, err := cli.post(ctx, "/plugins/"+name+"/disable", query, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/plugin_enable.go b/vendor/github.com/docker/docker/client/plugin_enable.go
deleted file mode 100644
index 736da48bd..000000000
--- a/vendor/github.com/docker/docker/client/plugin_enable.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-	"strconv"
-
-	"github.com/docker/docker/api/types"
-)
-
-// PluginEnable enables a plugin
-func (cli *Client) PluginEnable(ctx context.Context, name string, options types.PluginEnableOptions) error {
-	query := url.Values{}
-	query.Set("timeout", strconv.Itoa(options.Timeout))
-
-	resp, err := cli.post(ctx, "/plugins/"+name+"/enable", query, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/plugin_inspect.go b/vendor/github.com/docker/docker/client/plugin_inspect.go
deleted file mode 100644
index f09e46066..000000000
--- a/vendor/github.com/docker/docker/client/plugin_inspect.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"io"
-
-	"github.com/docker/docker/api/types"
-)
-
-// PluginInspectWithRaw inspects an existing plugin
-func (cli *Client) PluginInspectWithRaw(ctx context.Context, name string) (*types.Plugin, []byte, error) {
-	if name == "" {
-		return nil, nil, objectNotFoundError{object: "plugin", id: name}
-	}
-	resp, err := cli.get(ctx, "/plugins/"+name+"/json", nil, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	body, err := io.ReadAll(resp.body)
-	if err != nil {
-		return nil, nil, err
-	}
-	var p types.Plugin
-	rdr := bytes.NewReader(body)
-	err = json.NewDecoder(rdr).Decode(&p)
-	return &p, body, err
-}
diff --git a/vendor/github.com/docker/docker/client/plugin_install.go b/vendor/github.com/docker/docker/client/plugin_install.go
deleted file mode 100644
index a0d8c3500..000000000
--- a/vendor/github.com/docker/docker/client/plugin_install.go
+++ /dev/null
@@ -1,117 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"io"
-	"net/http"
-	"net/url"
-
-	"github.com/distribution/reference"
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/registry"
-	"github.com/docker/docker/errdefs"
-	"github.com/pkg/errors"
-)
-
-// PluginInstall installs a plugin
-func (cli *Client) PluginInstall(ctx context.Context, name string, options types.PluginInstallOptions) (rc io.ReadCloser, err error) {
-	query := url.Values{}
-	if _, err := reference.ParseNormalizedNamed(options.RemoteRef); err != nil {
-		return nil, errors.Wrap(err, "invalid remote reference")
-	}
-	query.Set("remote", options.RemoteRef)
-
-	privileges, err := cli.checkPluginPermissions(ctx, query, options)
-	if err != nil {
-		return nil, err
-	}
-
-	// set name for plugin pull, if empty should default to remote reference
-	query.Set("name", name)
-
-	resp, err := cli.tryPluginPull(ctx, query, privileges, options.RegistryAuth)
-	if err != nil {
-		return nil, err
-	}
-
-	name = resp.header.Get("Docker-Plugin-Name")
-
-	pr, pw := io.Pipe()
-	go func() { // todo: the client should probably be designed more around the actual api
-		_, err := io.Copy(pw, resp.body)
-		if err != nil {
-			pw.CloseWithError(err)
-			return
-		}
-		defer func() {
-			if err != nil {
-				delResp, _ := cli.delete(ctx, "/plugins/"+name, nil, nil)
-				ensureReaderClosed(delResp)
-			}
-		}()
-		if len(options.Args) > 0 {
-			if err := cli.PluginSet(ctx, name, options.Args); err != nil {
-				pw.CloseWithError(err)
-				return
-			}
-		}
-
-		if options.Disabled {
-			pw.Close()
-			return
-		}
-
-		enableErr := cli.PluginEnable(ctx, name, types.PluginEnableOptions{Timeout: 0})
-		pw.CloseWithError(enableErr)
-	}()
-	return pr, nil
-}
-
-func (cli *Client) tryPluginPrivileges(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) {
-	return cli.get(ctx, "/plugins/privileges", query, http.Header{
-		registry.AuthHeader: {registryAuth},
-	})
-}
-
-func (cli *Client) tryPluginPull(ctx context.Context, query url.Values, privileges types.PluginPrivileges, registryAuth string) (serverResponse, error) {
-	return cli.post(ctx, "/plugins/pull", query, privileges, http.Header{
-		registry.AuthHeader: {registryAuth},
-	})
-}
-
-func (cli *Client) checkPluginPermissions(ctx context.Context, query url.Values, options types.PluginInstallOptions) (types.PluginPrivileges, error) {
-	resp, err := cli.tryPluginPrivileges(ctx, query, options.RegistryAuth)
-	if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
-		// todo: do inspect before to check existing name before checking privileges
-		newAuthHeader, privilegeErr := options.PrivilegeFunc(ctx)
-		if privilegeErr != nil {
-			ensureReaderClosed(resp)
-			return nil, privilegeErr
-		}
-		options.RegistryAuth = newAuthHeader
-		resp, err = cli.tryPluginPrivileges(ctx, query, options.RegistryAuth)
-	}
-	if err != nil {
-		ensureReaderClosed(resp)
-		return nil, err
-	}
-
-	var privileges types.PluginPrivileges
-	if err := json.NewDecoder(resp.body).Decode(&privileges); err != nil {
-		ensureReaderClosed(resp)
-		return nil, err
-	}
-	ensureReaderClosed(resp)
-
-	if !options.AcceptAllPermissions && options.AcceptPermissionsFunc != nil && len(privileges) > 0 {
-		accept, err := options.AcceptPermissionsFunc(ctx, privileges)
-		if err != nil {
-			return nil, err
-		}
-		if !accept {
-			return nil, errors.Errorf("permission denied while installing plugin %s", options.RemoteRef)
-		}
-	}
-	return privileges, nil
-}
diff --git a/vendor/github.com/docker/docker/client/plugin_list.go b/vendor/github.com/docker/docker/client/plugin_list.go
deleted file mode 100644
index 2091a054d..000000000
--- a/vendor/github.com/docker/docker/client/plugin_list.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/filters"
-)
-
-// PluginList returns the installed plugins
-func (cli *Client) PluginList(ctx context.Context, filter filters.Args) (types.PluginsListResponse, error) {
-	var plugins types.PluginsListResponse
-	query := url.Values{}
-
-	if filter.Len() > 0 {
-		//nolint:staticcheck // ignore SA1019 for old code
-		filterJSON, err := filters.ToParamWithVersion(cli.version, filter)
-		if err != nil {
-			return plugins, err
-		}
-		query.Set("filters", filterJSON)
-	}
-	resp, err := cli.get(ctx, "/plugins", query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return plugins, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&plugins)
-	return plugins, err
-}
diff --git a/vendor/github.com/docker/docker/client/plugin_push.go b/vendor/github.com/docker/docker/client/plugin_push.go
deleted file mode 100644
index 8f68a86ee..000000000
--- a/vendor/github.com/docker/docker/client/plugin_push.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/http"
-
-	"github.com/docker/docker/api/types/registry"
-)
-
-// PluginPush pushes a plugin to a registry
-func (cli *Client) PluginPush(ctx context.Context, name string, registryAuth string) (io.ReadCloser, error) {
-	resp, err := cli.post(ctx, "/plugins/"+name+"/push", nil, nil, http.Header{
-		registry.AuthHeader: {registryAuth},
-	})
-	if err != nil {
-		return nil, err
-	}
-	return resp.body, nil
-}
diff --git a/vendor/github.com/docker/docker/client/plugin_remove.go b/vendor/github.com/docker/docker/client/plugin_remove.go
deleted file mode 100644
index 4cd66958c..000000000
--- a/vendor/github.com/docker/docker/client/plugin_remove.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-)
-
-// PluginRemove removes a plugin
-func (cli *Client) PluginRemove(ctx context.Context, name string, options types.PluginRemoveOptions) error {
-	query := url.Values{}
-	if options.Force {
-		query.Set("force", "1")
-	}
-
-	resp, err := cli.delete(ctx, "/plugins/"+name, query, nil)
-	defer ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/plugin_set.go b/vendor/github.com/docker/docker/client/plugin_set.go
deleted file mode 100644
index dcf5752ca..000000000
--- a/vendor/github.com/docker/docker/client/plugin_set.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-)
-
-// PluginSet modifies settings for an existing plugin
-func (cli *Client) PluginSet(ctx context.Context, name string, args []string) error {
-	resp, err := cli.post(ctx, "/plugins/"+name+"/set", nil, args, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/plugin_upgrade.go b/vendor/github.com/docker/docker/client/plugin_upgrade.go
deleted file mode 100644
index 5cade450f..000000000
--- a/vendor/github.com/docker/docker/client/plugin_upgrade.go
+++ /dev/null
@@ -1,42 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/http"
-	"net/url"
-
-	"github.com/distribution/reference"
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/registry"
-	"github.com/pkg/errors"
-)
-
-// PluginUpgrade upgrades a plugin
-func (cli *Client) PluginUpgrade(ctx context.Context, name string, options types.PluginInstallOptions) (rc io.ReadCloser, err error) {
-	if err := cli.NewVersionError(ctx, "1.26", "plugin upgrade"); err != nil {
-		return nil, err
-	}
-	query := url.Values{}
-	if _, err := reference.ParseNormalizedNamed(options.RemoteRef); err != nil {
-		return nil, errors.Wrap(err, "invalid remote reference")
-	}
-	query.Set("remote", options.RemoteRef)
-
-	privileges, err := cli.checkPluginPermissions(ctx, query, options)
-	if err != nil {
-		return nil, err
-	}
-
-	resp, err := cli.tryPluginUpgrade(ctx, query, privileges, name, options.RegistryAuth)
-	if err != nil {
-		return nil, err
-	}
-	return resp.body, nil
-}
-
-func (cli *Client) tryPluginUpgrade(ctx context.Context, query url.Values, privileges types.PluginPrivileges, name, registryAuth string) (serverResponse, error) {
-	return cli.post(ctx, "/plugins/"+name+"/upgrade", query, privileges, http.Header{
-		registry.AuthHeader: {registryAuth},
-	})
-}
diff --git a/vendor/github.com/docker/docker/client/request.go b/vendor/github.com/docker/docker/client/request.go
deleted file mode 100644
index 6eea9b4e4..000000000
--- a/vendor/github.com/docker/docker/client/request.go
+++ /dev/null
@@ -1,284 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"fmt"
-	"io"
-	"net"
-	"net/http"
-	"net/url"
-	"os"
-	"reflect"
-	"strings"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/versions"
-	"github.com/docker/docker/errdefs"
-	"github.com/pkg/errors"
-)
-
-// serverResponse is a wrapper for http API responses.
-type serverResponse struct {
-	body       io.ReadCloser
-	header     http.Header
-	statusCode int
-	reqURL     *url.URL
-}
-
-// head sends an http request to the docker API using the method HEAD.
-func (cli *Client) head(ctx context.Context, path string, query url.Values, headers http.Header) (serverResponse, error) {
-	return cli.sendRequest(ctx, http.MethodHead, path, query, nil, headers)
-}
-
-// get sends an http request to the docker API using the method GET with a specific Go context.
-func (cli *Client) get(ctx context.Context, path string, query url.Values, headers http.Header) (serverResponse, error) {
-	return cli.sendRequest(ctx, http.MethodGet, path, query, nil, headers)
-}
-
-// post sends an http request to the docker API using the method POST with a specific Go context.
-func (cli *Client) post(ctx context.Context, path string, query url.Values, obj interface{}, headers http.Header) (serverResponse, error) {
-	body, headers, err := encodeBody(obj, headers)
-	if err != nil {
-		return serverResponse{}, err
-	}
-	return cli.sendRequest(ctx, http.MethodPost, path, query, body, headers)
-}
-
-func (cli *Client) postRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers http.Header) (serverResponse, error) {
-	return cli.sendRequest(ctx, http.MethodPost, path, query, body, headers)
-}
-
-func (cli *Client) put(ctx context.Context, path string, query url.Values, obj interface{}, headers http.Header) (serverResponse, error) {
-	body, headers, err := encodeBody(obj, headers)
-	if err != nil {
-		return serverResponse{}, err
-	}
-	return cli.putRaw(ctx, path, query, body, headers)
-}
-
-// putRaw sends an http request to the docker API using the method PUT.
-func (cli *Client) putRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers http.Header) (serverResponse, error) {
-	// PUT requests are expected to always have a body (apparently)
-	// so explicitly pass an empty body to sendRequest to signal that
-	// it should set the Content-Type header if not already present.
-	if body == nil {
-		body = http.NoBody
-	}
-	return cli.sendRequest(ctx, http.MethodPut, path, query, body, headers)
-}
-
-// delete sends an http request to the docker API using the method DELETE.
-func (cli *Client) delete(ctx context.Context, path string, query url.Values, headers http.Header) (serverResponse, error) {
-	return cli.sendRequest(ctx, http.MethodDelete, path, query, nil, headers)
-}
-
-func encodeBody(obj interface{}, headers http.Header) (io.Reader, http.Header, error) {
-	if obj == nil {
-		return nil, headers, nil
-	}
-	// encoding/json encodes a nil pointer as the JSON document `null`,
-	// irrespective of whether the type implements json.Marshaler or encoding.TextMarshaler.
-	// That is almost certainly not what the caller intended as the request body.
-	if reflect.TypeOf(obj).Kind() == reflect.Ptr && reflect.ValueOf(obj).IsNil() {
-		return nil, headers, nil
-	}
-
-	body, err := encodeData(obj)
-	if err != nil {
-		return nil, headers, err
-	}
-	if headers == nil {
-		headers = make(map[string][]string)
-	}
-	headers["Content-Type"] = []string{"application/json"}
-	return body, headers, nil
-}
-
-func (cli *Client) buildRequest(ctx context.Context, method, path string, body io.Reader, headers http.Header) (*http.Request, error) {
-	req, err := http.NewRequestWithContext(ctx, method, path, body)
-	if err != nil {
-		return nil, err
-	}
-	req = cli.addHeaders(req, headers)
-	req.URL.Scheme = cli.scheme
-	req.URL.Host = cli.addr
-
-	if cli.proto == "unix" || cli.proto == "npipe" {
-		// Override host header for non-tcp connections.
-		req.Host = DummyHost
-	}
-
-	if body != nil && req.Header.Get("Content-Type") == "" {
-		req.Header.Set("Content-Type", "text/plain")
-	}
-	return req, nil
-}
-
-func (cli *Client) sendRequest(ctx context.Context, method, path string, query url.Values, body io.Reader, headers http.Header) (serverResponse, error) {
-	req, err := cli.buildRequest(ctx, method, cli.getAPIPath(ctx, path, query), body, headers)
-	if err != nil {
-		return serverResponse{}, err
-	}
-
-	resp, err := cli.doRequest(req)
-	switch {
-	case errors.Is(err, context.Canceled):
-		return serverResponse{}, errdefs.Cancelled(err)
-	case errors.Is(err, context.DeadlineExceeded):
-		return serverResponse{}, errdefs.Deadline(err)
-	case err == nil:
-		err = cli.checkResponseErr(resp)
-	}
-	return resp, errdefs.FromStatusCode(err, resp.statusCode)
-}
-
-// FIXME(thaJeztah): Should this actually return a serverResp when a connection error occurred?
-func (cli *Client) doRequest(req *http.Request) (serverResponse, error) {
-	serverResp := serverResponse{statusCode: -1, reqURL: req.URL}
-
-	resp, err := cli.client.Do(req)
-	if err != nil {
-		if cli.scheme != "https" && strings.Contains(err.Error(), "malformed HTTP response") {
-			return serverResp, errConnectionFailed{fmt.Errorf("%v.\n* Are you trying to connect to a TLS-enabled daemon without TLS?", err)}
-		}
-
-		if cli.scheme == "https" && strings.Contains(err.Error(), "bad certificate") {
-			return serverResp, errConnectionFailed{errors.Wrap(err, "the server probably has client authentication (--tlsverify) enabled; check your TLS client certification settings")}
-		}
-
-		// Don't decorate context sentinel errors; users may be comparing to
-		// them directly.
-		if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {
-			return serverResp, err
-		}
-
-		if uErr, ok := err.(*url.Error); ok {
-			if nErr, ok := uErr.Err.(*net.OpError); ok {
-				if os.IsPermission(nErr.Err) {
-					return serverResp, errConnectionFailed{errors.Wrapf(err, "permission denied while trying to connect to the Docker daemon socket at %v", cli.host)}
-				}
-			}
-		}
-
-		if nErr, ok := err.(net.Error); ok {
-			// FIXME(thaJeztah): any net.Error should be considered a connection error (but we should include the original error)?
-			if nErr.Timeout() {
-				return serverResp, ErrorConnectionFailed(cli.host)
-			}
-			if strings.Contains(nErr.Error(), "connection refused") || strings.Contains(nErr.Error(), "dial unix") {
-				return serverResp, ErrorConnectionFailed(cli.host)
-			}
-		}
-
-		// Although there's not a strongly typed error for this in go-winio,
-		// lots of people are using the default configuration for the docker
-		// daemon on Windows where the daemon is listening on a named pipe
-		// `//./pipe/docker_engine, and the client must be running elevated.
-		// Give users a clue rather than the not-overly useful message
-		// such as `error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.26/info:
-		// open //./pipe/docker_engine: The system cannot find the file specified.`.
-		// Note we can't string compare "The system cannot find the file specified" as
-		// this is localised - for example in French the error would be
-		// `open //./pipe/docker_engine: Le fichier spécifié est introuvable.`
-		if strings.Contains(err.Error(), `open //./pipe/docker_engine`) {
-			// Checks if client is running with elevated privileges
-			if f, elevatedErr := os.Open(`\\.\PHYSICALDRIVE0`); elevatedErr != nil {
-				err = errors.Wrap(err, "in the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect")
-			} else {
-				_ = f.Close()
-				err = errors.Wrap(err, "this error may indicate that the docker daemon is not running")
-			}
-		}
-
-		return serverResp, errConnectionFailed{errors.Wrap(err, "error during connect")}
-	}
-
-	if resp != nil {
-		serverResp.statusCode = resp.StatusCode
-		serverResp.body = resp.Body
-		serverResp.header = resp.Header
-	}
-	return serverResp, nil
-}
-
-func (cli *Client) checkResponseErr(serverResp serverResponse) error {
-	if serverResp.statusCode >= 200 && serverResp.statusCode < 400 {
-		return nil
-	}
-
-	var body []byte
-	var err error
-	if serverResp.body != nil {
-		bodyMax := 1 * 1024 * 1024 // 1 MiB
-		bodyR := &io.LimitedReader{
-			R: serverResp.body,
-			N: int64(bodyMax),
-		}
-		body, err = io.ReadAll(bodyR)
-		if err != nil {
-			return err
-		}
-		if bodyR.N == 0 {
-			return fmt.Errorf("request returned %s with a message (> %d bytes) for API route and version %s, check if the server supports the requested API version", http.StatusText(serverResp.statusCode), bodyMax, serverResp.reqURL)
-		}
-	}
-	if len(body) == 0 {
-		return fmt.Errorf("request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(serverResp.statusCode), serverResp.reqURL)
-	}
-
-	var daemonErr error
-	if serverResp.header.Get("Content-Type") == "application/json" && (cli.version == "" || versions.GreaterThan(cli.version, "1.23")) {
-		var errorResponse types.ErrorResponse
-		if err := json.Unmarshal(body, &errorResponse); err != nil {
-			return errors.Wrap(err, "Error reading JSON")
-		}
-		daemonErr = errors.New(strings.TrimSpace(errorResponse.Message))
-	} else {
-		daemonErr = errors.New(strings.TrimSpace(string(body)))
-	}
-	return errors.Wrap(daemonErr, "Error response from daemon")
-}
-
-func (cli *Client) addHeaders(req *http.Request, headers http.Header) *http.Request {
-	// Add CLI Config's HTTP Headers BEFORE we set the Docker headers
-	// then the user can't change OUR headers
-	for k, v := range cli.customHTTPHeaders {
-		if versions.LessThan(cli.version, "1.25") && http.CanonicalHeaderKey(k) == "User-Agent" {
-			continue
-		}
-		req.Header.Set(k, v)
-	}
-
-	for k, v := range headers {
-		req.Header[http.CanonicalHeaderKey(k)] = v
-	}
-
-	if cli.userAgent != nil {
-		if *cli.userAgent == "" {
-			req.Header.Del("User-Agent")
-		} else {
-			req.Header.Set("User-Agent", *cli.userAgent)
-		}
-	}
-	return req
-}
-
-func encodeData(data interface{}) (*bytes.Buffer, error) {
-	params := bytes.NewBuffer(nil)
-	if data != nil {
-		if err := json.NewEncoder(params).Encode(data); err != nil {
-			return nil, err
-		}
-	}
-	return params, nil
-}
-
-func ensureReaderClosed(response serverResponse) {
-	if response.body != nil {
-		// Drain up to 512 bytes and close the body to let the Transport reuse the connection
-		_, _ = io.CopyN(io.Discard, response.body, 512)
-		_ = response.body.Close()
-	}
-}
diff --git a/vendor/github.com/docker/docker/client/secret_create.go b/vendor/github.com/docker/docker/client/secret_create.go
deleted file mode 100644
index 7b7f1ba74..000000000
--- a/vendor/github.com/docker/docker/client/secret_create.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// SecretCreate creates a new secret.
-func (cli *Client) SecretCreate(ctx context.Context, secret swarm.SecretSpec) (types.SecretCreateResponse, error) {
-	var response types.SecretCreateResponse
-	if err := cli.NewVersionError(ctx, "1.25", "secret create"); err != nil {
-		return response, err
-	}
-	resp, err := cli.post(ctx, "/secrets/create", nil, secret, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return response, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&response)
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/secret_inspect.go b/vendor/github.com/docker/docker/client/secret_inspect.go
deleted file mode 100644
index a9cb59889..000000000
--- a/vendor/github.com/docker/docker/client/secret_inspect.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"io"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// SecretInspectWithRaw returns the secret information with raw data
-func (cli *Client) SecretInspectWithRaw(ctx context.Context, id string) (swarm.Secret, []byte, error) {
-	if err := cli.NewVersionError(ctx, "1.25", "secret inspect"); err != nil {
-		return swarm.Secret{}, nil, err
-	}
-	if id == "" {
-		return swarm.Secret{}, nil, objectNotFoundError{object: "secret", id: id}
-	}
-	resp, err := cli.get(ctx, "/secrets/"+id, nil, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return swarm.Secret{}, nil, err
-	}
-
-	body, err := io.ReadAll(resp.body)
-	if err != nil {
-		return swarm.Secret{}, nil, err
-	}
-
-	var secret swarm.Secret
-	rdr := bytes.NewReader(body)
-	err = json.NewDecoder(rdr).Decode(&secret)
-
-	return secret, body, err
-}
diff --git a/vendor/github.com/docker/docker/client/secret_list.go b/vendor/github.com/docker/docker/client/secret_list.go
deleted file mode 100644
index 4d21639ef..000000000
--- a/vendor/github.com/docker/docker/client/secret_list.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// SecretList returns the list of secrets.
-func (cli *Client) SecretList(ctx context.Context, options types.SecretListOptions) ([]swarm.Secret, error) {
-	if err := cli.NewVersionError(ctx, "1.25", "secret list"); err != nil {
-		return nil, err
-	}
-	query := url.Values{}
-
-	if options.Filters.Len() > 0 {
-		filterJSON, err := filters.ToJSON(options.Filters)
-		if err != nil {
-			return nil, err
-		}
-
-		query.Set("filters", filterJSON)
-	}
-
-	resp, err := cli.get(ctx, "/secrets", query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return nil, err
-	}
-
-	var secrets []swarm.Secret
-	err = json.NewDecoder(resp.body).Decode(&secrets)
-	return secrets, err
-}
diff --git a/vendor/github.com/docker/docker/client/secret_remove.go b/vendor/github.com/docker/docker/client/secret_remove.go
deleted file mode 100644
index 079ed6739..000000000
--- a/vendor/github.com/docker/docker/client/secret_remove.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import "context"
-
-// SecretRemove removes a secret.
-func (cli *Client) SecretRemove(ctx context.Context, id string) error {
-	if err := cli.NewVersionError(ctx, "1.25", "secret remove"); err != nil {
-		return err
-	}
-	resp, err := cli.delete(ctx, "/secrets/"+id, nil, nil)
-	defer ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/secret_update.go b/vendor/github.com/docker/docker/client/secret_update.go
deleted file mode 100644
index 9dfe67198..000000000
--- a/vendor/github.com/docker/docker/client/secret_update.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// SecretUpdate attempts to update a secret.
-func (cli *Client) SecretUpdate(ctx context.Context, id string, version swarm.Version, secret swarm.SecretSpec) error {
-	if err := cli.NewVersionError(ctx, "1.25", "secret update"); err != nil {
-		return err
-	}
-	query := url.Values{}
-	query.Set("version", version.String())
-	resp, err := cli.post(ctx, "/secrets/"+id+"/update", query, secret, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/service_create.go b/vendor/github.com/docker/docker/client/service_create.go
deleted file mode 100644
index b72cb420d..000000000
--- a/vendor/github.com/docker/docker/client/service_create.go
+++ /dev/null
@@ -1,193 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"fmt"
-	"net/http"
-	"strings"
-
-	"github.com/distribution/reference"
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/registry"
-	"github.com/docker/docker/api/types/swarm"
-	"github.com/docker/docker/api/types/versions"
-	"github.com/opencontainers/go-digest"
-	"github.com/pkg/errors"
-)
-
-// ServiceCreate creates a new service.
-func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (swarm.ServiceCreateResponse, error) {
-	var response swarm.ServiceCreateResponse
-
-	// Make sure we negotiated (if the client is configured to do so),
-	// as code below contains API-version specific handling of options.
-	//
-	// Normally, version-negotiation (if enabled) would not happen until
-	// the API request is made.
-	if err := cli.checkVersion(ctx); err != nil {
-		return response, err
-	}
-
-	// Make sure containerSpec is not nil when no runtime is set or the runtime is set to container
-	if service.TaskTemplate.ContainerSpec == nil && (service.TaskTemplate.Runtime == "" || service.TaskTemplate.Runtime == swarm.RuntimeContainer) {
-		service.TaskTemplate.ContainerSpec = &swarm.ContainerSpec{}
-	}
-
-	if err := validateServiceSpec(service); err != nil {
-		return response, err
-	}
-
-	// ensure that the image is tagged
-	var resolveWarning string
-	switch {
-	case service.TaskTemplate.ContainerSpec != nil:
-		if taggedImg := imageWithTagString(service.TaskTemplate.ContainerSpec.Image); taggedImg != "" {
-			service.TaskTemplate.ContainerSpec.Image = taggedImg
-		}
-		if options.QueryRegistry {
-			resolveWarning = resolveContainerSpecImage(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth)
-		}
-	case service.TaskTemplate.PluginSpec != nil:
-		if taggedImg := imageWithTagString(service.TaskTemplate.PluginSpec.Remote); taggedImg != "" {
-			service.TaskTemplate.PluginSpec.Remote = taggedImg
-		}
-		if options.QueryRegistry {
-			resolveWarning = resolvePluginSpecRemote(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth)
-		}
-	}
-
-	headers := http.Header{}
-	if versions.LessThan(cli.version, "1.30") {
-		// the custom "version" header was used by engine API before 20.10
-		// (API 1.30) to switch between client- and server-side lookup of
-		// image digests.
-		headers["version"] = []string{cli.version}
-	}
-	if options.EncodedRegistryAuth != "" {
-		headers[registry.AuthHeader] = []string{options.EncodedRegistryAuth}
-	}
-	resp, err := cli.post(ctx, "/services/create", nil, service, headers)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return response, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&response)
-	if resolveWarning != "" {
-		response.Warnings = append(response.Warnings, resolveWarning)
-	}
-
-	return response, err
-}
-
-func resolveContainerSpecImage(ctx context.Context, cli DistributionAPIClient, taskSpec *swarm.TaskSpec, encodedAuth string) string {
-	var warning string
-	if img, imgPlatforms, err := imageDigestAndPlatforms(ctx, cli, taskSpec.ContainerSpec.Image, encodedAuth); err != nil {
-		warning = digestWarning(taskSpec.ContainerSpec.Image)
-	} else {
-		taskSpec.ContainerSpec.Image = img
-		if len(imgPlatforms) > 0 {
-			if taskSpec.Placement == nil {
-				taskSpec.Placement = &swarm.Placement{}
-			}
-			taskSpec.Placement.Platforms = imgPlatforms
-		}
-	}
-	return warning
-}
-
-func resolvePluginSpecRemote(ctx context.Context, cli DistributionAPIClient, taskSpec *swarm.TaskSpec, encodedAuth string) string {
-	var warning string
-	if img, imgPlatforms, err := imageDigestAndPlatforms(ctx, cli, taskSpec.PluginSpec.Remote, encodedAuth); err != nil {
-		warning = digestWarning(taskSpec.PluginSpec.Remote)
-	} else {
-		taskSpec.PluginSpec.Remote = img
-		if len(imgPlatforms) > 0 {
-			if taskSpec.Placement == nil {
-				taskSpec.Placement = &swarm.Placement{}
-			}
-			taskSpec.Placement.Platforms = imgPlatforms
-		}
-	}
-	return warning
-}
-
-func imageDigestAndPlatforms(ctx context.Context, cli DistributionAPIClient, image, encodedAuth string) (string, []swarm.Platform, error) {
-	distributionInspect, err := cli.DistributionInspect(ctx, image, encodedAuth)
-	var platforms []swarm.Platform
-	if err != nil {
-		return "", nil, err
-	}
-
-	imageWithDigest := imageWithDigestString(image, distributionInspect.Descriptor.Digest)
-
-	if len(distributionInspect.Platforms) > 0 {
-		platforms = make([]swarm.Platform, 0, len(distributionInspect.Platforms))
-		for _, p := range distributionInspect.Platforms {
-			// clear architecture field for arm. This is a temporary patch to address
-			// https://github.com/docker/swarmkit/issues/2294. The issue is that while
-			// image manifests report "arm" as the architecture, the node reports
-			// something like "armv7l" (includes the variant), which causes arm images
-			// to stop working with swarm mode. This patch removes the architecture
-			// constraint for arm images to ensure tasks get scheduled.
-			arch := p.Architecture
-			if strings.ToLower(arch) == "arm" {
-				arch = ""
-			}
-			platforms = append(platforms, swarm.Platform{
-				Architecture: arch,
-				OS:           p.OS,
-			})
-		}
-	}
-	return imageWithDigest, platforms, err
-}
-
-// imageWithDigestString takes an image string and a digest, and updates
-// the image string if it didn't originally contain a digest. It returns
-// image unmodified in other situations.
-func imageWithDigestString(image string, dgst digest.Digest) string {
-	namedRef, err := reference.ParseNormalizedNamed(image)
-	if err == nil {
-		if _, isCanonical := namedRef.(reference.Canonical); !isCanonical {
-			// ensure that image gets a default tag if none is provided
-			img, err := reference.WithDigest(namedRef, dgst)
-			if err == nil {
-				return reference.FamiliarString(img)
-			}
-		}
-	}
-	return image
-}
-
-// imageWithTagString takes an image string, and returns a tagged image
-// string, adding a 'latest' tag if one was not provided. It returns an
-// empty string if a canonical reference was provided
-func imageWithTagString(image string) string {
-	namedRef, err := reference.ParseNormalizedNamed(image)
-	if err == nil {
-		return reference.FamiliarString(reference.TagNameOnly(namedRef))
-	}
-	return ""
-}
-
-// digestWarning constructs a formatted warning string using the
-// image name that could not be pinned by digest. The formatting
-// is hardcoded, but could me made smarter in the future
-func digestWarning(image string) string {
-	return fmt.Sprintf("image %s could not be accessed on a registry to record\nits digest. Each node will access %s independently,\npossibly leading to different nodes running different\nversions of the image.\n", image, image)
-}
-
-func validateServiceSpec(s swarm.ServiceSpec) error {
-	if s.TaskTemplate.ContainerSpec != nil && s.TaskTemplate.PluginSpec != nil {
-		return errors.New("must not specify both a container spec and a plugin spec in the task template")
-	}
-	if s.TaskTemplate.PluginSpec != nil && s.TaskTemplate.Runtime != swarm.RuntimePlugin {
-		return errors.New("mismatched runtime with plugin spec")
-	}
-	if s.TaskTemplate.ContainerSpec != nil && (s.TaskTemplate.Runtime != "" && s.TaskTemplate.Runtime != swarm.RuntimeContainer) {
-		return errors.New("mismatched runtime with container spec")
-	}
-	return nil
-}
diff --git a/vendor/github.com/docker/docker/client/service_inspect.go b/vendor/github.com/docker/docker/client/service_inspect.go
deleted file mode 100644
index cee020c98..000000000
--- a/vendor/github.com/docker/docker/client/service_inspect.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"fmt"
-	"io"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// ServiceInspectWithRaw returns the service information and the raw data.
-func (cli *Client) ServiceInspectWithRaw(ctx context.Context, serviceID string, opts types.ServiceInspectOptions) (swarm.Service, []byte, error) {
-	if serviceID == "" {
-		return swarm.Service{}, nil, objectNotFoundError{object: "service", id: serviceID}
-	}
-	query := url.Values{}
-	query.Set("insertDefaults", fmt.Sprintf("%v", opts.InsertDefaults))
-	serverResp, err := cli.get(ctx, "/services/"+serviceID, query, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return swarm.Service{}, nil, err
-	}
-
-	body, err := io.ReadAll(serverResp.body)
-	if err != nil {
-		return swarm.Service{}, nil, err
-	}
-
-	var response swarm.Service
-	rdr := bytes.NewReader(body)
-	err = json.NewDecoder(rdr).Decode(&response)
-	return response, body, err
-}
diff --git a/vendor/github.com/docker/docker/client/service_list.go b/vendor/github.com/docker/docker/client/service_list.go
deleted file mode 100644
index f97ec75a5..000000000
--- a/vendor/github.com/docker/docker/client/service_list.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// ServiceList returns the list of services.
-func (cli *Client) ServiceList(ctx context.Context, options types.ServiceListOptions) ([]swarm.Service, error) {
-	query := url.Values{}
-
-	if options.Filters.Len() > 0 {
-		filterJSON, err := filters.ToJSON(options.Filters)
-		if err != nil {
-			return nil, err
-		}
-
-		query.Set("filters", filterJSON)
-	}
-
-	if options.Status {
-		query.Set("status", "true")
-	}
-
-	resp, err := cli.get(ctx, "/services", query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return nil, err
-	}
-
-	var services []swarm.Service
-	err = json.NewDecoder(resp.body).Decode(&services)
-	return services, err
-}
diff --git a/vendor/github.com/docker/docker/client/service_logs.go b/vendor/github.com/docker/docker/client/service_logs.go
deleted file mode 100644
index e9e30a2ab..000000000
--- a/vendor/github.com/docker/docker/client/service_logs.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/url"
-	"time"
-
-	"github.com/docker/docker/api/types/container"
-	timetypes "github.com/docker/docker/api/types/time"
-	"github.com/pkg/errors"
-)
-
-// ServiceLogs returns the logs generated by a service in an io.ReadCloser.
-// It's up to the caller to close the stream.
-func (cli *Client) ServiceLogs(ctx context.Context, serviceID string, options container.LogsOptions) (io.ReadCloser, error) {
-	query := url.Values{}
-	if options.ShowStdout {
-		query.Set("stdout", "1")
-	}
-
-	if options.ShowStderr {
-		query.Set("stderr", "1")
-	}
-
-	if options.Since != "" {
-		ts, err := timetypes.GetTimestamp(options.Since, time.Now())
-		if err != nil {
-			return nil, errors.Wrap(err, `invalid value for "since"`)
-		}
-		query.Set("since", ts)
-	}
-
-	if options.Timestamps {
-		query.Set("timestamps", "1")
-	}
-
-	if options.Details {
-		query.Set("details", "1")
-	}
-
-	if options.Follow {
-		query.Set("follow", "1")
-	}
-	query.Set("tail", options.Tail)
-
-	resp, err := cli.get(ctx, "/services/"+serviceID+"/logs", query, nil)
-	if err != nil {
-		return nil, err
-	}
-	return resp.body, nil
-}
diff --git a/vendor/github.com/docker/docker/client/service_remove.go b/vendor/github.com/docker/docker/client/service_remove.go
deleted file mode 100644
index 2c46326eb..000000000
--- a/vendor/github.com/docker/docker/client/service_remove.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import "context"
-
-// ServiceRemove kills and removes a service.
-func (cli *Client) ServiceRemove(ctx context.Context, serviceID string) error {
-	resp, err := cli.delete(ctx, "/services/"+serviceID, nil, nil)
-	defer ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/service_update.go b/vendor/github.com/docker/docker/client/service_update.go
deleted file mode 100644
index d2f03f02f..000000000
--- a/vendor/github.com/docker/docker/client/service_update.go
+++ /dev/null
@@ -1,86 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/http"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/registry"
-	"github.com/docker/docker/api/types/swarm"
-	"github.com/docker/docker/api/types/versions"
-)
-
-// ServiceUpdate updates a Service. The version number is required to avoid conflicting writes.
-// It should be the value as set *before* the update. You can find this value in the Meta field
-// of swarm.Service, which can be found using ServiceInspectWithRaw.
-func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (swarm.ServiceUpdateResponse, error) {
-	response := swarm.ServiceUpdateResponse{}
-
-	// Make sure we negotiated (if the client is configured to do so),
-	// as code below contains API-version specific handling of options.
-	//
-	// Normally, version-negotiation (if enabled) would not happen until
-	// the API request is made.
-	if err := cli.checkVersion(ctx); err != nil {
-		return response, err
-	}
-
-	query := url.Values{}
-	if options.RegistryAuthFrom != "" {
-		query.Set("registryAuthFrom", options.RegistryAuthFrom)
-	}
-
-	if options.Rollback != "" {
-		query.Set("rollback", options.Rollback)
-	}
-
-	query.Set("version", version.String())
-
-	if err := validateServiceSpec(service); err != nil {
-		return response, err
-	}
-
-	// ensure that the image is tagged
-	var resolveWarning string
-	switch {
-	case service.TaskTemplate.ContainerSpec != nil:
-		if taggedImg := imageWithTagString(service.TaskTemplate.ContainerSpec.Image); taggedImg != "" {
-			service.TaskTemplate.ContainerSpec.Image = taggedImg
-		}
-		if options.QueryRegistry {
-			resolveWarning = resolveContainerSpecImage(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth)
-		}
-	case service.TaskTemplate.PluginSpec != nil:
-		if taggedImg := imageWithTagString(service.TaskTemplate.PluginSpec.Remote); taggedImg != "" {
-			service.TaskTemplate.PluginSpec.Remote = taggedImg
-		}
-		if options.QueryRegistry {
-			resolveWarning = resolvePluginSpecRemote(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth)
-		}
-	}
-
-	headers := http.Header{}
-	if versions.LessThan(cli.version, "1.30") {
-		// the custom "version" header was used by engine API before 20.10
-		// (API 1.30) to switch between client- and server-side lookup of
-		// image digests.
-		headers["version"] = []string{cli.version}
-	}
-	if options.EncodedRegistryAuth != "" {
-		headers[registry.AuthHeader] = []string{options.EncodedRegistryAuth}
-	}
-	resp, err := cli.post(ctx, "/services/"+serviceID+"/update", query, service, headers)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return response, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&response)
-	if resolveWarning != "" {
-		response.Warnings = append(response.Warnings, resolveWarning)
-	}
-
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go b/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go
deleted file mode 100644
index 19f59dd58..000000000
--- a/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-
-	"github.com/docker/docker/api/types"
-)
-
-// SwarmGetUnlockKey retrieves the swarm's unlock key.
-func (cli *Client) SwarmGetUnlockKey(ctx context.Context) (types.SwarmUnlockKeyResponse, error) {
-	serverResp, err := cli.get(ctx, "/swarm/unlockkey", nil, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return types.SwarmUnlockKeyResponse{}, err
-	}
-
-	var response types.SwarmUnlockKeyResponse
-	err = json.NewDecoder(serverResp.body).Decode(&response)
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/swarm_init.go b/vendor/github.com/docker/docker/client/swarm_init.go
deleted file mode 100644
index da3c1637e..000000000
--- a/vendor/github.com/docker/docker/client/swarm_init.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// SwarmInit initializes the swarm.
-func (cli *Client) SwarmInit(ctx context.Context, req swarm.InitRequest) (string, error) {
-	serverResp, err := cli.post(ctx, "/swarm/init", nil, req, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return "", err
-	}
-
-	var response string
-	err = json.NewDecoder(serverResp.body).Decode(&response)
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/swarm_inspect.go b/vendor/github.com/docker/docker/client/swarm_inspect.go
deleted file mode 100644
index b52b67a88..000000000
--- a/vendor/github.com/docker/docker/client/swarm_inspect.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// SwarmInspect inspects the swarm.
-func (cli *Client) SwarmInspect(ctx context.Context) (swarm.Swarm, error) {
-	serverResp, err := cli.get(ctx, "/swarm", nil, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return swarm.Swarm{}, err
-	}
-
-	var response swarm.Swarm
-	err = json.NewDecoder(serverResp.body).Decode(&response)
-	return response, err
-}
diff --git a/vendor/github.com/docker/docker/client/swarm_join.go b/vendor/github.com/docker/docker/client/swarm_join.go
deleted file mode 100644
index a1cf0455d..000000000
--- a/vendor/github.com/docker/docker/client/swarm_join.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// SwarmJoin joins the swarm.
-func (cli *Client) SwarmJoin(ctx context.Context, req swarm.JoinRequest) error {
-	resp, err := cli.post(ctx, "/swarm/join", nil, req, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/swarm_leave.go b/vendor/github.com/docker/docker/client/swarm_leave.go
deleted file mode 100644
index 90ca84b36..000000000
--- a/vendor/github.com/docker/docker/client/swarm_leave.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-)
-
-// SwarmLeave leaves the swarm.
-func (cli *Client) SwarmLeave(ctx context.Context, force bool) error {
-	query := url.Values{}
-	if force {
-		query.Set("force", "1")
-	}
-	resp, err := cli.post(ctx, "/swarm/leave", query, nil, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/swarm_unlock.go b/vendor/github.com/docker/docker/client/swarm_unlock.go
deleted file mode 100644
index d2412f7d4..000000000
--- a/vendor/github.com/docker/docker/client/swarm_unlock.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// SwarmUnlock unlocks locked swarm.
-func (cli *Client) SwarmUnlock(ctx context.Context, req swarm.UnlockRequest) error {
-	serverResp, err := cli.post(ctx, "/swarm/unlock", nil, req, nil)
-	ensureReaderClosed(serverResp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/swarm_update.go b/vendor/github.com/docker/docker/client/swarm_update.go
deleted file mode 100644
index 9fde7d75e..000000000
--- a/vendor/github.com/docker/docker/client/swarm_update.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-	"strconv"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// SwarmUpdate updates the swarm.
-func (cli *Client) SwarmUpdate(ctx context.Context, version swarm.Version, swarm swarm.Spec, flags swarm.UpdateFlags) error {
-	query := url.Values{}
-	query.Set("version", version.String())
-	query.Set("rotateWorkerToken", strconv.FormatBool(flags.RotateWorkerToken))
-	query.Set("rotateManagerToken", strconv.FormatBool(flags.RotateManagerToken))
-	query.Set("rotateManagerUnlockKey", strconv.FormatBool(flags.RotateManagerUnlockKey))
-	resp, err := cli.post(ctx, "/swarm/update", query, swarm, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/task_inspect.go b/vendor/github.com/docker/docker/client/task_inspect.go
deleted file mode 100644
index dde1f6c59..000000000
--- a/vendor/github.com/docker/docker/client/task_inspect.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"io"
-
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// TaskInspectWithRaw returns the task information and its raw representation.
-func (cli *Client) TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error) {
-	if taskID == "" {
-		return swarm.Task{}, nil, objectNotFoundError{object: "task", id: taskID}
-	}
-	serverResp, err := cli.get(ctx, "/tasks/"+taskID, nil, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return swarm.Task{}, nil, err
-	}
-
-	body, err := io.ReadAll(serverResp.body)
-	if err != nil {
-		return swarm.Task{}, nil, err
-	}
-
-	var response swarm.Task
-	rdr := bytes.NewReader(body)
-	err = json.NewDecoder(rdr).Decode(&response)
-	return response, body, err
-}
diff --git a/vendor/github.com/docker/docker/client/task_list.go b/vendor/github.com/docker/docker/client/task_list.go
deleted file mode 100644
index 4869b4449..000000000
--- a/vendor/github.com/docker/docker/client/task_list.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/swarm"
-)
-
-// TaskList returns the list of tasks.
-func (cli *Client) TaskList(ctx context.Context, options types.TaskListOptions) ([]swarm.Task, error) {
-	query := url.Values{}
-
-	if options.Filters.Len() > 0 {
-		filterJSON, err := filters.ToJSON(options.Filters)
-		if err != nil {
-			return nil, err
-		}
-
-		query.Set("filters", filterJSON)
-	}
-
-	resp, err := cli.get(ctx, "/tasks", query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return nil, err
-	}
-
-	var tasks []swarm.Task
-	err = json.NewDecoder(resp.body).Decode(&tasks)
-	return tasks, err
-}
diff --git a/vendor/github.com/docker/docker/client/task_logs.go b/vendor/github.com/docker/docker/client/task_logs.go
deleted file mode 100644
index b8c20e71d..000000000
--- a/vendor/github.com/docker/docker/client/task_logs.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/url"
-	"time"
-
-	"github.com/docker/docker/api/types/container"
-	timetypes "github.com/docker/docker/api/types/time"
-)
-
-// TaskLogs returns the logs generated by a task in an io.ReadCloser.
-// It's up to the caller to close the stream.
-func (cli *Client) TaskLogs(ctx context.Context, taskID string, options container.LogsOptions) (io.ReadCloser, error) {
-	query := url.Values{}
-	if options.ShowStdout {
-		query.Set("stdout", "1")
-	}
-
-	if options.ShowStderr {
-		query.Set("stderr", "1")
-	}
-
-	if options.Since != "" {
-		ts, err := timetypes.GetTimestamp(options.Since, time.Now())
-		if err != nil {
-			return nil, err
-		}
-		query.Set("since", ts)
-	}
-
-	if options.Timestamps {
-		query.Set("timestamps", "1")
-	}
-
-	if options.Details {
-		query.Set("details", "1")
-	}
-
-	if options.Follow {
-		query.Set("follow", "1")
-	}
-	query.Set("tail", options.Tail)
-
-	resp, err := cli.get(ctx, "/tasks/"+taskID+"/logs", query, nil)
-	if err != nil {
-		return nil, err
-	}
-	return resp.body, nil
-}
diff --git a/vendor/github.com/docker/docker/client/utils.go b/vendor/github.com/docker/docker/client/utils.go
deleted file mode 100644
index 7f3ff44eb..000000000
--- a/vendor/github.com/docker/docker/client/utils.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"net/url"
-	"regexp"
-
-	"github.com/docker/docker/api/types/filters"
-)
-
-var headerRegexp = regexp.MustCompile(`\ADocker/.+\s\((.+)\)\z`)
-
-// getDockerOS returns the operating system based on the server header from the daemon.
-func getDockerOS(serverHeader string) string {
-	var osType string
-	matches := headerRegexp.FindStringSubmatch(serverHeader)
-	if len(matches) > 0 {
-		osType = matches[1]
-	}
-	return osType
-}
-
-// getFiltersQuery returns a url query with "filters" query term, based on the
-// filters provided.
-func getFiltersQuery(f filters.Args) (url.Values, error) {
-	query := url.Values{}
-	if f.Len() > 0 {
-		filterJSON, err := filters.ToJSON(f)
-		if err != nil {
-			return query, err
-		}
-		query.Set("filters", filterJSON)
-	}
-	return query, nil
-}
diff --git a/vendor/github.com/docker/docker/client/version.go b/vendor/github.com/docker/docker/client/version.go
deleted file mode 100644
index 8f17ff4e8..000000000
--- a/vendor/github.com/docker/docker/client/version.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-
-	"github.com/docker/docker/api/types"
-)
-
-// ServerVersion returns information of the docker client and server host.
-func (cli *Client) ServerVersion(ctx context.Context) (types.Version, error) {
-	resp, err := cli.get(ctx, "/version", nil, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return types.Version{}, err
-	}
-
-	var server types.Version
-	err = json.NewDecoder(resp.body).Decode(&server)
-	return server, err
-}
diff --git a/vendor/github.com/docker/docker/client/volume_create.go b/vendor/github.com/docker/docker/client/volume_create.go
deleted file mode 100644
index b3b182437..000000000
--- a/vendor/github.com/docker/docker/client/volume_create.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-
-	"github.com/docker/docker/api/types/volume"
-)
-
-// VolumeCreate creates a volume in the docker host.
-func (cli *Client) VolumeCreate(ctx context.Context, options volume.CreateOptions) (volume.Volume, error) {
-	var vol volume.Volume
-	resp, err := cli.post(ctx, "/volumes/create", nil, options, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return vol, err
-	}
-	err = json.NewDecoder(resp.body).Decode(&vol)
-	return vol, err
-}
diff --git a/vendor/github.com/docker/docker/client/volume_inspect.go b/vendor/github.com/docker/docker/client/volume_inspect.go
deleted file mode 100644
index b3ba4e604..000000000
--- a/vendor/github.com/docker/docker/client/volume_inspect.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"io"
-
-	"github.com/docker/docker/api/types/volume"
-)
-
-// VolumeInspect returns the information about a specific volume in the docker host.
-func (cli *Client) VolumeInspect(ctx context.Context, volumeID string) (volume.Volume, error) {
-	vol, _, err := cli.VolumeInspectWithRaw(ctx, volumeID)
-	return vol, err
-}
-
-// VolumeInspectWithRaw returns the information about a specific volume in the docker host and its raw representation
-func (cli *Client) VolumeInspectWithRaw(ctx context.Context, volumeID string) (volume.Volume, []byte, error) {
-	if volumeID == "" {
-		return volume.Volume{}, nil, objectNotFoundError{object: "volume", id: volumeID}
-	}
-
-	var vol volume.Volume
-	resp, err := cli.get(ctx, "/volumes/"+volumeID, nil, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return vol, nil, err
-	}
-
-	body, err := io.ReadAll(resp.body)
-	if err != nil {
-		return vol, nil, err
-	}
-	rdr := bytes.NewReader(body)
-	err = json.NewDecoder(rdr).Decode(&vol)
-	return vol, body, err
-}
diff --git a/vendor/github.com/docker/docker/client/volume_list.go b/vendor/github.com/docker/docker/client/volume_list.go
deleted file mode 100644
index d5ea9827c..000000000
--- a/vendor/github.com/docker/docker/client/volume_list.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"net/url"
-
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/volume"
-)
-
-// VolumeList returns the volumes configured in the docker host.
-func (cli *Client) VolumeList(ctx context.Context, options volume.ListOptions) (volume.ListResponse, error) {
-	var volumes volume.ListResponse
-	query := url.Values{}
-
-	if options.Filters.Len() > 0 {
-		//nolint:staticcheck // ignore SA1019 for old code
-		filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filters)
-		if err != nil {
-			return volumes, err
-		}
-		query.Set("filters", filterJSON)
-	}
-	resp, err := cli.get(ctx, "/volumes", query, nil)
-	defer ensureReaderClosed(resp)
-	if err != nil {
-		return volumes, err
-	}
-
-	err = json.NewDecoder(resp.body).Decode(&volumes)
-	return volumes, err
-}
diff --git a/vendor/github.com/docker/docker/client/volume_prune.go b/vendor/github.com/docker/docker/client/volume_prune.go
deleted file mode 100644
index 9b09c30fa..000000000
--- a/vendor/github.com/docker/docker/client/volume_prune.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"encoding/json"
-	"fmt"
-
-	"github.com/docker/docker/api/types/filters"
-	"github.com/docker/docker/api/types/volume"
-)
-
-// VolumesPrune requests the daemon to delete unused data
-func (cli *Client) VolumesPrune(ctx context.Context, pruneFilters filters.Args) (volume.PruneReport, error) {
-	var report volume.PruneReport
-
-	if err := cli.NewVersionError(ctx, "1.25", "volume prune"); err != nil {
-		return report, err
-	}
-
-	query, err := getFiltersQuery(pruneFilters)
-	if err != nil {
-		return report, err
-	}
-
-	serverResp, err := cli.post(ctx, "/volumes/prune", query, nil, nil)
-	defer ensureReaderClosed(serverResp)
-	if err != nil {
-		return report, err
-	}
-
-	if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil {
-		return report, fmt.Errorf("Error retrieving volume prune report: %v", err)
-	}
-
-	return report, nil
-}
diff --git a/vendor/github.com/docker/docker/client/volume_remove.go b/vendor/github.com/docker/docker/client/volume_remove.go
deleted file mode 100644
index b8bdc5ae8..000000000
--- a/vendor/github.com/docker/docker/client/volume_remove.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types/versions"
-)
-
-// VolumeRemove removes a volume from the docker host.
-func (cli *Client) VolumeRemove(ctx context.Context, volumeID string, force bool) error {
-	query := url.Values{}
-	if force {
-		// Make sure we negotiated (if the client is configured to do so),
-		// as code below contains API-version specific handling of options.
-		//
-		// Normally, version-negotiation (if enabled) would not happen until
-		// the API request is made.
-		if err := cli.checkVersion(ctx); err != nil {
-			return err
-		}
-		if versions.GreaterThanOrEqualTo(cli.version, "1.25") {
-			query.Set("force", "1")
-		}
-	}
-	resp, err := cli.delete(ctx, "/volumes/"+volumeID, query, nil)
-	defer ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/client/volume_update.go b/vendor/github.com/docker/docker/client/volume_update.go
deleted file mode 100644
index 151863f07..000000000
--- a/vendor/github.com/docker/docker/client/volume_update.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"net/url"
-
-	"github.com/docker/docker/api/types/swarm"
-	"github.com/docker/docker/api/types/volume"
-)
-
-// VolumeUpdate updates a volume. This only works for Cluster Volumes, and
-// only some fields can be updated.
-func (cli *Client) VolumeUpdate(ctx context.Context, volumeID string, version swarm.Version, options volume.UpdateOptions) error {
-	if err := cli.NewVersionError(ctx, "1.42", "volume update"); err != nil {
-		return err
-	}
-
-	query := url.Values{}
-	query.Set("version", version.String())
-
-	resp, err := cli.put(ctx, "/volumes/"+volumeID, query, options, nil)
-	ensureReaderClosed(resp)
-	return err
-}
diff --git a/vendor/github.com/docker/docker/internal/multierror/multierror.go b/vendor/github.com/docker/docker/internal/multierror/multierror.go
deleted file mode 100644
index cf4d6a595..000000000
--- a/vendor/github.com/docker/docker/internal/multierror/multierror.go
+++ /dev/null
@@ -1,46 +0,0 @@
-package multierror
-
-import (
-	"strings"
-)
-
-// Join is a drop-in replacement for errors.Join with better formatting.
-func Join(errs ...error) error {
-	n := 0
-	for _, err := range errs {
-		if err != nil {
-			n++
-		}
-	}
-	if n == 0 {
-		return nil
-	}
-	e := &joinError{
-		errs: make([]error, 0, n),
-	}
-	for _, err := range errs {
-		if err != nil {
-			e.errs = append(e.errs, err)
-		}
-	}
-	return e
-}
-
-type joinError struct {
-	errs []error
-}
-
-func (e *joinError) Error() string {
-	if len(e.errs) == 1 {
-		return strings.TrimSpace(e.errs[0].Error())
-	}
-	stringErrs := make([]string, 0, len(e.errs))
-	for _, subErr := range e.errs {
-		stringErrs = append(stringErrs, strings.Replace(subErr.Error(), "\n", "\n\t", -1))
-	}
-	return "* " + strings.Join(stringErrs, "\n* ")
-}
-
-func (e *joinError) Unwrap() []error {
-	return e.errs
-}
diff --git a/vendor/github.com/docker/go-connections/sockets/README.md b/vendor/github.com/docker/go-connections/sockets/README.md
deleted file mode 100644
index e69de29bb..000000000
diff --git a/vendor/github.com/docker/go-connections/sockets/inmem_socket.go b/vendor/github.com/docker/go-connections/sockets/inmem_socket.go
deleted file mode 100644
index 99846ffdd..000000000
--- a/vendor/github.com/docker/go-connections/sockets/inmem_socket.go
+++ /dev/null
@@ -1,81 +0,0 @@
-package sockets
-
-import (
-	"errors"
-	"net"
-	"sync"
-)
-
-var errClosed = errors.New("use of closed network connection")
-
-// InmemSocket implements net.Listener using in-memory only connections.
-type InmemSocket struct {
-	chConn  chan net.Conn
-	chClose chan struct{}
-	addr    string
-	mu      sync.Mutex
-}
-
-// dummyAddr is used to satisfy net.Addr for the in-mem socket
-// it is just stored as a string and returns the string for all calls
-type dummyAddr string
-
-// NewInmemSocket creates an in-memory only net.Listener
-// The addr argument can be any string, but is used to satisfy the `Addr()` part
-// of the net.Listener interface
-func NewInmemSocket(addr string, bufSize int) *InmemSocket {
-	return &InmemSocket{
-		chConn:  make(chan net.Conn, bufSize),
-		chClose: make(chan struct{}),
-		addr:    addr,
-	}
-}
-
-// Addr returns the socket's addr string to satisfy net.Listener
-func (s *InmemSocket) Addr() net.Addr {
-	return dummyAddr(s.addr)
-}
-
-// Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn.
-func (s *InmemSocket) Accept() (net.Conn, error) {
-	select {
-	case conn := <-s.chConn:
-		return conn, nil
-	case <-s.chClose:
-		return nil, errClosed
-	}
-}
-
-// Close closes the listener. It will be unavailable for use once closed.
-func (s *InmemSocket) Close() error {
-	s.mu.Lock()
-	defer s.mu.Unlock()
-	select {
-	case <-s.chClose:
-	default:
-		close(s.chClose)
-	}
-	return nil
-}
-
-// Dial is used to establish a connection with the in-mem server
-func (s *InmemSocket) Dial(network, addr string) (net.Conn, error) {
-	srvConn, clientConn := net.Pipe()
-	select {
-	case s.chConn <- srvConn:
-	case <-s.chClose:
-		return nil, errClosed
-	}
-
-	return clientConn, nil
-}
-
-// Network returns the addr string, satisfies net.Addr
-func (a dummyAddr) Network() string {
-	return string(a)
-}
-
-// String returns the string form
-func (a dummyAddr) String() string {
-	return string(a)
-}
diff --git a/vendor/github.com/docker/go-connections/sockets/proxy.go b/vendor/github.com/docker/go-connections/sockets/proxy.go
deleted file mode 100644
index c897cb02a..000000000
--- a/vendor/github.com/docker/go-connections/sockets/proxy.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package sockets
-
-import (
-	"net"
-	"os"
-	"strings"
-)
-
-// GetProxyEnv allows access to the uppercase and the lowercase forms of
-// proxy-related variables.  See the Go specification for details on these
-// variables. https://golang.org/pkg/net/http/
-func GetProxyEnv(key string) string {
-	proxyValue := os.Getenv(strings.ToUpper(key))
-	if proxyValue == "" {
-		return os.Getenv(strings.ToLower(key))
-	}
-	return proxyValue
-}
-
-// DialerFromEnvironment was previously used to configure a net.Dialer to route
-// connections through a SOCKS proxy.
-// DEPRECATED: SOCKS proxies are now supported by configuring only
-// http.Transport.Proxy, and no longer require changing http.Transport.Dial.
-// Therefore, only sockets.ConfigureTransport() needs to be called, and any
-// sockets.DialerFromEnvironment() calls can be dropped.
-func DialerFromEnvironment(direct *net.Dialer) (*net.Dialer, error) {
-	return direct, nil
-}
diff --git a/vendor/github.com/docker/go-connections/sockets/tcp_socket.go b/vendor/github.com/docker/go-connections/sockets/tcp_socket.go
deleted file mode 100644
index 53cbb6c79..000000000
--- a/vendor/github.com/docker/go-connections/sockets/tcp_socket.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Package sockets provides helper functions to create and configure Unix or TCP sockets.
-package sockets
-
-import (
-	"crypto/tls"
-	"net"
-)
-
-// NewTCPSocket creates a TCP socket listener with the specified address and
-// the specified tls configuration. If TLSConfig is set, will encapsulate the
-// TCP listener inside a TLS one.
-func NewTCPSocket(addr string, tlsConfig *tls.Config) (net.Listener, error) {
-	l, err := net.Listen("tcp", addr)
-	if err != nil {
-		return nil, err
-	}
-	if tlsConfig != nil {
-		tlsConfig.NextProtos = []string{"http/1.1"}
-		l = tls.NewListener(l, tlsConfig)
-	}
-	return l, nil
-}
diff --git a/vendor/github.com/docker/go-connections/sockets/unix_socket.go b/vendor/github.com/docker/go-connections/sockets/unix_socket.go
deleted file mode 100644
index b9233521e..000000000
--- a/vendor/github.com/docker/go-connections/sockets/unix_socket.go
+++ /dev/null
@@ -1,126 +0,0 @@
-//go:build !windows
-
-/*
-Package sockets is a simple unix domain socket wrapper.
-
-# Usage
-
-For example:
-
-	import(
-		"fmt"
-		"net"
-		"os"
-		"github.com/docker/go-connections/sockets"
-	)
-
-	func main() {
-		l, err := sockets.NewUnixSocketWithOpts("/path/to/sockets",
-			sockets.WithChown(0,0),sockets.WithChmod(0660))
-		if err != nil {
-			panic(err)
-		}
-		echoStr := "hello"
-
-		go func() {
-			for {
-				conn, err := l.Accept()
-				if err != nil {
-					return
-				}
-				conn.Write([]byte(echoStr))
-				conn.Close()
-			}
-		}()
-
-		conn, err := net.Dial("unix", path)
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		buf := make([]byte, 5)
-		if _, err := conn.Read(buf); err != nil {
-			panic(err)
-		} else if string(buf) != echoStr {
-			panic(fmt.Errorf("msg may lost"))
-		}
-	}
-*/
-package sockets
-
-import (
-	"net"
-	"os"
-	"syscall"
-)
-
-// SockOption sets up socket file's creating option
-type SockOption func(string) error
-
-// WithChown modifies the socket file's uid and gid
-func WithChown(uid, gid int) SockOption {
-	return func(path string) error {
-		if err := os.Chown(path, uid, gid); err != nil {
-			return err
-		}
-		return nil
-	}
-}
-
-// WithChmod modifies socket file's access mode.
-func WithChmod(mask os.FileMode) SockOption {
-	return func(path string) error {
-		if err := os.Chmod(path, mask); err != nil {
-			return err
-		}
-		return nil
-	}
-}
-
-// NewUnixSocketWithOpts creates a unix socket with the specified options.
-// By default, socket permissions are 0000 (i.e.: no access for anyone); pass
-// WithChmod() and WithChown() to set the desired ownership and permissions.
-//
-// This function temporarily changes the system's "umask" to 0777 to work around
-// a race condition between creating the socket and setting its permissions. While
-// this should only be for a short duration, it may affect other processes that
-// create files/directories during that period.
-func NewUnixSocketWithOpts(path string, opts ...SockOption) (net.Listener, error) {
-	if err := syscall.Unlink(path); err != nil && !os.IsNotExist(err) {
-		return nil, err
-	}
-
-	// net.Listen does not allow for permissions to be set. As a result, when
-	// specifying custom permissions ("WithChmod()"), there is a short time
-	// between creating the socket and applying the permissions, during which
-	// the socket permissions are Less restrictive than desired.
-	//
-	// To work around this limitation of net.Listen(), we temporarily set the
-	// umask to 0777, which forces the socket to be created with 000 permissions
-	// (i.e.: no access for anyone). After that, WithChmod() must be used to set
-	// the desired permissions.
-	//
-	// We don't use "defer" here, to reset the umask to its original value as soon
-	// as possible. Ideally we'd be able to detect if WithChmod() was passed as
-	// an option, and skip changing umask if default permissions are used.
-	origUmask := syscall.Umask(0o777)
-	l, err := net.Listen("unix", path)
-	syscall.Umask(origUmask)
-	if err != nil {
-		return nil, err
-	}
-
-	for _, op := range opts {
-		if err := op(path); err != nil {
-			_ = l.Close()
-			return nil, err
-		}
-	}
-
-	return l, nil
-}
-
-// NewUnixSocket creates a unix socket with the specified path and group.
-func NewUnixSocket(path string, gid int) (net.Listener, error) {
-	return NewUnixSocketWithOpts(path, WithChown(0, gid), WithChmod(0o660))
-}
diff --git a/vendor/github.com/docker/go-connections/tlsconfig/certpool.go b/vendor/github.com/docker/go-connections/tlsconfig/certpool.go
deleted file mode 100644
index f84c624ba..000000000
--- a/vendor/github.com/docker/go-connections/tlsconfig/certpool.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package tlsconfig
-
-import (
-	"crypto/x509"
-	"runtime"
-)
-
-// SystemCertPool returns a copy of the system cert pool,
-// returns an error if failed to load or empty pool on windows.
-func SystemCertPool() (*x509.CertPool, error) {
-	certpool, err := x509.SystemCertPool()
-	if err != nil && runtime.GOOS == "windows" {
-		return x509.NewCertPool(), nil
-	}
-	return certpool, err
-}
diff --git a/vendor/github.com/docker/go-connections/tlsconfig/config.go b/vendor/github.com/docker/go-connections/tlsconfig/config.go
deleted file mode 100644
index 606c98a38..000000000
--- a/vendor/github.com/docker/go-connections/tlsconfig/config.go
+++ /dev/null
@@ -1,261 +0,0 @@
-// Package tlsconfig provides primitives to retrieve secure-enough TLS configurations for both clients and servers.
-//
-// As a reminder from https://golang.org/pkg/crypto/tls/#Config:
-//
-//	A Config structure is used to configure a TLS client or server. After one has been passed to a TLS function it must not be modified.
-//	A Config may be reused; the tls package will also not modify it.
-package tlsconfig
-
-import (
-	"crypto/tls"
-	"crypto/x509"
-	"encoding/pem"
-	"errors"
-	"fmt"
-	"os"
-)
-
-// Options represents the information needed to create client and server TLS configurations.
-type Options struct {
-	CAFile string
-
-	// If either CertFile or KeyFile is empty, Client() will not load them
-	// preventing the client from authenticating to the server.
-	// However, Server() requires them and will error out if they are empty.
-	CertFile string
-	KeyFile  string
-
-	// client-only option
-	InsecureSkipVerify bool
-	// server-only option
-	ClientAuth tls.ClientAuthType
-	// If ExclusiveRootPools is set, then if a CA file is provided, the root pool used for TLS
-	// creds will include exclusively the roots in that CA file.  If no CA file is provided,
-	// the system pool will be used.
-	ExclusiveRootPools bool
-	MinVersion         uint16
-	// If Passphrase is set, it will be used to decrypt a TLS private key
-	// if the key is encrypted.
-	//
-	// Deprecated: Use of encrypted TLS private keys has been deprecated, and
-	// will be removed in a future release. Golang has deprecated support for
-	// legacy PEM encryption (as specified in RFC 1423), as it is insecure by
-	// design (see https://go-review.googlesource.com/c/go/+/264159).
-	Passphrase string
-}
-
-// Extra (server-side) accepted CBC cipher suites - will phase out in the future
-var acceptedCBCCiphers = []uint16{
-	tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
-	tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
-	tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
-	tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
-}
-
-// DefaultServerAcceptedCiphers should be uses by code which already has a crypto/tls
-// options struct but wants to use a commonly accepted set of TLS cipher suites, with
-// known weak algorithms removed.
-var DefaultServerAcceptedCiphers = append(clientCipherSuites, acceptedCBCCiphers...)
-
-// ServerDefault returns a secure-enough TLS configuration for the server TLS configuration.
-func ServerDefault(ops ...func(*tls.Config)) *tls.Config {
-	tlsConfig := &tls.Config{
-		// Avoid fallback by default to SSL protocols < TLS1.2
-		MinVersion:               tls.VersionTLS12,
-		PreferServerCipherSuites: true,
-		CipherSuites:             DefaultServerAcceptedCiphers,
-	}
-
-	for _, op := range ops {
-		op(tlsConfig)
-	}
-
-	return tlsConfig
-}
-
-// ClientDefault returns a secure-enough TLS configuration for the client TLS configuration.
-func ClientDefault(ops ...func(*tls.Config)) *tls.Config {
-	tlsConfig := &tls.Config{
-		// Prefer TLS1.2 as the client minimum
-		MinVersion:   tls.VersionTLS12,
-		CipherSuites: clientCipherSuites,
-	}
-
-	for _, op := range ops {
-		op(tlsConfig)
-	}
-
-	return tlsConfig
-}
-
-// certPool returns an X.509 certificate pool from `caFile`, the certificate file.
-func certPool(caFile string, exclusivePool bool) (*x509.CertPool, error) {
-	// If we should verify the server, we need to load a trusted ca
-	var (
-		certPool *x509.CertPool
-		err      error
-	)
-	if exclusivePool {
-		certPool = x509.NewCertPool()
-	} else {
-		certPool, err = SystemCertPool()
-		if err != nil {
-			return nil, fmt.Errorf("failed to read system certificates: %v", err)
-		}
-	}
-	pemData, err := os.ReadFile(caFile)
-	if err != nil {
-		return nil, fmt.Errorf("could not read CA certificate %q: %v", caFile, err)
-	}
-	if !certPool.AppendCertsFromPEM(pemData) {
-		return nil, fmt.Errorf("failed to append certificates from PEM file: %q", caFile)
-	}
-	return certPool, nil
-}
-
-// allTLSVersions lists all the TLS versions and is used by the code that validates
-// a uint16 value as a TLS version.
-var allTLSVersions = map[uint16]struct{}{
-	tls.VersionTLS10: {},
-	tls.VersionTLS11: {},
-	tls.VersionTLS12: {},
-	tls.VersionTLS13: {},
-}
-
-// isValidMinVersion checks that the input value is a valid tls minimum version
-func isValidMinVersion(version uint16) bool {
-	_, ok := allTLSVersions[version]
-	return ok
-}
-
-// adjustMinVersion sets the MinVersion on `config`, the input configuration.
-// It assumes the current MinVersion on the `config` is the lowest allowed.
-func adjustMinVersion(options Options, config *tls.Config) error {
-	if options.MinVersion > 0 {
-		if !isValidMinVersion(options.MinVersion) {
-			return fmt.Errorf("invalid minimum TLS version: %x", options.MinVersion)
-		}
-		if options.MinVersion < config.MinVersion {
-			return fmt.Errorf("requested minimum TLS version is too low. Should be at-least: %x", config.MinVersion)
-		}
-		config.MinVersion = options.MinVersion
-	}
-
-	return nil
-}
-
-// IsErrEncryptedKey returns true if the 'err' is an error of incorrect
-// password when trying to decrypt a TLS private key.
-//
-// Deprecated: Use of encrypted TLS private keys has been deprecated, and
-// will be removed in a future release. Golang has deprecated support for
-// legacy PEM encryption (as specified in RFC 1423), as it is insecure by
-// design (see https://go-review.googlesource.com/c/go/+/264159).
-func IsErrEncryptedKey(err error) bool {
-	return errors.Is(err, x509.IncorrectPasswordError)
-}
-
-// getPrivateKey returns the private key in 'keyBytes', in PEM-encoded format.
-// If the private key is encrypted, 'passphrase' is used to decrypted the
-// private key.
-func getPrivateKey(keyBytes []byte, passphrase string) ([]byte, error) {
-	// this section makes some small changes to code from notary/tuf/utils/x509.go
-	pemBlock, _ := pem.Decode(keyBytes)
-	if pemBlock == nil {
-		return nil, fmt.Errorf("no valid private key found")
-	}
-
-	var err error
-	if x509.IsEncryptedPEMBlock(pemBlock) { //nolint:staticcheck // Ignore SA1019 (IsEncryptedPEMBlock is deprecated)
-		keyBytes, err = x509.DecryptPEMBlock(pemBlock, []byte(passphrase)) //nolint:staticcheck // Ignore SA1019 (DecryptPEMBlock is deprecated)
-		if err != nil {
-			return nil, fmt.Errorf("private key is encrypted, but could not decrypt it: %w", err)
-		}
-		keyBytes = pem.EncodeToMemory(&pem.Block{Type: pemBlock.Type, Bytes: keyBytes})
-	}
-
-	return keyBytes, nil
-}
-
-// getCert returns a Certificate from the CertFile and KeyFile in 'options',
-// if the key is encrypted, the Passphrase in 'options' will be used to
-// decrypt it.
-func getCert(options Options) ([]tls.Certificate, error) {
-	if options.CertFile == "" && options.KeyFile == "" {
-		return nil, nil
-	}
-
-	cert, err := os.ReadFile(options.CertFile)
-	if err != nil {
-		return nil, err
-	}
-
-	prKeyBytes, err := os.ReadFile(options.KeyFile)
-	if err != nil {
-		return nil, err
-	}
-
-	prKeyBytes, err = getPrivateKey(prKeyBytes, options.Passphrase)
-	if err != nil {
-		return nil, err
-	}
-
-	tlsCert, err := tls.X509KeyPair(cert, prKeyBytes)
-	if err != nil {
-		return nil, err
-	}
-
-	return []tls.Certificate{tlsCert}, nil
-}
-
-// Client returns a TLS configuration meant to be used by a client.
-func Client(options Options) (*tls.Config, error) {
-	tlsConfig := ClientDefault()
-	tlsConfig.InsecureSkipVerify = options.InsecureSkipVerify
-	if !options.InsecureSkipVerify && options.CAFile != "" {
-		CAs, err := certPool(options.CAFile, options.ExclusiveRootPools)
-		if err != nil {
-			return nil, err
-		}
-		tlsConfig.RootCAs = CAs
-	}
-
-	tlsCerts, err := getCert(options)
-	if err != nil {
-		return nil, fmt.Errorf("could not load X509 key pair: %w", err)
-	}
-	tlsConfig.Certificates = tlsCerts
-
-	if err := adjustMinVersion(options, tlsConfig); err != nil {
-		return nil, err
-	}
-
-	return tlsConfig, nil
-}
-
-// Server returns a TLS configuration meant to be used by a server.
-func Server(options Options) (*tls.Config, error) {
-	tlsConfig := ServerDefault()
-	tlsConfig.ClientAuth = options.ClientAuth
-	tlsCert, err := tls.LoadX509KeyPair(options.CertFile, options.KeyFile)
-	if err != nil {
-		if os.IsNotExist(err) {
-			return nil, fmt.Errorf("could not load X509 key pair (cert: %q, key: %q): %v", options.CertFile, options.KeyFile, err)
-		}
-		return nil, fmt.Errorf("error reading X509 key pair - make sure the key is not encrypted (cert: %q, key: %q): %v", options.CertFile, options.KeyFile, err)
-	}
-	tlsConfig.Certificates = []tls.Certificate{tlsCert}
-	if options.ClientAuth >= tls.VerifyClientCertIfGiven && options.CAFile != "" {
-		CAs, err := certPool(options.CAFile, options.ExclusiveRootPools)
-		if err != nil {
-			return nil, err
-		}
-		tlsConfig.ClientCAs = CAs
-	}
-
-	if err := adjustMinVersion(options, tlsConfig); err != nil {
-		return nil, err
-	}
-
-	return tlsConfig, nil
-}
diff --git a/vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go b/vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go
deleted file mode 100644
index a82f9fa52..000000000
--- a/vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Package tlsconfig provides primitives to retrieve secure-enough TLS configurations for both clients and servers.
-package tlsconfig
-
-import (
-	"crypto/tls"
-)
-
-// Client TLS cipher suites (dropping CBC ciphers for client preferred suite set)
-var clientCipherSuites = []uint16{
-	tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
-	tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
-	tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
-	tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
-}
diff --git a/vendor/github.com/tonistiigi/fsutil/copy/copy.go b/vendor/github.com/tonistiigi/fsutil/copy/copy.go
index f24e77f88..aef1a1461 100644
--- a/vendor/github.com/tonistiigi/fsutil/copy/copy.go
+++ b/vendor/github.com/tonistiigi/fsutil/copy/copy.go
@@ -18,6 +18,8 @@ import (
 	"github.com/tonistiigi/fsutil"
 )
 
+const defaultDirectoryMode = 0755
+
 var bufferPool = &sync.Pool{
 	New: func() interface{} {
 		buffer := make([]byte, 32*1024)
@@ -80,7 +82,11 @@ func Copy(ctx context.Context, srcRoot, src, dstRoot, dst string, opts ...Opt) e
 		if err != nil {
 			return err
 		}
-		if createdDirs, err := MkdirAll(ensureDstPath, 0755, ci.Chown, ci.Utime); err != nil {
+		perm := defaultDirectoryMode
+		if ci.Mode != nil {
+			perm = *ci.Mode
+		}
+		if createdDirs, err := MkdirAll(ensureDstPath, os.FileMode(perm), ci.Chown, ci.Utime); err != nil {
 			return err
 		} else {
 			defer fixCreatedParentDirs(createdDirs, ci.Utime)
@@ -159,7 +165,11 @@ func (c *copier) prepareTargetDir(srcFollowed, src, destPath string, copyDirCont
 		target = destPath
 	}
 	var createdDirs []string
-	if dirs, err := MkdirAll(target, 0755, c.chown, c.utime); err != nil {
+	mode := defaultDirectoryMode
+	if c.mode != nil {
+		mode = *c.mode
+	}
+	if dirs, err := MkdirAll(target, os.FileMode(mode), c.chown, c.utime); err != nil {
 		return "", nil, err
 	} else {
 		createdDirs = dirs
@@ -335,13 +345,13 @@ func (c *copier) copy(ctx context.Context, src, srcComponents, target string, ov
 	if srcComponents != "" {
 		matchesIncludePattern := false
 		matchesExcludePattern := false
-		matchesIncludePattern, includeMatchInfo, err = c.include(srcComponents, fi, parentIncludeMatchInfo)
+		matchesIncludePattern, includeMatchInfo, err = c.include(srcComponents, parentIncludeMatchInfo)
 		if err != nil {
 			return err
 		}
 		include = matchesIncludePattern
 
-		matchesExcludePattern, excludeMatchInfo, err = c.exclude(srcComponents, fi, parentExcludeMatchInfo)
+		matchesExcludePattern, excludeMatchInfo, err = c.exclude(srcComponents, parentExcludeMatchInfo)
 		if err != nil {
 			return err
 		}
@@ -351,11 +361,11 @@ func (c *copier) copy(ctx context.Context, src, srcComponents, target string, ov
 	}
 
 	if include {
-		if err := c.removeTargetIfNeeded(src, target, fi, targetFi); err != nil {
+		if err := c.removeTargetIfNeeded(target, fi, targetFi); err != nil {
 			return err
 		}
 
-		if err := c.createParentDirs(src, srcComponents, target, overwriteTargetMetadata); err != nil {
+		if err := c.createParentDirs(src, overwriteTargetMetadata); err != nil {
 			return err
 		}
 	}
@@ -447,7 +457,7 @@ func (c *copier) notifyChange(target string, fi os.FileInfo) error {
 	return nil
 }
 
-func (c *copier) include(path string, fi os.FileInfo, parentIncludeMatchInfo patternmatcher.MatchInfo) (bool, patternmatcher.MatchInfo, error) {
+func (c *copier) include(path string, parentIncludeMatchInfo patternmatcher.MatchInfo) (bool, patternmatcher.MatchInfo, error) {
 	if c.includePatternMatcher == nil {
 		return true, patternmatcher.MatchInfo{}, nil
 	}
@@ -459,7 +469,7 @@ func (c *copier) include(path string, fi os.FileInfo, parentIncludeMatchInfo pat
 	return m, matchInfo, nil
 }
 
-func (c *copier) exclude(path string, fi os.FileInfo, parentExcludeMatchInfo patternmatcher.MatchInfo) (bool, patternmatcher.MatchInfo, error) {
+func (c *copier) exclude(path string, parentExcludeMatchInfo patternmatcher.MatchInfo) (bool, patternmatcher.MatchInfo, error) {
 	if c.excludePatternMatcher == nil {
 		return false, patternmatcher.MatchInfo{}, nil
 	}
@@ -471,7 +481,7 @@ func (c *copier) exclude(path string, fi os.FileInfo, parentExcludeMatchInfo pat
 	return m, matchInfo, nil
 }
 
-func (c *copier) removeTargetIfNeeded(src, target string, srcFi, targetFi os.FileInfo) error {
+func (c *copier) removeTargetIfNeeded(target string, srcFi, targetFi os.FileInfo) error {
 	if !c.alwaysReplaceExistingDestPaths {
 		return nil
 	}
@@ -488,7 +498,7 @@ func (c *copier) removeTargetIfNeeded(src, target string, srcFi, targetFi os.Fil
 
 // Delayed creation of parent directories when a file or dir matches an include
 // pattern.
-func (c *copier) createParentDirs(src, srcComponents, target string, overwriteTargetMetadata bool) error {
+func (c *copier) createParentDirs(src string, overwriteTargetMetadata bool) error {
 	for i, parentDir := range c.parentDirs {
 		if parentDir.copied {
 			continue
@@ -502,7 +512,7 @@ func (c *copier) createParentDirs(src, srcComponents, target string, overwriteTa
 			return errors.Errorf("%s is not a directory", parentDir.srcPath)
 		}
 
-		created, err := copyDirectoryOnly(parentDir.srcPath, parentDir.dstPath, fi, overwriteTargetMetadata)
+		created, err := copyDirectoryOnly(parentDir.dstPath, fi, overwriteTargetMetadata)
 		if err != nil {
 			return err
 		}
@@ -549,7 +559,7 @@ func (c *copier) copyDirectory(
 	// encounter a/b/c.
 	if include {
 		var err error
-		created, err = copyDirectoryOnly(src, dst, stat, overwriteTargetMetadata)
+		created, err = copyDirectoryOnly(dst, stat, overwriteTargetMetadata)
 		if err != nil {
 			return created, err
 		}
@@ -586,7 +596,7 @@ func (c *copier) copyDirectory(
 	return created, nil
 }
 
-func copyDirectoryOnly(src, dst string, stat os.FileInfo, overwriteTargetMetadata bool) (bool, error) {
+func copyDirectoryOnly(dst string, stat os.FileInfo, overwriteTargetMetadata bool) (bool, error) {
 	if st, err := os.Lstat(dst); err != nil {
 		if !os.IsNotExist(err) {
 			return false, err
diff --git a/vendor/github.com/tonistiigi/fsutil/copy/copy_linux.go b/vendor/github.com/tonistiigi/fsutil/copy/copy_linux.go
index 9b046c539..3df11d6a3 100644
--- a/vendor/github.com/tonistiigi/fsutil/copy/copy_linux.go
+++ b/vendor/github.com/tonistiigi/fsutil/copy/copy_linux.go
@@ -15,7 +15,7 @@ func getUIDGID(fi os.FileInfo) (uid, gid int) {
 	return int(st.Uid), int(st.Gid)
 }
 
-func (c *copier) copyFileInfo(fi os.FileInfo, src, name string) error {
+func (c *copier) copyFileInfo(fi os.FileInfo, _, name string) error {
 	chown := c.chown
 	uid, gid := getUIDGID(fi)
 	old := &User{UID: uid, GID: gid}
diff --git a/vendor/github.com/tonistiigi/fsutil/copy/copy_unix.go b/vendor/github.com/tonistiigi/fsutil/copy/copy_unix.go
index df1cdd07a..5407c16e4 100644
--- a/vendor/github.com/tonistiigi/fsutil/copy/copy_unix.go
+++ b/vendor/github.com/tonistiigi/fsutil/copy/copy_unix.go
@@ -16,7 +16,7 @@ func getUIDGID(fi os.FileInfo) (uid, gid int) {
 	return int(st.Uid), int(st.Gid)
 }
 
-func (c *copier) copyFileInfo(fi os.FileInfo, src, name string) error {
+func (c *copier) copyFileInfo(fi os.FileInfo, _, name string) error {
 	chown := c.chown
 	uid, gid := getUIDGID(fi)
 	old := &User{UID: uid, GID: gid}
diff --git a/vendor/github.com/tonistiigi/fsutil/copy/copy_windows.go b/vendor/github.com/tonistiigi/fsutil/copy/copy_windows.go
index a049565e0..45b4f210a 100644
--- a/vendor/github.com/tonistiigi/fsutil/copy/copy_windows.go
+++ b/vendor/github.com/tonistiigi/fsutil/copy/copy_windows.go
@@ -13,7 +13,7 @@ const (
 	seTakeOwnershipPrivilege = "SeTakeOwnershipPrivilege"
 )
 
-func getUIDGID(fi os.FileInfo) (uid, gid int) {
+func getUIDGID(_ os.FileInfo) (uid, gid int) {
 	return 0, 0
 }
 
@@ -119,10 +119,10 @@ func copyFileContent(dst, src *os.File) error {
 	return err
 }
 
-func copyXAttrs(dst, src string, xeh XAttrErrorHandler) error {
+func copyXAttrs(_, _ string, _ XAttrErrorHandler) error {
 	return nil
 }
 
-func copyDevice(dst string, fi os.FileInfo) error {
+func copyDevice(_ string, _ os.FileInfo) error {
 	return errors.New("device copy not supported")
 }
diff --git a/vendor/github.com/tonistiigi/fsutil/copy/hardlink_windows.go b/vendor/github.com/tonistiigi/fsutil/copy/hardlink_windows.go
index ad8845a7f..ce081d680 100644
--- a/vendor/github.com/tonistiigi/fsutil/copy/hardlink_windows.go
+++ b/vendor/github.com/tonistiigi/fsutil/copy/hardlink_windows.go
@@ -2,6 +2,6 @@ package fs
 
 import "os"
 
-func getLinkInfo(fi os.FileInfo) (uint64, bool) {
+func getLinkInfo(_ os.FileInfo) (uint64, bool) {
 	return 0, false
 }
diff --git a/vendor/github.com/tonistiigi/fsutil/diskwriter_windows.go b/vendor/github.com/tonistiigi/fsutil/diskwriter_windows.go
index 2dd3f7d05..d278add87 100644
--- a/vendor/github.com/tonistiigi/fsutil/diskwriter_windows.go
+++ b/vendor/github.com/tonistiigi/fsutil/diskwriter_windows.go
@@ -20,7 +20,7 @@ func rewriteMetadata(p string, stat *types.Stat) error {
 
 // handleTarTypeBlockCharFifo is an OS-specific helper function used by
 // createTarFile to handle the following types of header: Block; Char; Fifo
-func handleTarTypeBlockCharFifo(path string, stat *types.Stat) error {
+func handleTarTypeBlockCharFifo(_ string, _ *types.Stat) error {
 	return errors.New("Not implemented on windows")
 }
 
diff --git a/vendor/github.com/tonistiigi/fsutil/docker-bake.hcl b/vendor/github.com/tonistiigi/fsutil/docker-bake.hcl
index ea73bd208..c70ad2b6f 100644
--- a/vendor/github.com/tonistiigi/fsutil/docker-bake.hcl
+++ b/vendor/github.com/tonistiigi/fsutil/docker-bake.hcl
@@ -60,7 +60,15 @@ target "test-noroot" {
   output = ["${DESTDIR}/coverage"]
 }
 
-target "lint" {
+group "lint" {
+  targets = ["lint-golangci", "lint-gopls"]
+}
+
+group "lint-cross" {
+  targets = ["lint-golangci-cross", "lint-gopls-cross"]
+}
+
+target "lint-golangci" {
   inherits = ["_common"]
   dockerfile = "./hack/dockerfiles/lint.Dockerfile"
   output = ["type=cacheonly"]
@@ -69,8 +77,17 @@ target "lint" {
   }
 }
 
-target "lint-cross" {
-  inherits = ["lint", "_platforms"]
+target "lint-gopls" {
+  inherits = ["lint-golangci"]
+  target = "gopls-analyze"
+}
+
+target "lint-golangci-cross" {
+  inherits = ["lint-golangci", "_platforms"]
+}
+
+target "lint-gopls-cross" {
+  inherits = ["lint-gopls", "_platforms"]
 }
 
 target "validate-generated-files" {
diff --git a/vendor/github.com/tonistiigi/go-actions-cache/cache_v2.go b/vendor/github.com/tonistiigi/go-actions-cache/cache_v2.go
index adbcda30e..6bf7ec3c0 100644
--- a/vendor/github.com/tonistiigi/go-actions-cache/cache_v2.go
+++ b/vendor/github.com/tonistiigi/go-actions-cache/cache_v2.go
@@ -5,7 +5,10 @@ import (
 	"context"
 	"encoding/json"
 	"io"
+	"time"
 
+	"github.com/Azure/azure-sdk-for-go/sdk/azcore"
+	"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
 	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob"
 	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob"
 	"github.com/pkg/errors"
@@ -45,8 +48,18 @@ func (c *Cache) reserveV2(ctx context.Context, key string) (string, error) {
 	return cr.SignedUploadURL, nil
 }
 
+var azureOptions = &blockblob.ClientOptions{
+	ClientOptions: azcore.ClientOptions{
+		Retry: policy.RetryOptions{
+			MaxRetries:    10,
+			MaxRetryDelay: 2 * time.Minute,
+			RetryDelay:    10 * time.Second,
+		},
+	},
+}
+
 func (c *Cache) uploadV2(ctx context.Context, url string, b Blob) error {
-	client, err := blockblob.NewClientWithNoCredential(url, nil)
+	client, err := blockblob.NewClientWithNoCredential(url, azureOptions)
 	if err != nil {
 		return errors.WithStack(err)
 	}
@@ -62,7 +75,7 @@ func (c *Cache) uploadV2(ctx context.Context, url string, b Blob) error {
 
 func (ce *Entry) downloadV2(ctx context.Context) ReaderAtCloser {
 	return toReaderAtCloser(func(offset int64) (io.ReadCloser, error) {
-		client, err := blockblob.NewClientWithNoCredential(ce.URL, nil)
+		client, err := blockblob.NewClientWithNoCredential(ce.URL, azureOptions)
 		if err != nil {
 			return nil, errors.WithStack(err)
 		}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 5f5ee4e5d..b2b0af73e 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -495,28 +495,8 @@ github.com/docker/cli/cli/config/types
 github.com/docker/cli/cli/connhelper/commandconn
 # github.com/docker/docker v27.5.1+incompatible
 ## explicit
-github.com/docker/docker/api
-github.com/docker/docker/api/types
-github.com/docker/docker/api/types/blkiodev
-github.com/docker/docker/api/types/checkpoint
-github.com/docker/docker/api/types/container
-github.com/docker/docker/api/types/events
-github.com/docker/docker/api/types/filters
-github.com/docker/docker/api/types/image
-github.com/docker/docker/api/types/mount
-github.com/docker/docker/api/types/network
-github.com/docker/docker/api/types/registry
-github.com/docker/docker/api/types/strslice
-github.com/docker/docker/api/types/swarm
-github.com/docker/docker/api/types/swarm/runtime
-github.com/docker/docker/api/types/system
-github.com/docker/docker/api/types/time
-github.com/docker/docker/api/types/versions
-github.com/docker/docker/api/types/volume
-github.com/docker/docker/client
 github.com/docker/docker/errdefs
 github.com/docker/docker/internal/mounttree
-github.com/docker/docker/internal/multierror
 github.com/docker/docker/internal/unshare
 github.com/docker/docker/libnetwork/internal/resolvconf
 github.com/docker/docker/libnetwork/resolvconf
@@ -534,8 +514,6 @@ github.com/docker/docker-credential-helpers/credentials
 # github.com/docker/go-connections v0.5.0
 ## explicit; go 1.18
 github.com/docker/go-connections/nat
-github.com/docker/go-connections/sockets
-github.com/docker/go-connections/tlsconfig
 # github.com/docker/go-metrics v0.0.1
 ## explicit; go 1.11
 github.com/docker/go-metrics
@@ -679,8 +657,6 @@ github.com/moby/sys/user
 # github.com/moby/sys/userns v0.1.0
 ## explicit; go 1.21
 github.com/moby/sys/userns
-# github.com/moby/term v0.5.2
-## explicit; go 1.18
 # github.com/morikuni/aec v1.0.0
 ## explicit
 github.com/morikuni/aec
@@ -804,12 +780,12 @@ github.com/syndtr/gocapability/capability
 # github.com/tonistiigi/dchapes-mode v0.0.0-20241001053921-ca0759fec205
 ## explicit; go 1.21
 github.com/tonistiigi/dchapes-mode
-# github.com/tonistiigi/fsutil v0.0.0-20250113203817-b14e27f4135a
+# github.com/tonistiigi/fsutil v0.0.0-20250227023350-13604323a291
 ## explicit; go 1.21
 github.com/tonistiigi/fsutil
 github.com/tonistiigi/fsutil/copy
 github.com/tonistiigi/fsutil/types
-# github.com/tonistiigi/go-actions-cache v0.0.0-20250219102945-1a5174abd055
+# github.com/tonistiigi/go-actions-cache v0.0.0-20250228231703-3e9a6642607f
 ## explicit; go 1.22
 github.com/tonistiigi/go-actions-cache
 # github.com/tonistiigi/go-archvariant v1.0.0
@@ -1148,7 +1124,7 @@ kernel.org/pub/linux/libs/security/libcap/psx
 ## explicit; go 1.12
 sigs.k8s.io/yaml
 sigs.k8s.io/yaml/goyaml.v2
-# tags.cncf.io/container-device-interface v0.8.0
+# tags.cncf.io/container-device-interface v0.8.1
 ## explicit; go 1.20
 tags.cncf.io/container-device-interface/internal/validation
 tags.cncf.io/container-device-interface/internal/validation/k8s
diff --git a/vendor/tags.cncf.io/container-device-interface/pkg/cdi/cache.go b/vendor/tags.cncf.io/container-device-interface/pkg/cdi/cache.go
index c2f7fe346..9afa4b182 100644
--- a/vendor/tags.cncf.io/container-device-interface/pkg/cdi/cache.go
+++ b/vendor/tags.cncf.io/container-device-interface/pkg/cdi/cache.go
@@ -564,6 +564,14 @@ func (w *watch) update(dirErrors map[string]error, removed ...string) bool {
 		update bool
 	)
 
+	// If we failed to create an fsnotify.Watcher we have a nil watcher here
+	// (but with autoRefresh left on). One known case when this can happen is
+	// if we have too many open files. In that case we always return true and
+	// force a refresh.
+	if w.watcher == nil {
+		return true
+	}
+
 	for dir, ok = range w.tracked {
 		if ok {
 			continue



Test patch:
diff --git a/client/client_test.go b/client/client_test.go
index f266b5bac..5dd67d2c8 100644
--- a/client/client_test.go
+++ b/client/client_test.go
@@ -105,6 +105,8 @@ var allTests = []func(t *testing.T, sb integration.Sandbox){
 	testBuildMultiMount,
 	testBuildHTTPSource,
 	testBuildHTTPSourceEtagScope,
+	testBuildHTTPSourceAuthHeaderSecret,
+	testBuildHTTPSourceHeader,
 	testBuildPushAndValidate,
 	testBuildExportWithUncompressed,
 	testBuildExportScratch,
@@ -1570,15 +1572,22 @@ func testLocalSymlinkEscape(t *testing.T, sb integration.Sandbox) {
 }
 
 func testRelativeWorkDir(t *testing.T, sb integration.Sandbox) {
-	requiresLinux(t)
 	c, err := New(sb.Context(), sb.Address())
 	require.NoError(t, err)
 	defer c.Close()
 
-	pwd := llb.Image("docker.io/library/busybox:latest").
+	imgName := integration.UnixOrWindows(
+		"docker.io/library/busybox:latest",
+		"mcr.microsoft.com/windows/nanoserver:ltsc2022",
+	)
+	cmdStr := integration.UnixOrWindows(
+		`sh -c "pwd > /out/pwd"`,
+		`cmd /C "cd > /out/pwd"`,
+	)
+	pwd := llb.Image(imgName).
 		Dir("test1").
 		Dir("test2").
-		Run(llb.Shlex(`sh -c "pwd > /out/pwd"`)).
+		Run(llb.Shlex(cmdStr)).
 		AddMount("/out", llb.Scratch())
 
 	def, err := pwd.Marshal(sb.Context())
@@ -1598,22 +1607,32 @@ func testRelativeWorkDir(t *testing.T, sb integration.Sandbox) {
 
 	dt, err := os.ReadFile(filepath.Join(destDir, "pwd"))
 	require.NoError(t, err)
-	require.Equal(t, []byte("/test1/test2\n"), dt)
+	pathStr := integration.UnixOrWindows(
+		"/test1/test2\n",
+		"C:\\test1\\test2\r\n",
+	)
+	require.Equal(t, []byte(pathStr), dt)
 }
 
 // TODO: remove this test once `client.SolveOpt.LocalDirs`, now marked as deprecated, is removed.
 // For more context on this test, please check:
 // https://github.com/moby/buildkit/pull/4583#pullrequestreview-1847043452
 func testSolverOptLocalDirsStillWorks(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
-
 	c, err := New(sb.Context(), sb.Address())
 	require.NoError(t, err)
 	defer c.Close()
 
-	out := llb.Image("docker.io/library/busybox:latest").
+	imgName := integration.UnixOrWindows(
+		"docker.io/library/busybox:latest",
+		"mcr.microsoft.com/windows/nanoserver:ltsc2022",
+	)
+	cmdStr := integration.UnixOrWindows(
+		`sh -c "/bin/rev < input.txt > /out/output.txt"`,
+		`cmd /C "type input.txt > /out/output.txt"`,
+	)
+	out := llb.Image(imgName).
 		File(llb.Copy(llb.Local("mylocal"), "input.txt", "input.txt")).
-		Run(llb.Shlex(`sh -c "/bin/rev < input.txt > /out/output.txt"`)).
+		Run(llb.Shlex(cmdStr)).
 		AddMount(`/out`, llb.Scratch())
 
 	def, err := out.Marshal(sb.Context())
@@ -1641,7 +1660,12 @@ func testSolverOptLocalDirsStillWorks(t *testing.T, sb integration.Sandbox) {
 
 	dt, err := os.ReadFile(filepath.Join(destDir.Name, "output.txt"))
 	require.NoError(t, err)
-	require.Equal(t, []byte("dlroW olleH"), dt)
+	// not reversed on Windows since there's no handy rev utility
+	revStr := integration.UnixOrWindows(
+		"dlroW olleH",
+		"Hello World",
+	)
+	require.Equal(t, []byte(revStr), dt)
 }
 
 func testFileOpMkdirMkfile(t *testing.T, sb integration.Sandbox) {
@@ -2987,6 +3011,86 @@ func testBuildHTTPSourceEtagScope(t *testing.T, sb integration.Sandbox) {
 	require.NoError(t, os.RemoveAll(filepath.Join(out2, "foo")))
 }
 
+func testBuildHTTPSourceAuthHeaderSecret(t *testing.T, sb integration.Sandbox) {
+	c, err := New(sb.Context(), sb.Address())
+	require.NoError(t, err)
+	defer c.Close()
+
+	modTime := time.Now().Add(-24 * time.Hour) // avoid false positive with current time
+
+	resp := httpserver.Response{
+		Etag:         identity.NewID(),
+		Content:      []byte("content1"),
+		LastModified: &modTime,
+	}
+
+	server := httpserver.NewTestServer(map[string]httpserver.Response{
+		"/foo": resp,
+	})
+	defer server.Close()
+
+	st := llb.HTTP(server.URL+"/foo", llb.AuthHeaderSecret("http-secret"))
+
+	def, err := st.Marshal(sb.Context())
+	require.NoError(t, err)
+
+	_, err = c.Solve(
+		sb.Context(),
+		def,
+		SolveOpt{
+			Session: []session.Attachable{secretsprovider.FromMap(map[string][]byte{
+				"http-secret": []byte("Bearer foo"),
+			})},
+		},
+		nil,
+	)
+	require.NoError(t, err)
+
+	allReqs := server.Stats("/foo").Requests
+	require.Equal(t, 1, len(allReqs))
+	require.Equal(t, http.MethodGet, allReqs[0].Method)
+	require.Equal(t, "Bearer foo", allReqs[0].Header.Get("Authorization"))
+}
+
+func testBuildHTTPSourceHeader(t *testing.T, sb integration.Sandbox) {
+	c, err := New(sb.Context(), sb.Address())
+	require.NoError(t, err)
+	defer c.Close()
+
+	modTime := time.Now().Add(-24 * time.Hour) // avoid falso positive with current time
+
+	resp := httpserver.Response{
+		Etag:         identity.NewID(),
+		Content:      []byte("content1"),
+		LastModified: &modTime,
+	}
+
+	server := httpserver.NewTestServer(map[string]httpserver.Response{
+		"/foo": resp,
+	})
+	defer server.Close()
+
+	st := llb.HTTP(
+		server.URL+"/foo",
+		llb.Header(llb.HTTPHeader{
+			Accept:    "application/vnd.foo",
+			UserAgent: "fooagent",
+		}),
+	)
+
+	def, err := st.Marshal(sb.Context())
+	require.NoError(t, err)
+
+	_, err = c.Solve(sb.Context(), def, SolveOpt{}, nil)
+	require.NoError(t, err)
+
+	allReqs := server.Stats("/foo").Requests
+	require.Equal(t, 1, len(allReqs))
+	require.Equal(t, http.MethodGet, allReqs[0].Method)
+	require.Equal(t, "application/vnd.foo", allReqs[0].Header.Get("accept"))
+	require.Equal(t, "fooagent", allReqs[0].Header.Get("user-agent"))
+}
+
 func testResolveAndHosts(t *testing.T, sb integration.Sandbox) {
 	requiresLinux(t)
 	c, err := New(sb.Context(), sb.Address())
@@ -6838,12 +6942,19 @@ func testCacheMountNoCache(t *testing.T, sb integration.Sandbox) {
 }
 
 func testCopyFromEmptyImage(t *testing.T, sb integration.Sandbox) {
-	requiresLinux(t)
 	c, err := New(sb.Context(), sb.Address())
 	require.NoError(t, err)
 	defer c.Close()
 
-	for _, image := range []llb.State{llb.Scratch(), llb.Image("tonistiigi/test:nolayers")} {
+	// On Windows, the error messages are different for the Scratch image
+	// (which is coming from the OS). While the one for the no-layers image
+	// is being returned by Buildkit (in unix style).
+	winErrMsgs := []string{
+		"foo: The system cannot find the file specified", // for llb.Scratch()
+		"/foo: no such file or directory",                // for tonistiigi/test:nolayers
+	}
+
+	for i, image := range []llb.State{llb.Scratch(), llb.Image("tonistiigi/test:nolayers")} {
 		st := llb.Scratch().File(llb.Copy(image, "/", "/"))
 		def, err := st.Marshal(sb.Context())
 		require.NoError(t, err)
@@ -6857,11 +6968,23 @@ func testCopyFromEmptyImage(t *testing.T, sb integration.Sandbox) {
 
 		_, err = c.Solve(sb.Context(), def, SolveOpt{}, nil)
 		require.Error(t, err)
-		require.Contains(t, err.Error(), "/foo: no such file or directory")
+		errMsg := integration.UnixOrWindows(
+			"/foo: no such file or directory",
+			winErrMsgs[i],
+		)
+		require.Contains(t, err.Error(), errMsg)
 
-		busybox := llb.Image("busybox:latest")
+		imgName := integration.UnixOrWindows(
+			"busybox:latest",
+			"mcr.microsoft.com/windows/nanoserver:ltsc2022",
+		)
+		busybox := llb.Image(imgName)
 
-		out := busybox.Run(llb.Shlex(`sh -e -c '[ $(ls /scratch | wc -l) = '0' ]'`))
+		cmdStr := integration.UnixOrWindows(
+			`sh -e -c '[ $(ls /scratch | wc -l) = '0' ]'`,
+			`cmd /C dir \scratch`,
+		)
+		out := busybox.Run(llb.Shlex(cmdStr))
 		out.AddMount("/scratch", image, llb.Readonly)
 
 		def, err = out.Marshal(sb.Context())
diff --git a/frontend/dockerfile/dockerfile_mount_test.go b/frontend/dockerfile/dockerfile_mount_test.go
index 0423145ea..367fce785 100644
--- a/frontend/dockerfile/dockerfile_mount_test.go
+++ b/frontend/dockerfile/dockerfile_mount_test.go
@@ -36,13 +36,20 @@ func init() {
 }
 
 func testMountContext(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
 
-	dockerfile := []byte(`
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
 FROM busybox
 RUN --mount=target=/context [ "$(cat /context/testfile)" == "contents0" ]
-`)
+`,
+		`
+FROM nanoserver
+USER ContainerAdministrator
+RUN --mount=target=/context  cmd /V:on /C "set /p tfcontent=<context\testfile \
+	& if !tfcontent! NEQ contents0 (exit 1)"
+`,
+	))
 
 	dir := integration.Tmpdir(
 		t,
@@ -92,13 +99,18 @@ RUN [ ! -f /mytmp/foo ]
 }
 
 func testMountInvalid(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
 
-	dockerfile := []byte(`
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
 FROM scratch
 RUN --mont=target=/mytmp,type=tmpfs /bin/true
-`)
+`,
+		`
+FROM nanoserver
+RUN --mont=target=/mytmp,type=tmpfs echo 1
+`,
+	))
 
 	dir := integration.Tmpdir(
 		t,
@@ -119,10 +131,16 @@ RUN --mont=target=/mytmp,type=tmpfs /bin/true
 	require.Contains(t, err.Error(), "unknown flag: --mont")
 	require.Contains(t, err.Error(), "did you mean mount?")
 
-	dockerfile = []byte(`
+	dockerfile = []byte(integration.UnixOrWindows(
+		`
 	FROM scratch
 	RUN --mount=typ=tmpfs /bin/true
-	`)
+	`,
+		`
+	FROM nanoserver
+	RUN --mount=typ=tmpfs echo 1
+	`,
+	))
 
 	dir = integration.Tmpdir(
 		t,
@@ -139,10 +157,16 @@ RUN --mont=target=/mytmp,type=tmpfs /bin/true
 	require.Contains(t, err.Error(), "unexpected key 'typ'")
 	require.Contains(t, err.Error(), "did you mean type?")
 
-	dockerfile = []byte(`
+	dockerfile = []byte(integration.UnixOrWindows(
+		`
 	FROM scratch
 	RUN --mount=type=tmp /bin/true
-	`)
+	`,
+		`
+	FROM nanoserver
+	RUN --mount=type=tmp echo 1
+	`,
+	))
 
 	dir = integration.Tmpdir(
 		t,
@@ -161,10 +185,10 @@ RUN --mont=target=/mytmp,type=tmpfs /bin/true
 }
 
 func testMountRWCache(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
 
-	dockerfile := []byte(`
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
 from busybox AS build
 copy cachebust /
 run mkdir out && echo foo > out/foo
@@ -174,7 +198,20 @@ RUN --mount=from=build,src=out,target=/out,rw touch /out/bar && cat /dev/urandom
 
 from scratch
 COPY --from=second /unique /unique
-`)
+`,
+		`
+FROM nanoserver AS build
+COPY cachebust /
+RUN mkdir out && echo foo> out\foo
+
+FROM nanoserver AS second
+USER ContainerAdministrator
+RUN --mount=from=build,src=out,target=/out,rw echo %RANDOM% > \unique
+
+FROM nanoserver
+COPY --from=second /unique /unique
+`,
+	))
 
 	dir := integration.Tmpdir(
 		t,
@@ -261,15 +298,23 @@ RUN --mount=type=cache,target=/mycache,uid=1001,gid=1002,mode=0751 [ "$(stat -c
 }
 
 func testCacheMountDefaultID(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
 
-	dockerfile := []byte(`
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
 FROM busybox
 RUN --mount=type=cache,target=/mycache touch /mycache/foo
 RUN --mount=type=cache,target=/mycache2 [ ! -f /mycache2/foo ]
 RUN --mount=type=cache,target=/mycache [ -f /mycache/foo ]
-`)
+`,
+		`
+FROM nanoserver
+USER ContainerAdministrator
+RUN --mount=type=cache,target=/mycache echo hello > \mycache\foo
+RUN --mount=type=cache,target=/mycache2 IF NOT EXIST C:\mycache2\foo (exit 0) ELSE (exit 1)
+RUN --mount=type=cache,target=/mycache dir \mycache\foo
+`,
+	))
 
 	dir := integration.Tmpdir(
 		t,
@@ -290,15 +335,23 @@ RUN --mount=type=cache,target=/mycache [ -f /mycache/foo ]
 }
 
 func testMountEnvVar(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
 
-	dockerfile := []byte(`
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
 FROM busybox
 ENV SOME_PATH=/mycache
 RUN --mount=type=cache,target=/mycache touch /mycache/foo
 RUN --mount=type=cache,target=$SOME_PATH [ -f $SOME_PATH/foo ]
-`)
+`,
+		`
+FROM nanoserver
+USER ContainerAdministrator
+ENV SOME_PATH=mycache
+RUN --mount=type=cache,target=/mycache echo hello > \mycache\foo
+RUN --mount=type=cache,target=/$SOME_PATH dir %SOME_PATH%\foo
+`,
+	))
 
 	dir := integration.Tmpdir(
 		t,
@@ -319,15 +372,23 @@ RUN --mount=type=cache,target=$SOME_PATH [ -f $SOME_PATH/foo ]
 }
 
 func testMountArg(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
 
-	dockerfile := []byte(`
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
 FROM busybox
 ARG MNT_TYPE=cache
 RUN --mount=type=$MNT_TYPE,target=/mycache2 touch /mycache2/foo
 RUN --mount=type=cache,target=/mycache2 [ -f /mycache2/foo ]
-`)
+`,
+		`
+FROM nanoserver
+USER ContainerAdministrator
+ARG MNT_TYPE=cache
+RUN --mount=type=$MNT_TYPE,target=/mycache2 echo hello > \mycache2\foo
+RUN --mount=type=cache,target=/mycache2 dir \mycache2\foo
+`,
+	))
 
 	dir := integration.Tmpdir(
 		t,
@@ -348,10 +409,10 @@ RUN --mount=type=cache,target=/mycache2 [ -f /mycache2/foo ]
 }
 
 func testMountEnvAcrossStages(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
 
-	dockerfile := []byte(`
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
 FROM busybox as stage1
 
 ENV MNT_ID=mycache
@@ -361,7 +422,19 @@ RUN --mount=type=$MNT_TYPE2,id=$MNT_ID,target=/cbacba [ -f /cbacba/foo ]
 
 FROM stage1
 RUN --mount=type=$MNT_TYPE2,id=$MNT_ID,target=/whatever [ -f /whatever/foo ]
-`)
+`,
+		`
+FROM nanoserver AS stage1
+USER ContainerAdministrator
+ENV MNT_ID=mycache
+ENV MNT_TYPE2=cache
+RUN --mount=type=cache,id=mycache,target=/abcabc echo 1 > \abcabc\foo
+RUN --mount=type=$MNT_TYPE2,id=$MNT_ID,target=/cbacba dir \cbacba\foo
+
+FROM stage1
+RUN --mount=type=$MNT_TYPE2,id=$MNT_ID,target=/whatever dir \whatever\foo
+`,
+	))
 
 	dir := integration.Tmpdir(
 		t,
@@ -382,17 +455,27 @@ RUN --mount=type=$MNT_TYPE2,id=$MNT_ID,target=/whatever [ -f /whatever/foo ]
 }
 
 func testMountMetaArg(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
 
-	dockerfile := []byte(`
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
 ARG META_PATH=/tmp/meta
 
 FROM busybox
 ARG META_PATH
 RUN --mount=type=cache,id=mycache,target=/tmp/meta touch /tmp/meta/foo
 RUN --mount=type=cache,id=mycache,target=$META_PATH [ -f /tmp/meta/foo ]
-`)
+`,
+		`
+ARG META_PATH=/tmp/meta
+
+FROM nanoserver
+USER ContainerAdministrator
+ARG META_PATH
+RUN --mount=type=cache,id=mycache,target=/tmp/meta echo 1 > \tmp\meta\foo
+RUN --mount=type=cache,id=mycache,target=$META_PATH dir \tmp\meta\foo
+`,
+	))
 
 	dir := integration.Tmpdir(
 		t,
@@ -413,17 +496,28 @@ RUN --mount=type=cache,id=mycache,target=$META_PATH [ -f /tmp/meta/foo ]
 }
 
 func testMountFromError(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
 
-	dockerfile := []byte(`
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
 FROM busybox as test
 RUN touch /tmp/test
 
 FROM busybox
 ENV ttt=test
 RUN --mount=from=$ttt,type=cache,target=/tmp ls
-`)
+`,
+		`
+FROM nanoserver AS test
+RUN mkdir \tmp
+RUN echo \tmp\test
+
+FROM nanoserver
+USER ContainerAdministrator
+ENV ttt=test
+RUN --mount=from=$ttt,type=cache,target=/tmp dir
+`,
+	))
 
 	dir := integration.Tmpdir(
 		t,
@@ -487,17 +581,29 @@ COPY --from=base /tmpfssize /
 
 // moby/buildkit#4123
 func testMountDuplicate(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
 
-	dockerfile := []byte(`
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
 FROM busybox AS base
 RUN --mount=source=.,target=/tmp/test \
   --mount=source=b.txt,target=/tmp/b.txt \
   cat /tmp/test/a.txt /tmp/b.txt > /combined.txt
 FROM scratch
 COPY --from=base /combined.txt /
-`)
+`,
+		`
+FROM nanoserver AS base
+USER ContainerAdministrator
+RUN --mount=source=.,target=/tmp/test \
+  --mount=source=b.txt,target=/tmp/b.txt \
+  type \tmp\test\a.txt \tmp\b.txt > \combined.txt
+
+FROM nanoserver
+USER ContainerAdministrator
+COPY --from=base /combined.txt /
+`,
+	))
 
 	c, err := client.New(sb.Context(), sb.Address())
 	require.NoError(t, err)
@@ -540,10 +646,10 @@ COPY --from=base /combined.txt /
 
 // moby/buildkit#5566
 func testCacheMountParallel(t *testing.T, sb integration.Sandbox) {
-	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
 
-	dockerfile := []byte(`
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
 FROM alpine AS b1
 RUN --mount=type=cache,target=/foo/bar --mount=type=cache,target=/foo/bar/baz echo 1
 
@@ -553,7 +659,21 @@ RUN --mount=type=cache,target=/foo/bar --mount=type=cache,target=/foo/bar/baz ec
 FROM scratch
 COPY --from=b1 /etc/passwd p1
 COPY --from=b2 /etc/passwd p2
-`)
+`,
+		`
+FROM nanoserver AS b1
+USER ContainerAdministrator
+RUN --mount=type=cache,target=/foo/bar --mount=type=cache,target=/foo/bar/baz echo 1
+
+FROM nanoserver AS b2
+USER ContainerAdministrator
+RUN --mount=type=cache,target=/foo/bar --mount=type=cache,target=/foo/bar/baz echo 2
+
+FROM nanoserver
+COPY --from=b1 /License.txt p1
+COPY --from=b2 /License.txt p2
+`,
+	))
 
 	dir := integration.Tmpdir(
 		t,
diff --git a/frontend/dockerfile/dockerfile_test.go b/frontend/dockerfile/dockerfile_test.go
index ce9f3231d..0e18b9b1d 100644
--- a/frontend/dockerfile/dockerfile_test.go
+++ b/frontend/dockerfile/dockerfile_test.go
@@ -159,6 +159,7 @@ var allTests = integration.TestFuncs(
 	testNamedMultiplatformInputContext,
 	testNamedFilteredContext,
 	testEmptyDestDir,
+	testPreserveDestDirSlash,
 	testCopyLinkDotDestDir,
 	testCopyLinkEmptyDestDir,
 	testCopyChownCreateDest,
@@ -562,6 +563,42 @@ RUN cmd /V:on /C "set /p tfcontent=<testfile \
 	require.NoError(t, err)
 }
 
+func testPreserveDestDirSlash(t *testing.T, sb integration.Sandbox) {
+	f := getFrontend(t, sb)
+
+	dockerfile := []byte(integration.UnixOrWindows(
+		`
+FROM busybox
+COPY testfile /sample/
+RUN [ "$(cat /sample/testfile)" == "contents0" ]
+`,
+		`
+FROM nanoserver
+COPY testfile /sample/
+RUN cmd /V:on /C "set /p tfcontent=<\sample\testfile \
+	& if !tfcontent! NEQ contents0 (exit 1)"
+`,
+	))
+
+	dir := integration.Tmpdir(
+		t,
+		fstest.CreateFile("Dockerfile", dockerfile, 0600),
+		fstest.CreateFile("testfile", []byte("contents0"), 0600),
+	)
+
+	c, err := client.New(sb.Context(), sb.Address())
+	require.NoError(t, err)
+	defer c.Close()
+
+	_, err = f.Solve(sb.Context(), c, client.SolveOpt{
+		LocalMounts: map[string]fsutil.FS{
+			dockerui.DefaultLocalNameDockerfile: dir,
+			dockerui.DefaultLocalNameContext:    dir,
+		},
+	}, nil)
+	require.NoError(t, err)
+}
+
 func testCopyLinkDotDestDir(t *testing.T, sb integration.Sandbox) {
 	integration.SkipOnPlatform(t, "windows")
 	f := getFrontend(t, sb)
diff --git a/util/system/path_test.go b/util/system/path_test.go
index 086c63a34..da42472b6 100644
--- a/util/system/path_test.go
+++ b/util/system/path_test.go
@@ -87,8 +87,9 @@ func TestNormalizeWorkdir(t *testing.T) {
 
 // TestCheckSystemDriveAndRemoveDriveLetter tests CheckSystemDriveAndRemoveDriveLetter
 func TestCheckSystemDriveAndRemoveDriveLetter(t *testing.T) {
+	keepSlash := false
 	// Fails if not C drive.
-	_, err := CheckSystemDriveAndRemoveDriveLetter(`d:\`, "windows")
+	_, err := CheckSystemDriveAndRemoveDriveLetter(`d:\`, "windows", keepSlash)
 	if err == nil || err.Error() != "The specified path is not on the system drive (C:)" {
 		t.Fatalf("Expected error for d:")
 	}
@@ -96,7 +97,7 @@ func TestCheckSystemDriveAndRemoveDriveLetter(t *testing.T) {
 	var path string
 
 	// Single character is unchanged
-	if path, err = CheckSystemDriveAndRemoveDriveLetter("z", "windows"); err != nil {
+	if path, err = CheckSystemDriveAndRemoveDriveLetter("z", "windows", keepSlash); err != nil {
 		t.Fatalf("Single character should pass")
 	}
 	if path != "z" {
@@ -104,7 +105,7 @@ func TestCheckSystemDriveAndRemoveDriveLetter(t *testing.T) {
 	}
 
 	// Two characters without colon is unchanged
-	if path, err = CheckSystemDriveAndRemoveDriveLetter("AB", "windows"); err != nil {
+	if path, err = CheckSystemDriveAndRemoveDriveLetter("AB", "windows", keepSlash); err != nil {
 		t.Fatalf("2 characters without colon should pass")
 	}
 	if path != "AB" {
@@ -112,7 +113,7 @@ func TestCheckSystemDriveAndRemoveDriveLetter(t *testing.T) {
 	}
 
 	// Abs path without drive letter
-	if path, err = CheckSystemDriveAndRemoveDriveLetter(`\l`, "windows"); err != nil {
+	if path, err = CheckSystemDriveAndRemoveDriveLetter(`\l`, "windows", keepSlash); err != nil {
 		t.Fatalf("abs path no drive letter should pass")
 	}
 	if path != `/l` {
@@ -120,7 +121,7 @@ func TestCheckSystemDriveAndRemoveDriveLetter(t *testing.T) {
 	}
 
 	// Abs path without drive letter, linux style
-	if path, err = CheckSystemDriveAndRemoveDriveLetter(`/l`, "windows"); err != nil {
+	if path, err = CheckSystemDriveAndRemoveDriveLetter(`/l`, "windows", keepSlash); err != nil {
 		t.Fatalf("abs path no drive letter linux style should pass")
 	}
 	if path != `/l` {
@@ -128,7 +129,7 @@ func TestCheckSystemDriveAndRemoveDriveLetter(t *testing.T) {
 	}
 
 	// Drive-colon should be stripped
-	if path, err = CheckSystemDriveAndRemoveDriveLetter(`c:\`, "windows"); err != nil {
+	if path, err = CheckSystemDriveAndRemoveDriveLetter(`c:\`, "windows", keepSlash); err != nil {
 		t.Fatalf("An absolute path should pass")
 	}
 	if path != `/` {
@@ -136,7 +137,7 @@ func TestCheckSystemDriveAndRemoveDriveLetter(t *testing.T) {
 	}
 
 	// Verify with a linux-style path
-	if path, err = CheckSystemDriveAndRemoveDriveLetter(`c:/`, "windows"); err != nil {
+	if path, err = CheckSystemDriveAndRemoveDriveLetter(`c:/`, "windows", keepSlash); err != nil {
 		t.Fatalf("An absolute path should pass")
 	}
 	if path != `/` {
@@ -144,7 +145,7 @@ func TestCheckSystemDriveAndRemoveDriveLetter(t *testing.T) {
 	}
 
 	// Failure on c:
-	if path, err = CheckSystemDriveAndRemoveDriveLetter(`c:`, "windows"); err == nil {
+	if path, err = CheckSystemDriveAndRemoveDriveLetter(`c:`, "windows", keepSlash); err == nil {
 		t.Fatalf("c: should fail")
 	}
 	if err.Error() != `No relative path specified in "c:"` {
@@ -152,7 +153,7 @@ func TestCheckSystemDriveAndRemoveDriveLetter(t *testing.T) {
 	}
 
 	// Failure on d:
-	if path, err = CheckSystemDriveAndRemoveDriveLetter(`d:`, "windows"); err == nil {
+	if path, err = CheckSystemDriveAndRemoveDriveLetter(`d:`, "windows", keepSlash); err == nil {
 		t.Fatalf("c: should fail")
 	}
 	if err.Error() != `No relative path specified in "d:"` {
@@ -160,9 +161,45 @@ func TestCheckSystemDriveAndRemoveDriveLetter(t *testing.T) {
 	}
 
 	// UNC path should fail.
-	if _, err = CheckSystemDriveAndRemoveDriveLetter(`\\.\C$\test`, "windows"); err == nil {
+	if _, err = CheckSystemDriveAndRemoveDriveLetter(`\\.\C$\test`, "windows", keepSlash); err == nil {
 		t.Fatalf("UNC path should fail")
 	}
+
+	// also testing for keepSlash = true
+	keepSlash = true
+	origPath := "\\a\\b\\..\\c\\"
+	if path, err = CheckSystemDriveAndRemoveDriveLetter(origPath, "windows", keepSlash); err != nil {
+		t.Fatalf("windows relative paths should be cleaned and should pass")
+	}
+	// When input OS is Windows, the path should be properly cleaned
+	if path != "/a/c/" {
+		t.Fatalf("Path was not cleaned successfully")
+	}
+
+	if path, err = CheckSystemDriveAndRemoveDriveLetter(origPath, "windows", false); err != nil {
+		t.Fatalf("windows relative paths should be cleaned and should pass [keepSlash = false]")
+	}
+	// When input OS is Windows, the path should be properly cleaned
+	if path != "/a/c" {
+		t.Fatalf("Path was not cleaned successfully [keepSlash = false]")
+	}
+
+	// windows-style relative paths on linux
+	if path, err = CheckSystemDriveAndRemoveDriveLetter(origPath, "linux", keepSlash); err != nil {
+		t.Fatalf("windows style relative paths should be considered a valid path element in linux and should pass")
+	}
+	// When input OS is Linux, this is a valid path element name.
+	if path != "\\a\\b\\..\\c\\" {
+		t.Fatalf("Path was not cleaned successfully")
+	}
+
+	if path, err = CheckSystemDriveAndRemoveDriveLetter(origPath, "linux", false); err != nil {
+		t.Fatalf("windows style relative paths should be considered a valid path element in linux and should pass")
+	}
+	// When input OS is Linux, this is a valid path element name.
+	if path != "\\a\\b\\..\\c\\" {
+		t.Fatalf("Path was not cleaned successfully [keepSlash = false]")
+	}
 }
 
 // TestNormalizeWorkdirWindows tests NormalizeWorkdir
diff --git a/util/testutil/dockerd/client/client.go b/util/testutil/dockerd/client/client.go
new file mode 100644
index 000000000..dd6f8372a
--- /dev/null
+++ b/util/testutil/dockerd/client/client.go
@@ -0,0 +1,248 @@
+package client
+
+import (
+	"context"
+	"crypto/tls"
+	"net"
+	"net/http"
+	"net/url"
+	"strings"
+	"time"
+
+	"github.com/pkg/errors"
+)
+
+// DummyHost is a hostname used for local communication.
+//
+// It acts as a valid formatted hostname for local connections (such as "unix://"
+// or "npipe://") which do not require a hostname. It should never be resolved,
+// but uses the special-purpose ".localhost" TLD (as defined in [RFC 2606, Section 2]
+// and [RFC 6761, Section 6.3]).
+//
+// [RFC 7230, Section 5.4] defines that an empty header must be used for such
+// cases:
+//
+//	If the authority component is missing or undefined for the target URI,
+//	then a client MUST send a Host header field with an empty field-value.
+//
+// However, [Go stdlib] enforces the semantics of HTTP(S) over TCP, does not
+// allow an empty header to be used, and requires req.URL.Scheme to be either
+// "http" or "https".
+//
+// For further details, refer to:
+//
+//   - https://github.com/docker/engine-api/issues/189
+//   - https://github.com/golang/go/issues/13624
+//   - https://github.com/golang/go/issues/61076
+//   - https://github.com/moby/moby/issues/45935
+//
+// [RFC 2606, Section 2]: https://www.rfc-editor.org/rfc/rfc2606.html#section-2
+// [RFC 6761, Section 6.3]: https://www.rfc-editor.org/rfc/rfc6761#section-6.3
+// [RFC 7230, Section 5.4]: https://datatracker.ietf.org/doc/html/rfc7230#section-5.4
+// [Go stdlib]: https://github.com/golang/go/blob/6244b1946bc2101b01955468f1be502dbadd6807/src/net/http/transport.go#L558-L569
+const DummyHost = "api.moby.localhost"
+
+// DefaultVersion is the pinned version of the docker API we utilize.
+const DefaultVersion = "1.47"
+
+// Client is the API client that performs all operations
+// against a docker server.
+type Client struct {
+	// scheme sets the scheme for the client
+	scheme string
+	// host holds the server address to connect to
+	host string
+	// proto holds the client protocol i.e. unix.
+	proto string
+	// addr holds the client address.
+	addr string
+	// basePath holds the path to prepend to the requests.
+	basePath string
+	// client used to send and receive http requests.
+	client *http.Client
+	// version of the server to talk to.
+	version string
+
+	// When the client transport is an *http.Transport (default) we need to do some extra things (like closing idle connections).
+	// Store the original transport as the http.Client transport will be wrapped with tracing libs.
+	baseTransport *http.Transport
+}
+
+// ErrRedirect is the error returned by checkRedirect when the request is non-GET.
+var ErrRedirect = errors.New("unexpected redirect in response")
+
+// CheckRedirect specifies the policy for dealing with redirect responses. It
+// can be set on [http.Client.CheckRedirect] to prevent HTTP redirects for
+// non-GET requests. It returns an [ErrRedirect] for non-GET request, otherwise
+// returns a [http.ErrUseLastResponse], which is special-cased by http.Client
+// to use the last response.
+//
+// Go 1.8 changed behavior for HTTP redirects (specifically 301, 307, and 308)
+// in the client. The client (and by extension API client) can be made to send
+// a request like "POST /containers//start" where what would normally be in the
+// name section of the URL is empty. This triggers an HTTP 301 from the daemon.
+//
+// In go 1.8 this 301 is converted to a GET request, and ends up getting
+// a 404 from the daemon. This behavior change manifests in the client in that
+// before, the 301 was not followed and the client did not generate an error,
+// but now results in a message like "Error response from daemon: page not found".
+func CheckRedirect(_ *http.Request, via []*http.Request) error {
+	if via[0].Method == http.MethodGet {
+		return http.ErrUseLastResponse
+	}
+	return ErrRedirect
+}
+
+// NewClientWithOpts initializes a new API client with a default HTTPClient, and
+// default API host and version. It also initializes the custom HTTP headers to
+// add to each request.
+//
+// It takes an optional list of [Opt] functional arguments, which are applied in
+// the order they're provided, which allows modifying the defaults when creating
+// the client. For example, the following initializes a client that configures
+// itself with values from environment variables ([FromEnv]), and has automatic
+// API version negotiation enabled ([WithAPIVersionNegotiation]).
+//
+//	cli, err := client.NewClientWithOpts(
+//		client.FromEnv,
+//		client.WithAPIVersionNegotiation(),
+//	)
+func NewClientWithOpts(ops ...Opt) (*Client, error) {
+	hostURL, err := ParseHostURL(DefaultDockerHost)
+	if err != nil {
+		return nil, err
+	}
+
+	client, err := defaultHTTPClient(hostURL)
+	if err != nil {
+		return nil, err
+	}
+	c := &Client{
+		host:    DefaultDockerHost,
+		version: DefaultVersion,
+		client:  client,
+		proto:   hostURL.Scheme,
+		addr:    hostURL.Host,
+	}
+
+	for _, op := range ops {
+		if err := op(c); err != nil {
+			return nil, err
+		}
+	}
+
+	if tr, ok := c.client.Transport.(*http.Transport); ok {
+		// Store the base transport before we wrap it in tracing libs below
+		// This is used, as an example, to close idle connections when the client is closed
+		c.baseTransport = tr
+	}
+
+	if c.scheme == "" {
+		// TODO(stevvooe): This isn't really the right way to write clients in Go.
+		// `NewClient` should probably only take an `*http.Client` and work from there.
+		// Unfortunately, the model of having a host-ish/url-thingy as the connection
+		// string has us confusing protocol and transport layers. We continue doing
+		// this to avoid breaking existing clients but this should be addressed.
+		if c.tlsConfig() != nil {
+			c.scheme = "https"
+		} else {
+			c.scheme = "http"
+		}
+	}
+	return c, nil
+}
+
+func (cli *Client) tlsConfig() *tls.Config {
+	if cli.baseTransport == nil {
+		return nil
+	}
+	return cli.baseTransport.TLSClientConfig
+}
+
+func defaultHTTPClient(hostURL *url.URL) (*http.Client, error) {
+	// Necessary to prevent long-lived processes using the
+	// client from leaking connections due to idle connections
+	// not being released.
+	transport := &http.Transport{
+		MaxIdleConns:    6,
+		IdleConnTimeout: 30 * time.Second,
+	}
+	if err := configureTransport(transport, hostURL.Scheme, hostURL.Host); err != nil {
+		return nil, err
+	}
+	return &http.Client{
+		Transport:     transport,
+		CheckRedirect: CheckRedirect,
+	}, nil
+}
+
+// Close the transport used by the client
+func (cli *Client) Close() error {
+	if cli.baseTransport != nil {
+		cli.baseTransport.CloseIdleConnections()
+		return nil
+	}
+	return nil
+}
+
+// ParseHostURL parses a url string, validates the string is a host url, and
+// returns the parsed URL
+func ParseHostURL(host string) (*url.URL, error) {
+	proto, addr, ok := strings.Cut(host, "://")
+	if !ok || addr == "" {
+		return nil, errors.Errorf("unable to parse docker host `%s`", host)
+	}
+
+	var basePath string
+	if proto == "tcp" {
+		parsed, err := url.Parse("tcp://" + addr)
+		if err != nil {
+			return nil, err
+		}
+		addr = parsed.Host
+		basePath = parsed.Path
+	}
+	return &url.URL{
+		Scheme: proto,
+		Host:   addr,
+		Path:   basePath,
+	}, nil
+}
+
+func (cli *Client) dialerFromTransport() func(context.Context, string, string) (net.Conn, error) {
+	if cli.baseTransport == nil || cli.baseTransport.DialContext == nil {
+		return nil
+	}
+
+	if cli.baseTransport.TLSClientConfig != nil {
+		// When using a tls config we don't use the configured dialer but instead a fallback dialer...
+		// Note: It seems like this should use the normal dialer and wrap the returned net.Conn in a tls.Conn
+		// I honestly don't know why it doesn't do that, but it doesn't and such a change is entirely unrelated to the change in this commit.
+		return nil
+	}
+	return cli.baseTransport.DialContext
+}
+
+// Dialer returns a dialer for a raw stream connection, with an HTTP/1.1 header,
+// that can be used for proxying the daemon connection. It is used by
+// ["docker dial-stdio"].
+//
+// ["docker dial-stdio"]: https://github.com/docker/cli/pull/1014
+func (cli *Client) Dialer() func(context.Context) (net.Conn, error) {
+	return func(ctx context.Context) (net.Conn, error) {
+		if dialFn := cli.dialerFromTransport(); dialFn != nil {
+			return dialFn(ctx, cli.proto, cli.addr)
+		}
+		switch cli.proto {
+		case "unix":
+			return net.Dial(cli.proto, cli.addr)
+		case "npipe":
+			return DialPipe(cli.addr, 32*time.Second)
+		default:
+			if tlsConfig := cli.tlsConfig(); tlsConfig != nil {
+				return tls.Dial(cli.proto, cli.addr, tlsConfig)
+			}
+			return net.Dial(cli.proto, cli.addr)
+		}
+	}
+}
diff --git a/util/testutil/dockerd/client/errors.go b/util/testutil/dockerd/client/errors.go
new file mode 100644
index 000000000..84d797812
--- /dev/null
+++ b/util/testutil/dockerd/client/errors.go
@@ -0,0 +1,13 @@
+package client
+
+import (
+	"github.com/pkg/errors"
+)
+
+// ErrorConnectionFailed returns an error with host in the error message when connection to docker daemon failed.
+func ErrorConnectionFailed(host string) error {
+	if host == "" {
+		return errors.New("Cannot connect to the Docker daemon. Is the docker daemon running on this host?")
+	}
+	return errors.Errorf("Cannot connect to the Docker daemon at %s. Is the docker daemon running?", host)
+}
diff --git a/util/testutil/dockerd/client/options.go b/util/testutil/dockerd/client/options.go
new file mode 100644
index 000000000..6ae8bb818
--- /dev/null
+++ b/util/testutil/dockerd/client/options.go
@@ -0,0 +1,28 @@
+package client
+
+import (
+	"net/http"
+
+	"github.com/pkg/errors"
+)
+
+// Opt is a configuration option to initialize a [Client].
+type Opt func(*Client) error
+
+// WithHost overrides the client host with the specified one.
+func WithHost(host string) Opt {
+	return func(c *Client) error {
+		hostURL, err := ParseHostURL(host)
+		if err != nil {
+			return err
+		}
+		c.host = host
+		c.proto = hostURL.Scheme
+		c.addr = hostURL.Host
+		c.basePath = hostURL.Path
+		if transport, ok := c.client.Transport.(*http.Transport); ok {
+			return configureTransport(transport, c.proto, c.addr)
+		}
+		return errors.Errorf("cannot apply host to transport: %T", c.client.Transport)
+	}
+}
diff --git a/util/testutil/dockerd/client/ping.go b/util/testutil/dockerd/client/ping.go
new file mode 100644
index 000000000..9dffb3feb
--- /dev/null
+++ b/util/testutil/dockerd/client/ping.go
@@ -0,0 +1,25 @@
+package client
+
+import (
+	"context"
+	"net/http"
+	"path"
+)
+
+type PingResponse struct{}
+
+func (cli *Client) Ping(ctx context.Context) error {
+	// Using cli.buildRequest() + cli.doRequest() instead of cli.sendRequest()
+	// because ping requests are used during API version negotiation, so we want
+	// to hit the non-versioned /_ping endpoint, not /v1.xx/_ping
+	req, err := cli.buildRequest(ctx, http.MethodHead, path.Join(cli.basePath, "/_ping"), nil, nil)
+	if err != nil {
+		return err
+	}
+	serverResp, err := cli.doRequest(req)
+	if err != nil {
+		return err
+	}
+	defer ensureReaderClosed(serverResp)
+	return cli.checkResponseErr(serverResp)
+}
diff --git a/util/testutil/dockerd/client/request.go b/util/testutil/dockerd/client/request.go
new file mode 100644
index 000000000..47dc9ec06
--- /dev/null
+++ b/util/testutil/dockerd/client/request.go
@@ -0,0 +1,162 @@
+//nolint:forbidigo
+package client
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"io"
+	"net"
+	"net/http"
+	"net/url"
+	"os"
+	"strings"
+
+	"github.com/pkg/errors"
+)
+
+func (cli *Client) buildRequest(ctx context.Context, method, path string, body io.Reader, headers http.Header) (*http.Request, error) {
+	req, err := http.NewRequestWithContext(ctx, method, path, body)
+	if err != nil {
+		return nil, err
+	}
+	req = cli.addHeaders(req, headers)
+	req.URL.Scheme = cli.scheme
+	req.URL.Host = cli.addr
+
+	if cli.proto == "unix" || cli.proto == "npipe" {
+		// Override host header for non-tcp connections.
+		req.Host = DummyHost
+	}
+
+	if body != nil && req.Header.Get("Content-Type") == "" {
+		req.Header.Set("Content-Type", "text/plain")
+	}
+	return req, nil
+}
+
+func (cli *Client) doRequest(req *http.Request) (*http.Response, error) {
+	resp, err := cli.client.Do(req)
+	if err != nil {
+		if cli.scheme != "https" && strings.Contains(err.Error(), "malformed HTTP response") {
+			return nil, errors.Errorf("%v.\n* Are you trying to connect to a TLS-enabled daemon without TLS?", err)
+		}
+
+		if cli.scheme == "https" && strings.Contains(err.Error(), "bad certificate") {
+			return nil, errors.Wrap(err, "the server probably has client authentication (--tlsverify) enabled; check your TLS client certification settings")
+		}
+
+		// Don't decorate context sentinel errors; users may be comparing to
+		// them directly.
+		if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {
+			return nil, err
+		}
+
+		if uErr, ok := err.(*url.Error); ok {
+			if nErr, ok := uErr.Err.(*net.OpError); ok {
+				if os.IsPermission(nErr.Err) {
+					return nil, errors.Wrapf(err, "permission denied while trying to connect to the Docker daemon socket at %v", cli.host)
+				}
+			}
+		}
+
+		if nErr, ok := err.(net.Error); ok {
+			// FIXME(thaJeztah): any net.Error should be considered a connection error (but we should include the original error)?
+			if nErr.Timeout() {
+				return nil, ErrorConnectionFailed(cli.host)
+			}
+			if strings.Contains(nErr.Error(), "connection refused") || strings.Contains(nErr.Error(), "dial unix") {
+				return nil, ErrorConnectionFailed(cli.host)
+			}
+		}
+
+		// Although there's not a strongly typed error for this in go-winio,
+		// lots of people are using the default configuration for the docker
+		// daemon on Windows where the daemon is listening on a named pipe
+		// `//./pipe/docker_engine, and the client must be running elevated.
+		// Give users a clue rather than the not-overly useful message
+		// such as `error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.26/info:
+		// open //./pipe/docker_engine: The system cannot find the file specified.`.
+		// Note we can't string compare "The system cannot find the file specified" as
+		// this is localised - for example in French the error would be
+		// `open //./pipe/docker_engine: Le fichier spécifié est introuvable.`
+		if strings.Contains(err.Error(), `open //./pipe/docker_engine`) {
+			// Checks if client is running with elevated privileges
+			if f, elevatedErr := os.Open(`\\.\PHYSICALDRIVE0`); elevatedErr != nil {
+				err = errors.Wrap(err, "in the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect")
+			} else {
+				_ = f.Close()
+				err = errors.Wrap(err, "this error may indicate that the docker daemon is not running")
+			}
+		}
+
+		return nil, errors.Wrap(err, "error during connect")
+	}
+	return resp, nil
+}
+
+func (cli *Client) checkResponseErr(serverResp *http.Response) error {
+	if serverResp == nil {
+		return nil
+	}
+	if serverResp.StatusCode >= 200 && serverResp.StatusCode < 400 {
+		return nil
+	}
+
+	var body []byte
+	var err error
+	var reqURL string
+	if serverResp.Request != nil {
+		reqURL = serverResp.Request.URL.String()
+	}
+	statusMsg := serverResp.Status
+	if statusMsg == "" {
+		statusMsg = http.StatusText(serverResp.StatusCode)
+	}
+	if serverResp.Body != nil {
+		bodyMax := 1 * 1024 * 1024 // 1 MiB
+		bodyR := &io.LimitedReader{
+			R: serverResp.Body,
+			N: int64(bodyMax),
+		}
+		body, err = io.ReadAll(bodyR)
+		if err != nil {
+			return err
+		}
+		if bodyR.N == 0 {
+			return fmt.Errorf("request returned %s with a message (> %d bytes) for API route and version %s, check if the server supports the requested API version", statusMsg, bodyMax, reqURL)
+		}
+	}
+	if len(body) == 0 {
+		return fmt.Errorf("request returned %s for API route and version %s, check if the server supports the requested API version", statusMsg, reqURL)
+	}
+
+	var daemonErr error
+	if serverResp.Header.Get("Content-Type") == "application/json" {
+		var errorResponse struct {
+			Message string `json:"message"`
+		}
+		if err := json.Unmarshal(body, &errorResponse); err != nil {
+			return errors.Wrap(err, "Error reading JSON")
+		}
+		daemonErr = errors.New(strings.TrimSpace(errorResponse.Message))
+	} else {
+		daemonErr = errors.New(strings.TrimSpace(string(body)))
+	}
+	return errors.Wrap(daemonErr, "Error response from daemon")
+}
+
+func (cli *Client) addHeaders(req *http.Request, headers http.Header) *http.Request {
+	for k, v := range headers {
+		req.Header[http.CanonicalHeaderKey(k)] = v
+	}
+	return req
+}
+
+func ensureReaderClosed(response *http.Response) {
+	if response.Body != nil {
+		// Drain up to 512 bytes and close the body to let the Transport reuse the connection
+		_, _ = io.CopyN(io.Discard, response.Body, 512)
+		_ = response.Body.Close()
+	}
+}
diff --git a/util/testutil/workers/dockerd.go b/util/testutil/workers/dockerd.go
index 1a7da3c1f..ba557580e 100644
--- a/util/testutil/workers/dockerd.go
+++ b/util/testutil/workers/dockerd.go
@@ -10,9 +10,9 @@ import (
 	"strings"
 	"time"
 
-	"github.com/docker/docker/client"
 	"github.com/moby/buildkit/cmd/buildkitd/config"
 	"github.com/moby/buildkit/util/testutil/dockerd"
+	"github.com/moby/buildkit/util/testutil/dockerd/client"
 	"github.com/moby/buildkit/util/testutil/integration"
 	"github.com/pkg/errors"
 	"golang.org/x/sync/errgroup"
@@ -252,7 +252,7 @@ func waitForAPI(ctx context.Context, apiClient *client.Client, d time.Duration)
 	step := 50 * time.Millisecond
 	i := 0
 	for {
-		if _, err := apiClient.Ping(ctx); err == nil {
+		if err := apiClient.Ping(ctx); err == nil {
 			break
 		}
 		i++