vendor: github.com/docker/docker 1a1f3cff45ec (master, v27.0-dev)

Rewrite local code to use the new container.Ulimit alias to start
transitioning away from direct uses of go-units.Ulimit.

full diff: https://github.com/docker/docker/compare/v27.0.0-rc.2...1a1f3cff45ec5aba4a520fae88b4f929eab8b3e8

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2024-06-18 14:29:45 +02:00
parent aebdf506bc
commit 2088c5963b
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
24 changed files with 229 additions and 148 deletions

View File

@ -7,7 +7,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container"
"github.com/docker/docker/client" "github.com/docker/docker/client"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -50,7 +50,7 @@ func (s *stats) isKnownContainer(cid string) (int, bool) {
return -1, false return -1, false
} }
func collect(ctx context.Context, s *Stats, cli client.APIClient, streamStats bool, waitFirst *sync.WaitGroup) { func collect(ctx context.Context, s *Stats, cli client.ContainerAPIClient, streamStats bool, waitFirst *sync.WaitGroup) {
logrus.Debugf("collecting stats for %s", s.Container) logrus.Debugf("collecting stats for %s", s.Container)
var ( var (
getFirst bool getFirst bool
@ -78,7 +78,7 @@ func collect(ctx context.Context, s *Stats, cli client.APIClient, streamStats bo
go func() { go func() {
for { for {
var ( var (
v *types.StatsJSON v *container.StatsResponse
memPercent, cpuPercent float64 memPercent, cpuPercent float64
blkRead, blkWrite uint64 // Only used on Linux blkRead, blkWrite uint64 // Only used on Linux
mem, memLimit float64 mem, memLimit float64
@ -163,7 +163,7 @@ func collect(ctx context.Context, s *Stats, cli client.APIClient, streamStats bo
} }
} }
func calculateCPUPercentUnix(previousCPU, previousSystem uint64, v *types.StatsJSON) float64 { func calculateCPUPercentUnix(previousCPU, previousSystem uint64, v *container.StatsResponse) float64 {
var ( var (
cpuPercent = 0.0 cpuPercent = 0.0
// calculate the change for the cpu usage of the container in between readings // calculate the change for the cpu usage of the container in between readings
@ -182,7 +182,7 @@ func calculateCPUPercentUnix(previousCPU, previousSystem uint64, v *types.StatsJ
return cpuPercent return cpuPercent
} }
func calculateCPUPercentWindows(v *types.StatsJSON) float64 { func calculateCPUPercentWindows(v *container.StatsResponse) float64 {
// Max number of 100ns intervals between the previous time read and now // Max number of 100ns intervals between the previous time read and now
possIntervals := uint64(v.Read.Sub(v.PreRead).Nanoseconds()) // Start with number of ns intervals possIntervals := uint64(v.Read.Sub(v.PreRead).Nanoseconds()) // Start with number of ns intervals
possIntervals /= 100 // Convert to number of 100ns intervals possIntervals /= 100 // Convert to number of 100ns intervals
@ -198,7 +198,7 @@ func calculateCPUPercentWindows(v *types.StatsJSON) float64 {
return 0.00 return 0.00
} }
func calculateBlockIO(blkio types.BlkioStats) (uint64, uint64) { func calculateBlockIO(blkio container.BlkioStats) (uint64, uint64) {
var blkRead, blkWrite uint64 var blkRead, blkWrite uint64
for _, bioEntry := range blkio.IoServiceBytesRecursive { for _, bioEntry := range blkio.IoServiceBytesRecursive {
if len(bioEntry.Op) == 0 { if len(bioEntry.Op) == 0 {
@ -214,7 +214,7 @@ func calculateBlockIO(blkio types.BlkioStats) (uint64, uint64) {
return blkRead, blkWrite return blkRead, blkWrite
} }
func calculateNetwork(network map[string]types.NetworkStats) (float64, float64) { func calculateNetwork(network map[string]container.NetworkStats) (float64, float64) {
var rx, tx float64 var rx, tx float64
for _, v := range network { for _, v := range network {
@ -236,7 +236,7 @@ func calculateNetwork(network map[string]types.NetworkStats) (float64, float64)
// //
// On Docker 19.03 and older, the result was `mem.Usage - mem.Stats["cache"]`. // On Docker 19.03 and older, the result was `mem.Usage - mem.Stats["cache"]`.
// See https://github.com/moby/moby/issues/40727 for the background. // See https://github.com/moby/moby/issues/40727 for the background.
func calculateMemUsageUnixNoCache(mem types.MemoryStats) float64 { func calculateMemUsageUnixNoCache(mem container.MemoryStats) float64 {
// cgroup v1 // cgroup v1
if v, isCgroup1 := mem.Stats["total_inactive_file"]; isCgroup1 && v < mem.Usage { if v, isCgroup1 := mem.Stats["total_inactive_file"]; isCgroup1 && v < mem.Usage {
return float64(mem.Usage - v) return float64(mem.Usage - v)

View File

@ -4,18 +4,12 @@ import (
"fmt" "fmt"
"testing" "testing"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container"
"gotest.tools/v3/assert" "gotest.tools/v3/assert"
) )
func TestCalculateMemUsageUnixNoCache(t *testing.T) { func TestCalculateMemUsageUnixNoCache(t *testing.T) {
// Given result := calculateMemUsageUnixNoCache(container.MemoryStats{Usage: 500, Stats: map[string]uint64{"total_inactive_file": 400}})
stats := types.MemoryStats{Usage: 500, Stats: map[string]uint64{"total_inactive_file": 400}}
// When
result := calculateMemUsageUnixNoCache(stats)
// Then
assert.Assert(t, inDelta(100.0, result, 1e-6)) assert.Assert(t, inDelta(100.0, result, 1e-6))
} }
@ -36,6 +30,28 @@ func TestCalculateMemPercentUnixNoCache(t *testing.T) {
}) })
} }
func TestCalculateBlockIO(t *testing.T) {
blkRead, blkWrite := calculateBlockIO(container.BlkioStats{
IoServiceBytesRecursive: []container.BlkioStatEntry{
{Major: 8, Minor: 0, Op: "read", Value: 1234},
{Major: 8, Minor: 1, Op: "read", Value: 4567},
{Major: 8, Minor: 0, Op: "Read", Value: 6},
{Major: 8, Minor: 1, Op: "Read", Value: 8},
{Major: 8, Minor: 0, Op: "write", Value: 123},
{Major: 8, Minor: 1, Op: "write", Value: 456},
{Major: 8, Minor: 0, Op: "Write", Value: 6},
{Major: 8, Minor: 1, Op: "Write", Value: 8},
{Major: 8, Minor: 1, Op: "", Value: 456},
},
})
if blkRead != 5815 {
t.Fatalf("blkRead = %d, want 5815", blkRead)
}
if blkWrite != 593 {
t.Fatalf("blkWrite = %d, want 593", blkWrite)
}
}
func inDelta(x, y, delta float64) func() (bool, string) { func inDelta(x, y, delta float64) func() (bool, string) {
return func() (bool, string) { return func() (bool, string) {
diff := x - y diff := x - y

View File

@ -1,30 +0,0 @@
package container
import (
"testing"
"github.com/docker/docker/api/types"
)
func TestCalculateBlockIO(t *testing.T) {
blkio := types.BlkioStats{
IoServiceBytesRecursive: []types.BlkioStatEntry{
{Major: 8, Minor: 0, Op: "read", Value: 1234},
{Major: 8, Minor: 1, Op: "read", Value: 4567},
{Major: 8, Minor: 0, Op: "Read", Value: 6},
{Major: 8, Minor: 1, Op: "Read", Value: 8},
{Major: 8, Minor: 0, Op: "write", Value: 123},
{Major: 8, Minor: 1, Op: "write", Value: 456},
{Major: 8, Minor: 0, Op: "Write", Value: 6},
{Major: 8, Minor: 1, Op: "Write", Value: 8},
{Major: 8, Minor: 1, Op: "", Value: 456},
},
}
blkRead, blkWrite := calculateBlockIO(blkio)
if blkRead != 5815 {
t.Fatalf("blkRead = %d, want 5815", blkRead)
}
if blkWrite != 593 {
t.Fatalf("blkWrite = %d, want 593", blkWrite)
}
}

View File

@ -29,7 +29,6 @@ import (
"github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/jsonmessage"
"github.com/docker/docker/pkg/progress" "github.com/docker/docker/pkg/progress"
"github.com/docker/docker/pkg/streamformatter" "github.com/docker/docker/pkg/streamformatter"
units "github.com/docker/go-units"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -81,7 +80,7 @@ func (o buildOptions) contextFromStdin() bool {
} }
func newBuildOptions() buildOptions { func newBuildOptions() buildOptions {
ulimits := make(map[string]*units.Ulimit) ulimits := make(map[string]*container.Ulimit)
return buildOptions{ return buildOptions{
tags: opts.NewListOpts(validateTag), tags: opts.NewListOpts(validateTag),
buildArgs: opts.NewListOpts(opts.ValidateEnv), buildArgs: opts.NewListOpts(opts.ValidateEnv),

View File

@ -17,7 +17,6 @@ import (
"github.com/docker/docker/api/types/swarm" "github.com/docker/docker/api/types/swarm"
"github.com/docker/docker/api/types/versions" "github.com/docker/docker/api/types/versions"
"github.com/docker/docker/client" "github.com/docker/docker/client"
units "github.com/docker/go-units"
"github.com/moby/swarmkit/v2/api/defaults" "github.com/moby/swarmkit/v2/api/defaults"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -710,8 +709,8 @@ func updateSysCtls(flags *pflag.FlagSet, field *map[string]string) {
} }
} }
func updateUlimits(flags *pflag.FlagSet, ulimits []*units.Ulimit) []*units.Ulimit { func updateUlimits(flags *pflag.FlagSet, ulimits []*container.Ulimit) []*container.Ulimit {
newUlimits := make(map[string]*units.Ulimit) newUlimits := make(map[string]*container.Ulimit)
for _, ulimit := range ulimits { for _, ulimit := range ulimits {
newUlimits[ulimit.Name] = ulimit newUlimits[ulimit.Name] = ulimit
@ -731,7 +730,7 @@ func updateUlimits(flags *pflag.FlagSet, ulimits []*units.Ulimit) []*units.Ulimi
if len(newUlimits) == 0 { if len(newUlimits) == 0 {
return nil return nil
} }
limits := make([]*units.Ulimit, 0, len(newUlimits)) limits := make([]*container.Ulimit, 0, len(newUlimits))
for _, ulimit := range newUlimits { for _, ulimit := range newUlimits {
limits = append(limits, ulimit) limits = append(limits, ulimit)
} }

View File

@ -13,7 +13,6 @@ import (
mounttypes "github.com/docker/docker/api/types/mount" mounttypes "github.com/docker/docker/api/types/mount"
"github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/network"
"github.com/docker/docker/api/types/swarm" "github.com/docker/docker/api/types/swarm"
"github.com/docker/go-units"
"gotest.tools/v3/assert" "gotest.tools/v3/assert"
is "gotest.tools/v3/assert/cmp" is "gotest.tools/v3/assert/cmp"
) )
@ -1600,66 +1599,66 @@ func TestUpdateUlimits(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
spec []*units.Ulimit spec []*container.Ulimit
rm []string rm []string
add []string add []string
expected []*units.Ulimit expected []*container.Ulimit
}{ }{
{ {
name: "from scratch", name: "from scratch",
add: []string{"nofile=512:1024", "core=1024:1024"}, add: []string{"nofile=512:1024", "core=1024:1024"},
expected: []*units.Ulimit{ expected: []*container.Ulimit{
{Name: "core", Hard: 1024, Soft: 1024}, {Name: "core", Hard: 1024, Soft: 1024},
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
}, },
{ {
name: "append new", name: "append new",
spec: []*units.Ulimit{ spec: []*container.Ulimit{
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
add: []string{"core=1024:1024"}, add: []string{"core=1024:1024"},
expected: []*units.Ulimit{ expected: []*container.Ulimit{
{Name: "core", Hard: 1024, Soft: 1024}, {Name: "core", Hard: 1024, Soft: 1024},
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
}, },
{ {
name: "remove and append new should append", name: "remove and append new should append",
spec: []*units.Ulimit{ spec: []*container.Ulimit{
{Name: "core", Hard: 1024, Soft: 1024}, {Name: "core", Hard: 1024, Soft: 1024},
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
rm: []string{"nofile=512:1024"}, rm: []string{"nofile=512:1024"},
add: []string{"nofile=512:1024"}, add: []string{"nofile=512:1024"},
expected: []*units.Ulimit{ expected: []*container.Ulimit{
{Name: "core", Hard: 1024, Soft: 1024}, {Name: "core", Hard: 1024, Soft: 1024},
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
}, },
{ {
name: "update existing", name: "update existing",
spec: []*units.Ulimit{ spec: []*container.Ulimit{
{Name: "nofile", Hard: 2048, Soft: 1024}, {Name: "nofile", Hard: 2048, Soft: 1024},
}, },
add: []string{"nofile=512:1024"}, add: []string{"nofile=512:1024"},
expected: []*units.Ulimit{ expected: []*container.Ulimit{
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
}, },
{ {
name: "update existing twice", name: "update existing twice",
spec: []*units.Ulimit{ spec: []*container.Ulimit{
{Name: "nofile", Hard: 2048, Soft: 1024}, {Name: "nofile", Hard: 2048, Soft: 1024},
}, },
add: []string{"nofile=256:512", "nofile=512:1024"}, add: []string{"nofile=256:512", "nofile=512:1024"},
expected: []*units.Ulimit{ expected: []*container.Ulimit{
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
}, },
{ {
name: "remove all", name: "remove all",
spec: []*units.Ulimit{ spec: []*container.Ulimit{
{Name: "core", Hard: 1024, Soft: 1024}, {Name: "core", Hard: 1024, Soft: 1024},
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
@ -1668,23 +1667,23 @@ func TestUpdateUlimits(t *testing.T) {
}, },
{ {
name: "remove by key", name: "remove by key",
spec: []*units.Ulimit{ spec: []*container.Ulimit{
{Name: "core", Hard: 1024, Soft: 1024}, {Name: "core", Hard: 1024, Soft: 1024},
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
rm: []string{"core"}, rm: []string{"core"},
expected: []*units.Ulimit{ expected: []*container.Ulimit{
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
}, },
{ {
name: "remove by key and different value", name: "remove by key and different value",
spec: []*units.Ulimit{ spec: []*container.Ulimit{
{Name: "core", Hard: 1024, Soft: 1024}, {Name: "core", Hard: 1024, Soft: 1024},
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
rm: []string{"core=1234:5678"}, rm: []string{"core=1234:5678"},
expected: []*units.Ulimit{ expected: []*container.Ulimit{
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
}, },
}, },

View File

@ -14,7 +14,6 @@ import (
"github.com/docker/docker/api/types/swarm" "github.com/docker/docker/api/types/swarm"
"github.com/docker/docker/api/types/versions" "github.com/docker/docker/api/types/versions"
"github.com/docker/docker/client" "github.com/docker/docker/client"
"github.com/docker/go-units"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
@ -693,24 +692,24 @@ func convertCredentialSpec(namespace Namespace, spec composetypes.CredentialSpec
return &swarmCredSpec, nil return &swarmCredSpec, nil
} }
func convertUlimits(origUlimits map[string]*composetypes.UlimitsConfig) []*units.Ulimit { func convertUlimits(origUlimits map[string]*composetypes.UlimitsConfig) []*container.Ulimit {
newUlimits := make(map[string]*units.Ulimit) newUlimits := make(map[string]*container.Ulimit)
for name, u := range origUlimits { for name, u := range origUlimits {
if u.Single != 0 { if u.Single != 0 {
newUlimits[name] = &units.Ulimit{ newUlimits[name] = &container.Ulimit{
Name: name, Name: name,
Soft: int64(u.Single), Soft: int64(u.Single),
Hard: int64(u.Single), Hard: int64(u.Single),
} }
} else { } else {
newUlimits[name] = &units.Ulimit{ newUlimits[name] = &container.Ulimit{
Name: name, Name: name,
Soft: int64(u.Soft), Soft: int64(u.Soft),
Hard: int64(u.Hard), Hard: int64(u.Hard),
} }
} }
} }
ulimits := make([]*units.Ulimit, 0, len(newUlimits)) ulimits := make([]*container.Ulimit, 0, len(newUlimits))
for _, ulimit := range newUlimits { for _, ulimit := range newUlimits {
ulimits = append(ulimits, ulimit) ulimits = append(ulimits, ulimit)
} }

View File

@ -4,24 +4,27 @@ import (
"fmt" "fmt"
"sort" "sort"
"github.com/docker/docker/api/types/container"
"github.com/docker/go-units" "github.com/docker/go-units"
) )
// UlimitOpt defines a map of Ulimits // UlimitOpt defines a map of Ulimits
type UlimitOpt struct { type UlimitOpt struct {
values *map[string]*units.Ulimit values *map[string]*container.Ulimit
} }
// NewUlimitOpt creates a new UlimitOpt. Ulimits are not validated. // NewUlimitOpt creates a new UlimitOpt. Ulimits are not validated.
func NewUlimitOpt(ref *map[string]*units.Ulimit) *UlimitOpt { func NewUlimitOpt(ref *map[string]*container.Ulimit) *UlimitOpt {
// TODO(thaJeztah): why do we need a map with pointers here?
if ref == nil { if ref == nil {
ref = &map[string]*units.Ulimit{} ref = &map[string]*container.Ulimit{}
} }
return &UlimitOpt{ref} return &UlimitOpt{ref}
} }
// Set validates a Ulimit and sets its name as a key in UlimitOpt // Set validates a Ulimit and sets its name as a key in UlimitOpt
func (o *UlimitOpt) Set(val string) error { func (o *UlimitOpt) Set(val string) error {
// FIXME(thaJeztah): these functions also need to be moved over from go-units.
l, err := units.ParseUlimit(val) l, err := units.ParseUlimit(val)
if err != nil { if err != nil {
return err return err
@ -43,8 +46,8 @@ func (o *UlimitOpt) String() string {
} }
// GetList returns a slice of pointers to Ulimits. Values are sorted by name. // GetList returns a slice of pointers to Ulimits. Values are sorted by name.
func (o *UlimitOpt) GetList() []*units.Ulimit { func (o *UlimitOpt) GetList() []*container.Ulimit {
ulimits := make([]*units.Ulimit, 0, len(*o.values)) ulimits := make([]*container.Ulimit, 0, len(*o.values))
for _, v := range *o.values { for _, v := range *o.values {
ulimits = append(ulimits, v) ulimits = append(ulimits, v)
} }

View File

@ -3,12 +3,12 @@ package opts
import ( import (
"testing" "testing"
"github.com/docker/go-units" "github.com/docker/docker/api/types/container"
"gotest.tools/v3/assert" "gotest.tools/v3/assert"
) )
func TestUlimitOpt(t *testing.T) { func TestUlimitOpt(t *testing.T) {
ulimitMap := map[string]*units.Ulimit{ ulimitMap := map[string]*container.Ulimit{
"nofile": {Name: "nofile", Hard: 1024, Soft: 512}, "nofile": {Name: "nofile", Hard: 1024, Soft: 512},
} }
@ -37,12 +37,12 @@ func TestUlimitOpt(t *testing.T) {
} }
func TestUlimitOptSorting(t *testing.T) { func TestUlimitOptSorting(t *testing.T) {
ulimitOpt := NewUlimitOpt(&map[string]*units.Ulimit{ ulimitOpt := NewUlimitOpt(&map[string]*container.Ulimit{
"nofile": {Name: "nofile", Hard: 1024, Soft: 512}, "nofile": {Name: "nofile", Hard: 1024, Soft: 512},
"core": {Name: "core", Hard: 1024, Soft: 1024}, "core": {Name: "core", Hard: 1024, Soft: 1024},
}) })
expected := []*units.Ulimit{ expected := []*container.Ulimit{
{Name: "core", Hard: 1024, Soft: 1024}, {Name: "core", Hard: 1024, Soft: 1024},
{Name: "nofile", Hard: 1024, Soft: 512}, {Name: "nofile", Hard: 1024, Soft: 512},
} }

View File

@ -12,7 +12,7 @@ require (
github.com/creack/pty v1.1.21 github.com/creack/pty v1.1.21
github.com/distribution/reference v0.6.0 github.com/distribution/reference v0.6.0
github.com/docker/distribution v2.8.3+incompatible github.com/docker/distribution v2.8.3+incompatible
github.com/docker/docker v27.0.0-rc.2+incompatible github.com/docker/docker v27.0.0-rc.2.0.20240620105908-1a1f3cff45ec+incompatible // master (v27.0-dev)
github.com/docker/docker-credential-helpers v0.8.2 github.com/docker/docker-credential-helpers v0.8.2
github.com/docker/go-connections v0.5.0 github.com/docker/go-connections v0.5.0
github.com/docker/go-units v0.5.0 github.com/docker/go-units v0.5.0

View File

@ -57,8 +57,8 @@ github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v27.0.0-rc.2+incompatible h1:7h252klGbyDOfTpCxKFriEJSj8SpShcOwz9shs1k2n8= github.com/docker/docker v27.0.0-rc.2.0.20240620105908-1a1f3cff45ec+incompatible h1:lN0HDqbNJr4SrjQyG7dko0wE6hxVSXXCNAw8DTO1Wm4=
github.com/docker/docker v27.0.0-rc.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v27.0.0-rc.2.0.20240620105908-1a1f3cff45ec+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo= github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo=
github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0=

View File

@ -10,6 +10,7 @@ Aaron Huslage <huslage@gmail.com>
Aaron L. Xu <liker.xu@foxmail.com> Aaron L. Xu <liker.xu@foxmail.com>
Aaron Lehmann <alehmann@netflix.com> Aaron Lehmann <alehmann@netflix.com>
Aaron Welch <welch@packet.net> Aaron Welch <welch@packet.net>
Aaron Yoshitake <airandfingers@gmail.com>
Abel Muiño <amuino@gmail.com> Abel Muiño <amuino@gmail.com>
Abhijeet Kasurde <akasurde@redhat.com> Abhijeet Kasurde <akasurde@redhat.com>
Abhinandan Prativadi <aprativadi@gmail.com> Abhinandan Prativadi <aprativadi@gmail.com>
@ -62,6 +63,7 @@ alambike <alambike@gmail.com>
Alan Hoyle <alan@alanhoyle.com> Alan Hoyle <alan@alanhoyle.com>
Alan Scherger <flyinprogrammer@gmail.com> Alan Scherger <flyinprogrammer@gmail.com>
Alan Thompson <cloojure@gmail.com> Alan Thompson <cloojure@gmail.com>
Alano Terblanche <alano.terblanche@docker.com>
Albert Callarisa <shark234@gmail.com> Albert Callarisa <shark234@gmail.com>
Albert Zhang <zhgwenming@gmail.com> Albert Zhang <zhgwenming@gmail.com>
Albin Kerouanton <albinker@gmail.com> Albin Kerouanton <albinker@gmail.com>
@ -141,6 +143,7 @@ Andreas Tiefenthaler <at@an-ti.eu>
Andrei Gherzan <andrei@resin.io> Andrei Gherzan <andrei@resin.io>
Andrei Ushakov <aushakov@netflix.com> Andrei Ushakov <aushakov@netflix.com>
Andrei Vagin <avagin@gmail.com> Andrei Vagin <avagin@gmail.com>
Andrew Baxter <423qpsxzhh8k3h@s.rendaw.me>
Andrew C. Bodine <acbodine@us.ibm.com> Andrew C. Bodine <acbodine@us.ibm.com>
Andrew Clay Shafer <andrewcshafer@gmail.com> Andrew Clay Shafer <andrewcshafer@gmail.com>
Andrew Duckworth <grillopress@gmail.com> Andrew Duckworth <grillopress@gmail.com>
@ -193,6 +196,7 @@ Anton Löfgren <anton.lofgren@gmail.com>
Anton Nikitin <anton.k.nikitin@gmail.com> Anton Nikitin <anton.k.nikitin@gmail.com>
Anton Polonskiy <anton.polonskiy@gmail.com> Anton Polonskiy <anton.polonskiy@gmail.com>
Anton Tiurin <noxiouz@yandex.ru> Anton Tiurin <noxiouz@yandex.ru>
Antonio Aguilar <antonio@zoftko.com>
Antonio Murdaca <antonio.murdaca@gmail.com> Antonio Murdaca <antonio.murdaca@gmail.com>
Antonis Kalipetis <akalipetis@gmail.com> Antonis Kalipetis <akalipetis@gmail.com>
Antony Messerli <amesserl@rackspace.com> Antony Messerli <amesserl@rackspace.com>
@ -221,7 +225,6 @@ Avi Das <andas222@gmail.com>
Avi Kivity <avi@scylladb.com> Avi Kivity <avi@scylladb.com>
Avi Miller <avi.miller@oracle.com> Avi Miller <avi.miller@oracle.com>
Avi Vaid <avaid1996@gmail.com> Avi Vaid <avaid1996@gmail.com>
ayoshitake <airandfingers@gmail.com>
Azat Khuyiyakhmetov <shadow_uz@mail.ru> Azat Khuyiyakhmetov <shadow_uz@mail.ru>
Bao Yonglei <baoyonglei@huawei.com> Bao Yonglei <baoyonglei@huawei.com>
Bardia Keyoumarsi <bkeyouma@ucsc.edu> Bardia Keyoumarsi <bkeyouma@ucsc.edu>
@ -316,6 +319,7 @@ Burke Libbey <burke@libbey.me>
Byung Kang <byung.kang.ctr@amrdec.army.mil> Byung Kang <byung.kang.ctr@amrdec.army.mil>
Caleb Spare <cespare@gmail.com> Caleb Spare <cespare@gmail.com>
Calen Pennington <cale@edx.org> Calen Pennington <cale@edx.org>
Calvin Liu <flycalvin@qq.com>
Cameron Boehmer <cameron.boehmer@gmail.com> Cameron Boehmer <cameron.boehmer@gmail.com>
Cameron Sparr <gh@sparr.email> Cameron Sparr <gh@sparr.email>
Cameron Spear <cameronspear@gmail.com> Cameron Spear <cameronspear@gmail.com>
@ -362,6 +366,7 @@ Chen Qiu <cheney-90@hotmail.com>
Cheng-mean Liu <soccerl@microsoft.com> Cheng-mean Liu <soccerl@microsoft.com>
Chengfei Shang <cfshang@alauda.io> Chengfei Shang <cfshang@alauda.io>
Chengguang Xu <cgxu519@gmx.com> Chengguang Xu <cgxu519@gmx.com>
Chentianze <cmoman@126.com>
Chenyang Yan <memory.yancy@gmail.com> Chenyang Yan <memory.yancy@gmail.com>
chenyuzhu <chenyuzhi@oschina.cn> chenyuzhu <chenyuzhi@oschina.cn>
Chetan Birajdar <birajdar.chetan@gmail.com> Chetan Birajdar <birajdar.chetan@gmail.com>
@ -409,6 +414,7 @@ Christopher Crone <christopher.crone@docker.com>
Christopher Currie <codemonkey+github@gmail.com> Christopher Currie <codemonkey+github@gmail.com>
Christopher Jones <tophj@linux.vnet.ibm.com> Christopher Jones <tophj@linux.vnet.ibm.com>
Christopher Latham <sudosurootdev@gmail.com> Christopher Latham <sudosurootdev@gmail.com>
Christopher Petito <chrisjpetito@gmail.com>
Christopher Rigor <crigor@gmail.com> Christopher Rigor <crigor@gmail.com>
Christy Norman <christy@linux.vnet.ibm.com> Christy Norman <christy@linux.vnet.ibm.com>
Chun Chen <ramichen@tencent.com> Chun Chen <ramichen@tencent.com>
@ -777,6 +783,7 @@ Gabriel L. Somlo <gsomlo@gmail.com>
Gabriel Linder <linder.gabriel@gmail.com> Gabriel Linder <linder.gabriel@gmail.com>
Gabriel Monroy <gabriel@opdemand.com> Gabriel Monroy <gabriel@opdemand.com>
Gabriel Nicolas Avellaneda <avellaneda.gabriel@gmail.com> Gabriel Nicolas Avellaneda <avellaneda.gabriel@gmail.com>
Gabriel Tomitsuka <gabriel@tomitsuka.com>
Gaetan de Villele <gdevillele@gmail.com> Gaetan de Villele <gdevillele@gmail.com>
Galen Sampson <galen.sampson@gmail.com> Galen Sampson <galen.sampson@gmail.com>
Gang Qiao <qiaohai8866@gmail.com> Gang Qiao <qiaohai8866@gmail.com>
@ -792,6 +799,7 @@ Geoff Levand <geoff@infradead.org>
Geoffrey Bachelet <grosfrais@gmail.com> Geoffrey Bachelet <grosfrais@gmail.com>
Geon Kim <geon0250@gmail.com> Geon Kim <geon0250@gmail.com>
George Kontridze <george@bugsnag.com> George Kontridze <george@bugsnag.com>
George Ma <mayangang@outlook.com>
George MacRorie <gmacr31@gmail.com> George MacRorie <gmacr31@gmail.com>
George Xie <georgexsh@gmail.com> George Xie <georgexsh@gmail.com>
Georgi Hristozov <georgi@forkbomb.nl> Georgi Hristozov <georgi@forkbomb.nl>
@ -913,6 +921,7 @@ Illo Abdulrahim <abdulrahim.illo@nokia.com>
Ilya Dmitrichenko <errordeveloper@gmail.com> Ilya Dmitrichenko <errordeveloper@gmail.com>
Ilya Gusev <mail@igusev.ru> Ilya Gusev <mail@igusev.ru>
Ilya Khlopotov <ilya.khlopotov@gmail.com> Ilya Khlopotov <ilya.khlopotov@gmail.com>
imalasong <2879499479@qq.com>
imre Fitos <imre.fitos+github@gmail.com> imre Fitos <imre.fitos+github@gmail.com>
inglesp <peter.inglesby@gmail.com> inglesp <peter.inglesby@gmail.com>
Ingo Gottwald <in.gottwald@gmail.com> Ingo Gottwald <in.gottwald@gmail.com>
@ -930,6 +939,7 @@ J Bruni <joaohbruni@yahoo.com.br>
J. Nunn <jbnunn@gmail.com> J. Nunn <jbnunn@gmail.com>
Jack Danger Canty <jackdanger@squareup.com> Jack Danger Canty <jackdanger@squareup.com>
Jack Laxson <jackjrabbit@gmail.com> Jack Laxson <jackjrabbit@gmail.com>
Jack Walker <90711509+j2walker@users.noreply.github.com>
Jacob Atzen <jacob@jacobatzen.dk> Jacob Atzen <jacob@jacobatzen.dk>
Jacob Edelman <edelman.jd@gmail.com> Jacob Edelman <edelman.jd@gmail.com>
Jacob Tomlinson <jacob@tom.linson.uk> Jacob Tomlinson <jacob@tom.linson.uk>
@ -989,6 +999,7 @@ Jason Shepherd <jason@jasonshepherd.net>
Jason Smith <jasonrichardsmith@gmail.com> Jason Smith <jasonrichardsmith@gmail.com>
Jason Sommer <jsdirv@gmail.com> Jason Sommer <jsdirv@gmail.com>
Jason Stangroome <jason@codeassassin.com> Jason Stangroome <jason@codeassassin.com>
Jasper Siepkes <siepkes@serviceplanet.nl>
Javier Bassi <javierbassi@gmail.com> Javier Bassi <javierbassi@gmail.com>
jaxgeller <jacksongeller@gmail.com> jaxgeller <jacksongeller@gmail.com>
Jay <teguhwpurwanto@gmail.com> Jay <teguhwpurwanto@gmail.com>
@ -1100,6 +1111,7 @@ Jon Johnson <jonjohnson@google.com>
Jon Surrell <jon.surrell@gmail.com> Jon Surrell <jon.surrell@gmail.com>
Jon Wedaman <jweede@gmail.com> Jon Wedaman <jweede@gmail.com>
Jonas Dohse <jonas@dohse.ch> Jonas Dohse <jonas@dohse.ch>
Jonas Geiler <git@jonasgeiler.com>
Jonas Heinrich <Jonas@JonasHeinrich.com> Jonas Heinrich <Jonas@JonasHeinrich.com>
Jonas Pfenniger <jonas@pfenniger.name> Jonas Pfenniger <jonas@pfenniger.name>
Jonathan A. Schweder <jonathanschweder@gmail.com> Jonathan A. Schweder <jonathanschweder@gmail.com>
@ -1267,6 +1279,7 @@ Lakshan Perera <lakshan@laktek.com>
Lalatendu Mohanty <lmohanty@redhat.com> Lalatendu Mohanty <lmohanty@redhat.com>
Lance Chen <cyen0312@gmail.com> Lance Chen <cyen0312@gmail.com>
Lance Kinley <lkinley@loyaltymethods.com> Lance Kinley <lkinley@loyaltymethods.com>
Lars Andringa <l.s.andringa@rug.nl>
Lars Butler <Lars.Butler@gmail.com> Lars Butler <Lars.Butler@gmail.com>
Lars Kellogg-Stedman <lars@redhat.com> Lars Kellogg-Stedman <lars@redhat.com>
Lars R. Damerow <lars@pixar.com> Lars R. Damerow <lars@pixar.com>
@ -1673,6 +1686,7 @@ Patrick Böänziger <patrick.baenziger@bsi-software.com>
Patrick Devine <patrick.devine@docker.com> Patrick Devine <patrick.devine@docker.com>
Patrick Haas <patrickhaas@google.com> Patrick Haas <patrickhaas@google.com>
Patrick Hemmer <patrick.hemmer@gmail.com> Patrick Hemmer <patrick.hemmer@gmail.com>
Patrick St. laurent <patrick@saint-laurent.us>
Patrick Stapleton <github@gdi2290.com> Patrick Stapleton <github@gdi2290.com>
Patrik Cyvoct <patrik@ptrk.io> Patrik Cyvoct <patrik@ptrk.io>
pattichen <craftsbear@gmail.com> pattichen <craftsbear@gmail.com>
@ -1878,6 +1892,7 @@ Royce Remer <royceremer@gmail.com>
Rozhnov Alexandr <nox73@ya.ru> Rozhnov Alexandr <nox73@ya.ru>
Rudolph Gottesheim <r.gottesheim@loot.at> Rudolph Gottesheim <r.gottesheim@loot.at>
Rui Cao <ruicao@alauda.io> Rui Cao <ruicao@alauda.io>
Rui JingAn <quiterace@gmail.com>
Rui Lopes <rgl@ruilopes.com> Rui Lopes <rgl@ruilopes.com>
Ruilin Li <liruilin4@huawei.com> Ruilin Li <liruilin4@huawei.com>
Runshen Zhu <runshen.zhu@gmail.com> Runshen Zhu <runshen.zhu@gmail.com>
@ -2184,6 +2199,7 @@ Tomek Mańko <tomek.manko@railgun-solutions.com>
Tommaso Visconti <tommaso.visconti@gmail.com> Tommaso Visconti <tommaso.visconti@gmail.com>
Tomoya Tabuchi <t@tomoyat1.com> Tomoya Tabuchi <t@tomoyat1.com>
Tomáš Hrčka <thrcka@redhat.com> Tomáš Hrčka <thrcka@redhat.com>
Tomáš Virtus <nechtom@gmail.com>
tonic <tonicbupt@gmail.com> tonic <tonicbupt@gmail.com>
Tonny Xu <tonny.xu@gmail.com> Tonny Xu <tonny.xu@gmail.com>
Tony Abboud <tdabboud@hotmail.com> Tony Abboud <tdabboud@hotmail.com>
@ -2228,6 +2244,7 @@ Victor I. Wood <viw@t2am.com>
Victor Lyuboslavsky <victor@victoreda.com> Victor Lyuboslavsky <victor@victoreda.com>
Victor Marmol <vmarmol@google.com> Victor Marmol <vmarmol@google.com>
Victor Palma <palma.victor@gmail.com> Victor Palma <palma.victor@gmail.com>
Victor Toni <victor.toni@gmail.com>
Victor Vieux <victor.vieux@docker.com> Victor Vieux <victor.vieux@docker.com>
Victoria Bialas <victoria.bialas@docker.com> Victoria Bialas <victoria.bialas@docker.com>
Vijaya Kumar K <vijayak@caviumnetworks.com> Vijaya Kumar K <vijayak@caviumnetworks.com>
@ -2279,6 +2296,7 @@ Wassim Dhif <wassimdhif@gmail.com>
Wataru Ishida <ishida.wataru@lab.ntt.co.jp> Wataru Ishida <ishida.wataru@lab.ntt.co.jp>
Wayne Chang <wayne@neverfear.org> Wayne Chang <wayne@neverfear.org>
Wayne Song <wsong@docker.com> Wayne Song <wsong@docker.com>
weebney <weebney@gmail.com>
Weerasak Chongnguluam <singpor@gmail.com> Weerasak Chongnguluam <singpor@gmail.com>
Wei Fu <fuweid89@gmail.com> Wei Fu <fuweid89@gmail.com>
Wei Wu <wuwei4455@gmail.com> Wei Wu <wuwei4455@gmail.com>

View File

@ -2059,7 +2059,7 @@ definitions:
Depending on how the image was created, this field may be empty. Depending on how the image was created, this field may be empty.
type: "string" type: "string"
x-nullable: false x-nullable: false
example: "20.10.7" example: "27.0.1"
Author: Author:
description: | description: |
Name of the author that was specified when committing the image, or as Name of the author that was specified when committing the image, or as
@ -4102,6 +4102,13 @@ definitions:
but this is just provided for lookup/display purposes. The but this is just provided for lookup/display purposes. The
secret in the reference will be identified by its ID. secret in the reference will be identified by its ID.
type: "string" 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: Configs:
description: | description: |
Configs contains references to zero or more configs that will be Configs contains references to zero or more configs that will be
@ -4298,7 +4305,7 @@ definitions:
`node.platform.os` | Node operating system | `node.platform.os==windows` `node.platform.os` | Node operating system | `node.platform.os==windows`
`node.platform.arch` | Node architecture | `node.platform.arch==x86_64` `node.platform.arch` | Node architecture | `node.platform.arch==x86_64`
`node.labels` | User-defined node labels | `node.labels.security==high` `node.labels` | User-defined node labels | `node.labels.security==high`
`engine.labels` | Docker Engine's labels | `engine.labels.operatingsystem==ubuntu-14.04` `engine.labels` | Docker Engine's labels | `engine.labels.operatingsystem==ubuntu-24.04`
`engine.labels` apply to Docker Engine labels like operating system, `engine.labels` apply to Docker Engine labels like operating system,
drivers, etc. Swarm administrators add `node.labels` for operational drivers, etc. Swarm administrators add `node.labels` for operational
@ -5295,7 +5302,7 @@ definitions:
Version of the component Version of the component
type: "string" type: "string"
x-nullable: false x-nullable: false
example: "19.03.12" example: "27.0.1"
Details: Details:
description: | description: |
Key/value pairs of strings with additional information about the Key/value pairs of strings with additional information about the
@ -5309,17 +5316,17 @@ definitions:
Version: Version:
description: "The version of the daemon" description: "The version of the daemon"
type: "string" type: "string"
example: "19.03.12" example: "27.0.1"
ApiVersion: ApiVersion:
description: | description: |
The default (and highest) API version that is supported by the daemon The default (and highest) API version that is supported by the daemon
type: "string" type: "string"
example: "1.40" example: "1.46"
MinAPIVersion: MinAPIVersion:
description: | description: |
The minimum API version that is supported by the daemon The minimum API version that is supported by the daemon
type: "string" type: "string"
example: "1.12" example: "1.24"
GitCommit: GitCommit:
description: | description: |
The Git commit of the source code that was used to build the daemon The Git commit of the source code that was used to build the daemon
@ -5330,7 +5337,7 @@ definitions:
The version Go used to compile the daemon, and the version of the Go The version Go used to compile the daemon, and the version of the Go
runtime in use. runtime in use.
type: "string" type: "string"
example: "go1.13.14" example: "go1.21.11"
Os: Os:
description: | description: |
The operating system that the daemon is running on ("linux" or "windows") The operating system that the daemon is running on ("linux" or "windows")
@ -5347,7 +5354,7 @@ definitions:
This field is omitted when empty. This field is omitted when empty.
type: "string" type: "string"
example: "4.19.76-linuxkit" example: "6.8.0-31-generic"
Experimental: Experimental:
description: | description: |
Indicates if the daemon is started with experimental features enabled. Indicates if the daemon is started with experimental features enabled.
@ -5553,13 +5560,13 @@ definitions:
information is queried from the <kbd>HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\</kbd> 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)"_. registry value, for example _"10.0 14393 (14393.1198.amd64fre.rs1_release_sec.170427-1353)"_.
type: "string" type: "string"
example: "4.9.38-moby" example: "6.8.0-31-generic"
OperatingSystem: OperatingSystem:
description: | description: |
Name of the host's operating system, for example: "Ubuntu 16.04.2 LTS" Name of the host's operating system, for example: "Ubuntu 24.04 LTS"
or "Windows Server 2016 Datacenter" or "Windows Server 2016 Datacenter"
type: "string" type: "string"
example: "Alpine Linux v3.5" example: "Ubuntu 24.04 LTS"
OSVersion: OSVersion:
description: | description: |
Version of the host's operating system Version of the host's operating system
@ -5570,7 +5577,7 @@ definitions:
> very existence, and the formatting of values, should not be considered > very existence, and the formatting of values, should not be considered
> stable, and may change without notice. > stable, and may change without notice.
type: "string" type: "string"
example: "16.04" example: "24.04"
OSType: OSType:
description: | description: |
Generic type of the operating system of the host, as returned by the Generic type of the operating system of the host, as returned by the
@ -5672,7 +5679,7 @@ definitions:
description: | description: |
Version string of the daemon. Version string of the daemon.
type: "string" type: "string"
example: "24.0.2" example: "27.0.1"
Runtimes: Runtimes:
description: | description: |
List of [OCI compliant](https://github.com/opencontainers/runtime-spec) List of [OCI compliant](https://github.com/opencontainers/runtime-spec)
@ -11722,6 +11729,7 @@ paths:
Mode: 384 Mode: 384
SecretID: "fpjqlhnwb19zds35k8wn80lq9" SecretID: "fpjqlhnwb19zds35k8wn80lq9"
SecretName: "example_org_domain_key" SecretName: "example_org_domain_key"
OomScoreAdj: 0
LogDriver: LogDriver:
Name: "json-file" Name: "json-file"
Options: Options:
@ -11874,6 +11882,7 @@ paths:
Image: "busybox" Image: "busybox"
Args: Args:
- "top" - "top"
OomScoreAdj: 0
Resources: Resources:
Limits: {} Limits: {}
Reservations: {} Reservations: {}

View File

@ -9,7 +9,6 @@ import (
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
"github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/registry"
units "github.com/docker/go-units"
) )
// NewHijackedResponse intializes a HijackedResponse type // NewHijackedResponse intializes a HijackedResponse type
@ -74,7 +73,7 @@ type ImageBuildOptions struct {
NetworkMode string NetworkMode string
ShmSize int64 ShmSize int64
Dockerfile string Dockerfile string
Ulimits []*units.Ulimit Ulimits []*container.Ulimit
// BuildArgs needs to be a *string instead of just a string so that // BuildArgs needs to be a *string instead of just a string so that
// we can tell the difference between "" (empty string) and no value // we can tell the difference between "" (empty string) and no value
// at all (nil). See the parsing of buildArgs in // at all (nil). See the parsing of buildArgs in
@ -95,7 +94,7 @@ type ImageBuildOptions struct {
Target string Target string
SessionID string SessionID string
Platform string Platform string
// Version specifies the version of the unerlying builder to use // Version specifies the version of the underlying builder to use
Version BuilderVersion Version BuilderVersion
// BuildID is an optional identifier that can be passed together with the // 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 request. The same identifier can be used to gracefully cancel the

View File

@ -31,9 +31,14 @@ type CopyToContainerOptions struct {
CopyUIDGID bool CopyUIDGID bool
} }
// StatsResponse contains response of Engine API: // StatsResponseReader wraps an io.ReadCloser to read (a stream of) stats
// GET "/stats" // for a container, as produced by the GET "/stats" endpoint.
type StatsResponse struct { //
// 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"` Body io.ReadCloser `json:"body"`
OSType string `json:"ostype"` OSType string `json:"ostype"`
} }

View File

@ -360,6 +360,12 @@ type LogConfig struct {
Config map[string]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...) // Resources contains container's resources (cgroups config, ulimits...)
type Resources struct { type Resources struct {
// Applicable to all platforms // Applicable to all platforms
@ -387,14 +393,14 @@ type Resources struct {
// KernelMemory specifies the kernel memory limit (in bytes) for the container. // KernelMemory specifies the kernel memory limit (in bytes) for the container.
// Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes. // Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes.
KernelMemory int64 `json:",omitempty"` KernelMemory int64 `json:",omitempty"`
KernelMemoryTCP int64 `json:",omitempty"` // Hard limit for kernel TCP buffer memory (in bytes) KernelMemoryTCP int64 `json:",omitempty"` // Hard limit for kernel TCP buffer memory (in bytes)
MemoryReservation int64 // Memory soft limit (in bytes) MemoryReservation int64 // Memory soft limit (in bytes)
MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap
MemorySwappiness *int64 // Tuning container memory swappiness behaviour MemorySwappiness *int64 // Tuning container memory swappiness behaviour
OomKillDisable *bool // Whether to disable OOM Killer or not 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. PidsLimit *int64 // Setting PIDs limit for a container; Set `0` or `-1` for unlimited, or `null` to not change.
Ulimits []*units.Ulimit // List of ulimits to be set in the container Ulimits []*Ulimit // List of ulimits to be set in the container
// Applicable to Windows // Applicable to Windows
CPUCount int64 `json:"CpuCount"` // CPU count CPUCount int64 `json:"CpuCount"` // CPU count

View File

@ -1,6 +1,4 @@
// Package types is used for API stability in the types and response to the package container
// consumers of the API stats endpoint.
package types // import "github.com/docker/docker/api/types"
import "time" import "time"
@ -169,8 +167,10 @@ type Stats struct {
MemoryStats MemoryStats `json:"memory_stats,omitempty"` MemoryStats MemoryStats `json:"memory_stats,omitempty"`
} }
// StatsJSON is newly used Networks // StatsResponse is newly used Networks.
type StatsJSON struct { //
// 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 Stats
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`

View File

@ -5,7 +5,6 @@ import (
"github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/mount"
"github.com/docker/go-units"
) )
// DNSConfig specifies DNS related configurations in resolver configuration file (resolv.conf) // DNSConfig specifies DNS related configurations in resolver configuration file (resolv.conf)
@ -115,5 +114,6 @@ type ContainerSpec struct {
Sysctls map[string]string `json:",omitempty"` Sysctls map[string]string `json:",omitempty"`
CapabilityAdd []string `json:",omitempty"` CapabilityAdd []string `json:",omitempty"`
CapabilityDrop []string `json:",omitempty"` CapabilityDrop []string `json:",omitempty"`
Ulimits []*units.Ulimit `json:",omitempty"` Ulimits []*container.Ulimit `json:",omitempty"`
OomScoreAdj int64 `json:",omitempty"`
} }

View File

@ -111,8 +111,69 @@ type CopyToContainerOptions = container.CopyToContainerOptions
// ContainerStats contains response of Engine API: // ContainerStats contains response of Engine API:
// GET "/stats" // 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]. // Deprecated: use [container.StatsResponse].
type ContainerStats = container.StatsResponse type StatsJSON = container.StatsResponse
// EventsOptions holds parameters to filter events with. // EventsOptions holds parameters to filter events with.
// //

View File

@ -9,7 +9,7 @@ import (
// ContainerStats returns near realtime stats for a given container. // ContainerStats returns near realtime stats for a given container.
// It's up to the caller to close the io.ReadCloser returned. // It's up to the caller to close the io.ReadCloser returned.
func (cli *Client) ContainerStats(ctx context.Context, containerID string, stream bool) (container.StatsResponse, error) { func (cli *Client) ContainerStats(ctx context.Context, containerID string, stream bool) (container.StatsResponseReader, error) {
query := url.Values{} query := url.Values{}
query.Set("stream", "0") query.Set("stream", "0")
if stream { if stream {
@ -18,10 +18,10 @@ func (cli *Client) ContainerStats(ctx context.Context, containerID string, strea
resp, err := cli.get(ctx, "/containers/"+containerID+"/stats", query, nil) resp, err := cli.get(ctx, "/containers/"+containerID+"/stats", query, nil)
if err != nil { if err != nil {
return container.StatsResponse{}, err return container.StatsResponseReader{}, err
} }
return container.StatsResponse{ return container.StatsResponseReader{
Body: resp.body, Body: resp.body,
OSType: getDockerOS(resp.header.Get("Server")), OSType: getDockerOS(resp.header.Get("Server")),
}, nil }, nil
@ -29,17 +29,17 @@ func (cli *Client) ContainerStats(ctx context.Context, containerID string, strea
// ContainerStatsOneShot gets a single stat entry from a container. // ContainerStatsOneShot gets a single stat entry from a container.
// It differs from `ContainerStats` in that the API should not wait to prime the stats // 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.StatsResponse, error) { func (cli *Client) ContainerStatsOneShot(ctx context.Context, containerID string) (container.StatsResponseReader, error) {
query := url.Values{} query := url.Values{}
query.Set("stream", "0") query.Set("stream", "0")
query.Set("one-shot", "1") query.Set("one-shot", "1")
resp, err := cli.get(ctx, "/containers/"+containerID+"/stats", query, nil) resp, err := cli.get(ctx, "/containers/"+containerID+"/stats", query, nil)
if err != nil { if err != nil {
return container.StatsResponse{}, err return container.StatsResponseReader{}, err
} }
return container.StatsResponse{ return container.StatsResponseReader{
Body: resp.body, Body: resp.body,
OSType: getDockerOS(resp.header.Get("Server")), OSType: getDockerOS(resp.header.Get("Server")),
}, nil }, nil

View File

@ -67,8 +67,8 @@ type ContainerAPIClient interface {
ContainerResize(ctx context.Context, container string, options container.ResizeOptions) error ContainerResize(ctx context.Context, container string, options container.ResizeOptions) error
ContainerRestart(ctx context.Context, container string, options container.StopOptions) error ContainerRestart(ctx context.Context, container string, options container.StopOptions) error
ContainerStatPath(ctx context.Context, container, path string) (container.PathStat, error) ContainerStatPath(ctx context.Context, container, path string) (container.PathStat, error)
ContainerStats(ctx context.Context, container string, stream bool) (container.StatsResponse, error) ContainerStats(ctx context.Context, container string, stream bool) (container.StatsResponseReader, error)
ContainerStatsOneShot(ctx context.Context, container string) (container.StatsResponse, error) ContainerStatsOneShot(ctx context.Context, container string) (container.StatsResponseReader, error)
ContainerStart(ctx context.Context, container string, options container.StartOptions) error ContainerStart(ctx context.Context, container string, options container.StartOptions) error
ContainerStop(ctx context.Context, container string, options container.StopOptions) error ContainerStop(ctx context.Context, container string, options container.StopOptions) error
ContainerTop(ctx context.Context, container string, arguments []string) (container.ContainerTopOKBody, error) ContainerTop(ctx context.Context, container string, arguments []string) (container.ContainerTopOKBody, error)

View File

@ -108,16 +108,18 @@ func v2AuthHTTPClient(endpoint *url.URL, authTransport http.RoundTripper, modifi
return nil, err return nil, err
} }
tokenHandlerOptions := auth.TokenHandlerOptions{ authHandlers := []auth.AuthenticationHandler{
Transport: authTransport, auth.NewTokenHandlerWithOptions(auth.TokenHandlerOptions{
Credentials: creds, Transport: authTransport,
OfflineAccess: true, Credentials: creds,
ClientID: AuthClientID, OfflineAccess: true,
Scopes: scopes, ClientID: AuthClientID,
Scopes: scopes,
}),
auth.NewBasicHandler(creds),
} }
tokenHandler := auth.NewTokenHandlerWithOptions(tokenHandlerOptions)
basicHandler := auth.NewBasicHandler(creds) modifiers = append(modifiers, auth.NewAuthorizer(challengeManager, authHandlers...))
modifiers = append(modifiers, auth.NewAuthorizer(challengeManager, tokenHandler, basicHandler))
return &http.Client{ return &http.Client{
Transport: transport.NewTransport(authTransport, modifiers...), Transport: transport.NewTransport(authTransport, modifiers...),

View File

@ -112,16 +112,12 @@ func (s *Service) searchUnfiltered(ctx context.Context, term string, limit int,
var client *http.Client var client *http.Client
if authConfig != nil && authConfig.IdentityToken != "" && authConfig.Username != "" { if authConfig != nil && authConfig.IdentityToken != "" && authConfig.Username != "" {
creds := NewStaticCredentialStore(authConfig) creds := NewStaticCredentialStore(authConfig)
scopes := []auth.Scope{
auth.RegistryScope{
Name: "catalog",
Actions: []string{"search"},
},
}
// TODO(thaJeztah); is there a reason not to include other headers here? (originally added in 19d48f0b8ba59eea9f2cac4ad1c7977712a6b7ac) // TODO(thaJeztah); is there a reason not to include other headers here? (originally added in 19d48f0b8ba59eea9f2cac4ad1c7977712a6b7ac)
modifiers := Headers(headers.Get("User-Agent"), nil) modifiers := Headers(headers.Get("User-Agent"), nil)
v2Client, err := v2AuthHTTPClient(endpoint.URL, endpoint.client.Transport, modifiers, creds, scopes) v2Client, err := v2AuthHTTPClient(endpoint.URL, endpoint.client.Transport, modifiers, creds, []auth.Scope{
auth.RegistryScope{Name: "catalog", Actions: []string{"search"}},
})
if err != nil { if err != nil {
return nil, err return nil, err
} }

2
vendor/modules.txt vendored
View File

@ -53,7 +53,7 @@ github.com/docker/distribution/registry/client/transport
github.com/docker/distribution/registry/storage/cache github.com/docker/distribution/registry/storage/cache
github.com/docker/distribution/registry/storage/cache/memory github.com/docker/distribution/registry/storage/cache/memory
github.com/docker/distribution/uuid github.com/docker/distribution/uuid
# github.com/docker/docker v27.0.0-rc.2+incompatible # github.com/docker/docker v27.0.0-rc.2.0.20240620105908-1a1f3cff45ec+incompatible
## explicit ## explicit
github.com/docker/docker/api github.com/docker/docker/api
github.com/docker/docker/api/types github.com/docker/docker/api/types