mirror of https://github.com/docker/cli.git
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:
parent
aebdf506bc
commit
2088c5963b
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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),
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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},
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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=
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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: {}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
@ -394,7 +400,7 @@ type Resources struct {
|
||||||
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
|
||||||
|
|
|
@ -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"`
|
|
@ -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"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
//
|
//
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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{
|
||||||
|
auth.NewTokenHandlerWithOptions(auth.TokenHandlerOptions{
|
||||||
Transport: authTransport,
|
Transport: authTransport,
|
||||||
Credentials: creds,
|
Credentials: creds,
|
||||||
OfflineAccess: true,
|
OfflineAccess: true,
|
||||||
ClientID: AuthClientID,
|
ClientID: AuthClientID,
|
||||||
Scopes: scopes,
|
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...),
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue