mirror of https://github.com/containers/podman.git
update to docker 27
Fixes compile issues with new docker changes, then fix all the new depreciation warnings. Also there seem to be larger pre-existing problems with the /containers/json API output as the HostConfig field seems to be missing but I don't have time to deal with that currently. Note this does not include changes for the new docker API 1.46. Signed-off-by: Paul Holzinger <pholzing@redhat.com>
This commit is contained in:
parent
360c4f372d
commit
e24367aa14
2
go.mod
2
go.mod
|
@ -30,7 +30,7 @@ require (
|
||||||
github.com/cyphar/filepath-securejoin v0.3.0
|
github.com/cyphar/filepath-securejoin v0.3.0
|
||||||
github.com/digitalocean/go-qemu v0.0.0-20230711162256-2e3d0186973e
|
github.com/digitalocean/go-qemu v0.0.0-20230711162256-2e3d0186973e
|
||||||
github.com/docker/distribution v2.8.3+incompatible
|
github.com/docker/distribution v2.8.3+incompatible
|
||||||
github.com/docker/docker v26.1.4+incompatible
|
github.com/docker/docker v27.0.3+incompatible
|
||||||
github.com/docker/go-connections v0.5.0
|
github.com/docker/go-connections v0.5.0
|
||||||
github.com/docker/go-plugins-helpers v0.0.0-20211224144127-6eecb7beb651
|
github.com/docker/go-plugins-helpers v0.0.0-20211224144127-6eecb7beb651
|
||||||
github.com/docker/go-units v0.5.0
|
github.com/docker/go-units v0.5.0
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -136,8 +136,8 @@ github.com/docker/cli v26.1.3+incompatible h1:bUpXT/N0kDE3VUHI2r5VMsYQgi38kYuoC0
|
||||||
github.com/docker/cli v26.1.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
github.com/docker/cli v26.1.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||||
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 v26.1.4+incompatible h1:vuTpXDuoga+Z38m1OZHzl7NKisKWaWlhjQk7IDPSLsU=
|
github.com/docker/docker v27.0.3+incompatible h1:aBGI9TeQ4MPlhquTQKq9XbK79rKFVwXNUAYz9aXyEBE=
|
||||||
github.com/docker/docker v26.1.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
github.com/docker/docker v27.0.3+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-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
|
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
|
||||||
|
|
|
@ -391,10 +391,13 @@ func LibpodToContainer(l *libpod.Container, sz bool) (*handlers.Container, error
|
||||||
Labels: l.Labels(),
|
Labels: l.Labels(),
|
||||||
State: stateStr,
|
State: stateStr,
|
||||||
Status: status,
|
Status: status,
|
||||||
|
// FIXME: this seems broken, the field is never shown in the API output.
|
||||||
HostConfig: struct {
|
HostConfig: struct {
|
||||||
NetworkMode string `json:",omitempty"`
|
NetworkMode string `json:",omitempty"`
|
||||||
|
Annotations map[string]string `json:",omitempty"`
|
||||||
}{
|
}{
|
||||||
"host",
|
NetworkMode: "host",
|
||||||
|
// TODO: add annotations here for >= v1.46
|
||||||
},
|
},
|
||||||
NetworkSettings: &networkSettings,
|
NetworkSettings: &networkSettings,
|
||||||
Mounts: mounts,
|
Mounts: mounts,
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
"github.com/containers/podman/v5/pkg/api/handlers/utils"
|
"github.com/containers/podman/v5/pkg/api/handlers/utils"
|
||||||
api "github.com/containers/podman/v5/pkg/api/types"
|
api "github.com/containers/podman/v5/pkg/api/types"
|
||||||
"github.com/containers/storage/pkg/system"
|
"github.com/containers/storage/pkg/system"
|
||||||
docker "github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types/container"
|
||||||
runccgroups "github.com/opencontainers/runc/libcontainer/cgroups"
|
runccgroups "github.com/opencontainers/runc/libcontainer/cgroups"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
@ -67,7 +67,7 @@ func StatsContainer(w http.ResponseWriter, r *http.Request) {
|
||||||
preRead = time.Now()
|
preRead = time.Now()
|
||||||
systemUsage, _ := cgroups.SystemCPUUsage()
|
systemUsage, _ := cgroups.SystemCPUUsage()
|
||||||
preCPUStats = CPUStats{
|
preCPUStats = CPUStats{
|
||||||
CPUUsage: docker.CPUUsage{
|
CPUUsage: container.CPUUsage{
|
||||||
TotalUsage: stats.CPUNano,
|
TotalUsage: stats.CPUNano,
|
||||||
PercpuUsage: stats.PerCPU,
|
PercpuUsage: stats.PerCPU,
|
||||||
UsageInKernelmode: stats.CPUSystemNano,
|
UsageInKernelmode: stats.CPUSystemNano,
|
||||||
|
@ -76,7 +76,7 @@ func StatsContainer(w http.ResponseWriter, r *http.Request) {
|
||||||
CPU: stats.CPU,
|
CPU: stats.CPU,
|
||||||
SystemUsage: systemUsage,
|
SystemUsage: systemUsage,
|
||||||
OnlineCPUs: 0,
|
OnlineCPUs: 0,
|
||||||
ThrottlingData: docker.ThrottlingData{},
|
ThrottlingData: container.ThrottlingData{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onlineCPUs, err := libpod.GetOnlineCPUs(ctnr)
|
onlineCPUs, err := libpod.GetOnlineCPUs(ctnr)
|
||||||
|
@ -119,9 +119,9 @@ streamLabel: // A label to flatten the scope
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
net := make(map[string]docker.NetworkStats)
|
net := make(map[string]container.NetworkStats)
|
||||||
for netName, netStats := range stats.Network {
|
for netName, netStats := range stats.Network {
|
||||||
net[netName] = docker.NetworkStats{
|
net[netName] = container.NetworkStats{
|
||||||
RxBytes: netStats.RxBytes,
|
RxBytes: netStats.RxBytes,
|
||||||
RxPackets: netStats.RxPackets,
|
RxPackets: netStats.RxPackets,
|
||||||
RxErrors: netStats.RxErrors,
|
RxErrors: netStats.RxErrors,
|
||||||
|
@ -156,11 +156,11 @@ streamLabel: // A label to flatten the scope
|
||||||
Stats: Stats{
|
Stats: Stats{
|
||||||
Read: time.Now(),
|
Read: time.Now(),
|
||||||
PreRead: preRead,
|
PreRead: preRead,
|
||||||
PidsStats: docker.PidsStats{
|
PidsStats: container.PidsStats{
|
||||||
Current: cgroupStat.PidsStats.Current,
|
Current: cgroupStat.PidsStats.Current,
|
||||||
Limit: 0,
|
Limit: 0,
|
||||||
},
|
},
|
||||||
BlkioStats: docker.BlkioStats{
|
BlkioStats: container.BlkioStats{
|
||||||
IoServiceBytesRecursive: toBlkioStatEntry(cgroupStat.BlkioStats.IoServiceBytesRecursive),
|
IoServiceBytesRecursive: toBlkioStatEntry(cgroupStat.BlkioStats.IoServiceBytesRecursive),
|
||||||
IoServicedRecursive: nil,
|
IoServicedRecursive: nil,
|
||||||
IoQueuedRecursive: nil,
|
IoQueuedRecursive: nil,
|
||||||
|
@ -171,7 +171,7 @@ streamLabel: // A label to flatten the scope
|
||||||
SectorsRecursive: nil,
|
SectorsRecursive: nil,
|
||||||
},
|
},
|
||||||
CPUStats: CPUStats{
|
CPUStats: CPUStats{
|
||||||
CPUUsage: docker.CPUUsage{
|
CPUUsage: container.CPUUsage{
|
||||||
TotalUsage: cgroupStat.CpuStats.CpuUsage.TotalUsage,
|
TotalUsage: cgroupStat.CpuStats.CpuUsage.TotalUsage,
|
||||||
PercpuUsage: cgroupStat.CpuStats.CpuUsage.PercpuUsage,
|
PercpuUsage: cgroupStat.CpuStats.CpuUsage.PercpuUsage,
|
||||||
UsageInKernelmode: cgroupStat.CpuStats.CpuUsage.UsageInKernelmode,
|
UsageInKernelmode: cgroupStat.CpuStats.CpuUsage.UsageInKernelmode,
|
||||||
|
@ -180,14 +180,14 @@ streamLabel: // A label to flatten the scope
|
||||||
CPU: stats.CPU,
|
CPU: stats.CPU,
|
||||||
SystemUsage: systemUsage,
|
SystemUsage: systemUsage,
|
||||||
OnlineCPUs: uint32(onlineCPUs),
|
OnlineCPUs: uint32(onlineCPUs),
|
||||||
ThrottlingData: docker.ThrottlingData{
|
ThrottlingData: container.ThrottlingData{
|
||||||
Periods: 0,
|
Periods: 0,
|
||||||
ThrottledPeriods: 0,
|
ThrottledPeriods: 0,
|
||||||
ThrottledTime: 0,
|
ThrottledTime: 0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
PreCPUStats: preCPUStats,
|
PreCPUStats: preCPUStats,
|
||||||
MemoryStats: docker.MemoryStats{
|
MemoryStats: container.MemoryStats{
|
||||||
Usage: cgroupStat.MemoryStats.Usage.Usage,
|
Usage: cgroupStat.MemoryStats.Usage.Usage,
|
||||||
MaxUsage: cgroupStat.MemoryStats.Usage.MaxUsage,
|
MaxUsage: cgroupStat.MemoryStats.Usage.MaxUsage,
|
||||||
Stats: nil,
|
Stats: nil,
|
||||||
|
@ -236,8 +236,8 @@ streamLabel: // A label to flatten the scope
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func toBlkioStatEntry(entries []runccgroups.BlkioStatEntry) []docker.BlkioStatEntry {
|
func toBlkioStatEntry(entries []runccgroups.BlkioStatEntry) []container.BlkioStatEntry {
|
||||||
results := make([]docker.BlkioStatEntry, len(entries))
|
results := make([]container.BlkioStatEntry, len(entries))
|
||||||
for i, e := range entries {
|
for i, e := range entries {
|
||||||
bits, err := json.Marshal(e)
|
bits, err := json.Marshal(e)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -13,7 +13,6 @@ import (
|
||||||
"github.com/containers/podman/v5/pkg/domain/entities"
|
"github.com/containers/podman/v5/pkg/domain/entities"
|
||||||
"github.com/containers/podman/v5/pkg/domain/infra/abi"
|
"github.com/containers/podman/v5/pkg/domain/infra/abi"
|
||||||
"github.com/containers/podman/v5/pkg/util"
|
"github.com/containers/podman/v5/pkg/util"
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
dockerImage "github.com/docker/docker/api/types/image"
|
dockerImage "github.com/docker/docker/api/types/image"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -65,7 +64,7 @@ func PruneImages(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
payload := handlers.ImagesPruneReport{
|
payload := handlers.ImagesPruneReport{
|
||||||
ImagesPruneReport: types.ImagesPruneReport{
|
ImagesPruneReport: dockerImage.PruneReport{
|
||||||
ImagesDeleted: idr,
|
ImagesDeleted: idr,
|
||||||
SpaceReclaimed: reclaimedSpace,
|
SpaceReclaimed: reclaimedSpace,
|
||||||
},
|
},
|
||||||
|
|
|
@ -16,7 +16,6 @@ import (
|
||||||
"github.com/containers/podman/v5/pkg/domain/entities"
|
"github.com/containers/podman/v5/pkg/domain/entities"
|
||||||
"github.com/containers/podman/v5/pkg/domain/infra/abi"
|
"github.com/containers/podman/v5/pkg/domain/infra/abi"
|
||||||
"github.com/containers/podman/v5/pkg/util"
|
"github.com/containers/podman/v5/pkg/util"
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"golang.org/x/exp/maps"
|
"golang.org/x/exp/maps"
|
||||||
|
|
||||||
dockerNetwork "github.com/docker/docker/api/types/network"
|
dockerNetwork "github.com/docker/docker/api/types/network"
|
||||||
|
@ -67,8 +66,8 @@ func InspectNetwork(w http.ResponseWriter, r *http.Request) {
|
||||||
utils.WriteResponse(w, http.StatusOK, report)
|
utils.WriteResponse(w, http.StatusOK, report)
|
||||||
}
|
}
|
||||||
|
|
||||||
func convertLibpodNetworktoDockerNetwork(runtime *libpod.Runtime, statuses []abi.ContainerNetStatus, network *nettypes.Network, changeDefaultName bool) *types.NetworkResource {
|
func convertLibpodNetworktoDockerNetwork(runtime *libpod.Runtime, statuses []abi.ContainerNetStatus, network *nettypes.Network, changeDefaultName bool) *dockerNetwork.Inspect {
|
||||||
containerEndpoints := make(map[string]types.EndpointResource, len(statuses))
|
containerEndpoints := make(map[string]dockerNetwork.EndpointResource, len(statuses))
|
||||||
for _, st := range statuses {
|
for _, st := range statuses {
|
||||||
if netData, ok := st.Status[network.Name]; ok {
|
if netData, ok := st.Status[network.Name]; ok {
|
||||||
ipv4Address := ""
|
ipv4Address := ""
|
||||||
|
@ -87,7 +86,7 @@ func convertLibpodNetworktoDockerNetwork(runtime *libpod.Runtime, statuses []abi
|
||||||
macAddr = dev.MacAddress.String()
|
macAddr = dev.MacAddress.String()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
containerEndpoint := types.EndpointResource{
|
containerEndpoint := dockerNetwork.EndpointResource{
|
||||||
Name: st.Name,
|
Name: st.Name,
|
||||||
MacAddress: macAddr,
|
MacAddress: macAddr,
|
||||||
IPv4Address: ipv4Address,
|
IPv4Address: ipv4Address,
|
||||||
|
@ -126,7 +125,7 @@ func convertLibpodNetworktoDockerNetwork(runtime *libpod.Runtime, statuses []abi
|
||||||
// https://github.com/containers/podman/issues/15580
|
// https://github.com/containers/podman/issues/15580
|
||||||
delete(options, nettypes.IsolateOption)
|
delete(options, nettypes.IsolateOption)
|
||||||
|
|
||||||
report := types.NetworkResource{
|
report := dockerNetwork.Inspect{
|
||||||
Name: name,
|
Name: name,
|
||||||
ID: network.ID,
|
ID: network.ID,
|
||||||
Driver: network.Driver,
|
Driver: network.Driver,
|
||||||
|
@ -171,7 +170,7 @@ func ListNetworks(w http.ResponseWriter, r *http.Request) {
|
||||||
utils.InternalServerError(w, err)
|
utils.InternalServerError(w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
reports := make([]*types.NetworkResource, 0, len(nets))
|
reports := make([]*dockerNetwork.Summary, 0, len(nets))
|
||||||
for _, net := range nets {
|
for _, net := range nets {
|
||||||
report := convertLibpodNetworktoDockerNetwork(runtime, statuses, &net, true)
|
report := convertLibpodNetworktoDockerNetwork(runtime, statuses, &net, true)
|
||||||
reports = append(reports, report)
|
reports = append(reports, report)
|
||||||
|
@ -181,7 +180,7 @@ func ListNetworks(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
func CreateNetwork(w http.ResponseWriter, r *http.Request) {
|
func CreateNetwork(w http.ResponseWriter, r *http.Request) {
|
||||||
var (
|
var (
|
||||||
networkCreate types.NetworkCreateRequest
|
networkCreate dockerNetwork.CreateRequest
|
||||||
network nettypes.Network
|
network nettypes.Network
|
||||||
responseWarning string
|
responseWarning string
|
||||||
)
|
)
|
||||||
|
@ -198,7 +197,9 @@ func CreateNetwork(w http.ResponseWriter, r *http.Request) {
|
||||||
network.Driver = networkCreate.Driver
|
network.Driver = networkCreate.Driver
|
||||||
network.Labels = networkCreate.Labels
|
network.Labels = networkCreate.Labels
|
||||||
network.Internal = networkCreate.Internal
|
network.Internal = networkCreate.Internal
|
||||||
network.IPv6Enabled = networkCreate.EnableIPv6
|
if networkCreate.EnableIPv6 != nil {
|
||||||
|
network.IPv6Enabled = *networkCreate.EnableIPv6
|
||||||
|
}
|
||||||
|
|
||||||
network.Options = make(map[string]string)
|
network.Options = make(map[string]string)
|
||||||
|
|
||||||
|
@ -357,7 +358,7 @@ func RemoveNetwork(w http.ResponseWriter, r *http.Request) {
|
||||||
func Connect(w http.ResponseWriter, r *http.Request) {
|
func Connect(w http.ResponseWriter, r *http.Request) {
|
||||||
runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime)
|
runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime)
|
||||||
|
|
||||||
var netConnect types.NetworkConnect
|
var netConnect dockerNetwork.ConnectOptions
|
||||||
if err := json.NewDecoder(r.Body).Decode(&netConnect); err != nil {
|
if err := json.NewDecoder(r.Body).Decode(&netConnect); err != nil {
|
||||||
utils.Error(w, http.StatusInternalServerError, fmt.Errorf("Decode(): %w", err))
|
utils.Error(w, http.StatusInternalServerError, fmt.Errorf("Decode(): %w", err))
|
||||||
return
|
return
|
||||||
|
@ -439,7 +440,7 @@ func Connect(w http.ResponseWriter, r *http.Request) {
|
||||||
func Disconnect(w http.ResponseWriter, r *http.Request) {
|
func Disconnect(w http.ResponseWriter, r *http.Request) {
|
||||||
runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime)
|
runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime)
|
||||||
|
|
||||||
var netDisconnect types.NetworkDisconnect
|
var netDisconnect dockerNetwork.DisconnectOptions
|
||||||
if err := json.NewDecoder(r.Body).Decode(&netDisconnect); err != nil {
|
if err := json.NewDecoder(r.Body).Decode(&netDisconnect); err != nil {
|
||||||
utils.Error(w, http.StatusInternalServerError, fmt.Errorf("Decode(): %w", err))
|
utils.Error(w, http.StatusInternalServerError, fmt.Errorf("Decode(): %w", err))
|
||||||
return
|
return
|
||||||
|
|
|
@ -58,7 +58,8 @@ func GetDiskUsage(w http.ResponseWriter, r *http.Request) {
|
||||||
State: o.Status,
|
State: o.Status,
|
||||||
Status: o.Status,
|
Status: o.Status,
|
||||||
HostConfig: struct {
|
HostConfig: struct {
|
||||||
NetworkMode string `json:",omitempty"`
|
NetworkMode string `json:",omitempty"`
|
||||||
|
Annotations map[string]string `json:",omitempty"`
|
||||||
}{},
|
}{},
|
||||||
NetworkSettings: nil,
|
NetworkSettings: nil,
|
||||||
Mounts: nil,
|
Mounts: nil,
|
||||||
|
|
|
@ -3,13 +3,13 @@ package compat
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
docker "github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types/container"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CPUStats aggregates and wraps all CPU related info of container
|
// CPUStats aggregates and wraps all CPU related info of container
|
||||||
type CPUStats struct {
|
type CPUStats struct {
|
||||||
// CPU Usage. Linux and Windows.
|
// CPU Usage. Linux and Windows.
|
||||||
CPUUsage docker.CPUUsage `json:"cpu_usage"`
|
CPUUsage container.CPUUsage `json:"cpu_usage"`
|
||||||
|
|
||||||
// System Usage. Linux only.
|
// System Usage. Linux only.
|
||||||
SystemUsage uint64 `json:"system_cpu_usage,omitempty"`
|
SystemUsage uint64 `json:"system_cpu_usage,omitempty"`
|
||||||
|
@ -21,7 +21,7 @@ type CPUStats struct {
|
||||||
CPU float64 `json:"cpu"`
|
CPU float64 `json:"cpu"`
|
||||||
|
|
||||||
// Throttling Data. Linux only.
|
// Throttling Data. Linux only.
|
||||||
ThrottlingData docker.ThrottlingData `json:"throttling_data,omitempty"`
|
ThrottlingData container.ThrottlingData `json:"throttling_data,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stats is Ultimate struct aggregating all types of stats of one container
|
// Stats is Ultimate struct aggregating all types of stats of one container
|
||||||
|
@ -31,17 +31,17 @@ type Stats struct {
|
||||||
PreRead time.Time `json:"preread"`
|
PreRead time.Time `json:"preread"`
|
||||||
|
|
||||||
// Linux specific stats, not populated on Windows.
|
// Linux specific stats, not populated on Windows.
|
||||||
PidsStats docker.PidsStats `json:"pids_stats,omitempty"`
|
PidsStats container.PidsStats `json:"pids_stats,omitempty"`
|
||||||
BlkioStats docker.BlkioStats `json:"blkio_stats,omitempty"`
|
BlkioStats container.BlkioStats `json:"blkio_stats,omitempty"`
|
||||||
|
|
||||||
// Windows specific stats, not populated on Linux.
|
// Windows specific stats, not populated on Linux.
|
||||||
NumProcs uint32 `json:"num_procs"`
|
NumProcs uint32 `json:"num_procs"`
|
||||||
StorageStats docker.StorageStats `json:"storage_stats,omitempty"`
|
StorageStats container.StorageStats `json:"storage_stats,omitempty"`
|
||||||
|
|
||||||
// Shared stats
|
// Shared stats
|
||||||
CPUStats CPUStats `json:"cpu_stats,omitempty"`
|
CPUStats CPUStats `json:"cpu_stats,omitempty"`
|
||||||
PreCPUStats CPUStats `json:"precpu_stats,omitempty"` // "Pre"="Previous"
|
PreCPUStats CPUStats `json:"precpu_stats,omitempty"` // "Pre"="Previous"
|
||||||
MemoryStats docker.MemoryStats `json:"memory_stats,omitempty"`
|
MemoryStats container.MemoryStats `json:"memory_stats,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type StatsJSON struct {
|
type StatsJSON struct {
|
||||||
|
@ -51,7 +51,7 @@ type StatsJSON struct {
|
||||||
ID string `json:"Id,omitempty"`
|
ID string `json:"Id,omitempty"`
|
||||||
|
|
||||||
// Networks request version >=1.21
|
// Networks request version >=1.21
|
||||||
Networks map[string]docker.NetworkStats `json:"networks,omitempty"`
|
Networks map[string]container.NetworkStats `json:"networks,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DockerStatsJSON is the same as StatsJSON except for the lowercase
|
// DockerStatsJSON is the same as StatsJSON except for the lowercase
|
||||||
|
@ -62,7 +62,6 @@ type DockerStatsJSON struct {
|
||||||
|
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
ID string `json:"id,omitempty"`
|
ID string `json:"id,omitempty"`
|
||||||
|
|
||||||
// Networks request version >=1.21
|
// Networks request version >=1.21
|
||||||
Networks map[string]docker.NetworkStats `json:"networks,omitempty"`
|
Networks map[string]container.NetworkStats `json:"networks,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,8 +17,7 @@ import (
|
||||||
"github.com/containers/podman/v5/pkg/domain/filters"
|
"github.com/containers/podman/v5/pkg/domain/filters"
|
||||||
"github.com/containers/podman/v5/pkg/domain/infra/abi/parse"
|
"github.com/containers/podman/v5/pkg/domain/infra/abi/parse"
|
||||||
"github.com/containers/podman/v5/pkg/util"
|
"github.com/containers/podman/v5/pkg/util"
|
||||||
docker_api_types "github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types/volume"
|
||||||
docker_api_types_volume "github.com/docker/docker/api/types/volume"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func ListVolumes(w http.ResponseWriter, r *http.Request) {
|
func ListVolumes(w http.ResponseWriter, r *http.Request) {
|
||||||
|
@ -55,14 +54,14 @@ func ListVolumes(w http.ResponseWriter, r *http.Request) {
|
||||||
utils.InternalServerError(w, err)
|
utils.InternalServerError(w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
volumeConfigs := make([]*docker_api_types_volume.Volume, 0, len(vols))
|
volumeConfigs := make([]*volume.Volume, 0, len(vols))
|
||||||
for _, v := range vols {
|
for _, v := range vols {
|
||||||
mp, err := v.MountPoint()
|
mp, err := v.MountPoint()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.InternalServerError(w, err)
|
utils.InternalServerError(w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
config := docker_api_types_volume.Volume{
|
config := volume.Volume{
|
||||||
Name: v.Name(),
|
Name: v.Name(),
|
||||||
Driver: v.Driver(),
|
Driver: v.Driver(),
|
||||||
Mountpoint: mp,
|
Mountpoint: mp,
|
||||||
|
@ -73,7 +72,7 @@ func ListVolumes(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
volumeConfigs = append(volumeConfigs, &config)
|
volumeConfigs = append(volumeConfigs, &config)
|
||||||
}
|
}
|
||||||
response := docker_api_types_volume.ListResponse{
|
response := volume.ListResponse{
|
||||||
Volumes: volumeConfigs,
|
Volumes: volumeConfigs,
|
||||||
Warnings: []string{},
|
Warnings: []string{},
|
||||||
}
|
}
|
||||||
|
@ -94,7 +93,7 @@ func CreateVolume(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// decode params from body
|
// decode params from body
|
||||||
input := docker_api_types_volume.CreateOptions{}
|
input := volume.CreateOptions{}
|
||||||
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
||||||
utils.Error(w, http.StatusInternalServerError, fmt.Errorf("Decode(): %w", err))
|
utils.Error(w, http.StatusInternalServerError, fmt.Errorf("Decode(): %w", err))
|
||||||
return
|
return
|
||||||
|
@ -121,7 +120,7 @@ func CreateVolume(w http.ResponseWriter, r *http.Request) {
|
||||||
utils.InternalServerError(w, err)
|
utils.InternalServerError(w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
response := docker_api_types_volume.Volume{
|
response := volume.Volume{
|
||||||
CreatedAt: existingVolume.CreatedTime().Format(time.RFC3339),
|
CreatedAt: existingVolume.CreatedTime().Format(time.RFC3339),
|
||||||
Driver: existingVolume.Driver(),
|
Driver: existingVolume.Driver(),
|
||||||
Labels: existingVolume.Labels(),
|
Labels: existingVolume.Labels(),
|
||||||
|
@ -166,7 +165,7 @@ func CreateVolume(w http.ResponseWriter, r *http.Request) {
|
||||||
utils.InternalServerError(w, err)
|
utils.InternalServerError(w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
volResponse := docker_api_types_volume.Volume{
|
volResponse := volume.Volume{
|
||||||
Name: config.Name,
|
Name: config.Name,
|
||||||
Driver: config.Driver,
|
Driver: config.Driver,
|
||||||
Mountpoint: mp,
|
Mountpoint: mp,
|
||||||
|
@ -196,7 +195,7 @@ func InspectVolume(w http.ResponseWriter, r *http.Request) {
|
||||||
utils.InternalServerError(w, err)
|
utils.InternalServerError(w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
volResponse := docker_api_types_volume.Volume{
|
volResponse := volume.Volume{
|
||||||
Name: vol.Name(),
|
Name: vol.Name(),
|
||||||
Driver: vol.Driver(),
|
Driver: vol.Driver(),
|
||||||
Mountpoint: mp,
|
Mountpoint: mp,
|
||||||
|
@ -307,7 +306,7 @@ func PruneVolumes(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
payload := handlers.VolumesPruneReport{
|
payload := handlers.VolumesPruneReport{
|
||||||
VolumesPruneReport: docker_api_types.VolumesPruneReport{
|
VolumesPruneReport: volume.PruneReport{
|
||||||
VolumesDeleted: prunedIds,
|
VolumesDeleted: prunedIds,
|
||||||
SpaceReclaimed: reclaimedSpace,
|
SpaceReclaimed: reclaimedSpace,
|
||||||
},
|
},
|
||||||
|
|
|
@ -3,8 +3,8 @@ package swagger
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/containers/podman/v5/pkg/domain/entities"
|
"github.com/containers/podman/v5/pkg/domain/entities"
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/api/types/container"
|
"github.com/docker/docker/api/types/container"
|
||||||
|
"github.com/docker/docker/api/types/network"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Details for creating a volume
|
// Details for creating a volume
|
||||||
|
@ -32,15 +32,15 @@ type volumeCreate struct {
|
||||||
|
|
||||||
// Network create
|
// Network create
|
||||||
// swagger:model
|
// swagger:model
|
||||||
type networkCreate types.NetworkCreateRequest
|
type networkCreate network.CreateRequest
|
||||||
|
|
||||||
// Network connect
|
// Network connect
|
||||||
// swagger:model
|
// swagger:model
|
||||||
type networkConnectRequest types.NetworkConnect
|
type networkConnectRequest network.ConnectOptions
|
||||||
|
|
||||||
// Network disconnect
|
// Network disconnect
|
||||||
// swagger:model
|
// swagger:model
|
||||||
type networkDisconnectRequest types.NetworkDisconnect
|
type networkDisconnectRequest network.DisconnectOptions
|
||||||
|
|
||||||
// Network connect
|
// Network connect
|
||||||
// swagger:model
|
// swagger:model
|
||||||
|
|
|
@ -11,7 +11,8 @@ import (
|
||||||
"github.com/containers/podman/v5/pkg/inspect"
|
"github.com/containers/podman/v5/pkg/inspect"
|
||||||
dockerAPI "github.com/docker/docker/api/types"
|
dockerAPI "github.com/docker/docker/api/types"
|
||||||
dockerImage "github.com/docker/docker/api/types/image"
|
dockerImage "github.com/docker/docker/api/types/image"
|
||||||
dockerVolume "github.com/docker/docker/api/types/volume"
|
"github.com/docker/docker/api/types/network"
|
||||||
|
"github.com/docker/docker/api/types/volume"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Image Tree
|
// Image Tree
|
||||||
|
@ -248,21 +249,21 @@ type containersList struct {
|
||||||
// swagger:response
|
// swagger:response
|
||||||
type volumeInspect struct {
|
type volumeInspect struct {
|
||||||
// in:body
|
// in:body
|
||||||
Body dockerVolume.Volume
|
Body volume.Volume
|
||||||
}
|
}
|
||||||
|
|
||||||
// Volume prune
|
// Volume prune
|
||||||
// swagger:response
|
// swagger:response
|
||||||
type volumePruneResponse struct {
|
type volumePruneResponse struct {
|
||||||
// in:body
|
// in:body
|
||||||
Body dockerAPI.VolumesPruneReport
|
Body volume.PruneReport
|
||||||
}
|
}
|
||||||
|
|
||||||
// Volume List
|
// Volume List
|
||||||
// swagger:response
|
// swagger:response
|
||||||
type volumeList struct {
|
type volumeList struct {
|
||||||
// in:body
|
// in:body
|
||||||
Body dockerVolume.ListResponse
|
Body volume.ListResponse
|
||||||
}
|
}
|
||||||
|
|
||||||
// Volume list
|
// Volume list
|
||||||
|
@ -343,14 +344,14 @@ type containerWaitResponse struct {
|
||||||
// swagger:response
|
// swagger:response
|
||||||
type networkInspectCompat struct {
|
type networkInspectCompat struct {
|
||||||
// in:body
|
// in:body
|
||||||
Body dockerAPI.NetworkResource
|
Body network.Inspect
|
||||||
}
|
}
|
||||||
|
|
||||||
// Network list
|
// Network list
|
||||||
// swagger:response
|
// swagger:response
|
||||||
type networkListCompat struct {
|
type networkListCompat struct {
|
||||||
// in:body
|
// in:body
|
||||||
Body []dockerAPI.NetworkResource
|
Body []network.Summary
|
||||||
}
|
}
|
||||||
|
|
||||||
// List Containers
|
// List Containers
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -3,7 +3,7 @@ package api // import "github.com/docker/docker/api"
|
||||||
// Common constants for daemon and client.
|
// Common constants for daemon and client.
|
||||||
const (
|
const (
|
||||||
// DefaultVersion of the current REST API.
|
// DefaultVersion of the current REST API.
|
||||||
DefaultVersion = "1.45"
|
DefaultVersion = "1.46"
|
||||||
|
|
||||||
// MinSupportedAPIVersion is the minimum API version that can be supported
|
// MinSupportedAPIVersion is the minimum API version that can be supported
|
||||||
// by the API server, specified as "major.minor". Note that the daemon
|
// by the API server, specified as "major.minor". Note that the daemon
|
||||||
|
|
|
@ -19,10 +19,10 @@ produces:
|
||||||
consumes:
|
consumes:
|
||||||
- "application/json"
|
- "application/json"
|
||||||
- "text/plain"
|
- "text/plain"
|
||||||
basePath: "/v1.45"
|
basePath: "/v1.46"
|
||||||
info:
|
info:
|
||||||
title: "Docker Engine API"
|
title: "Docker Engine API"
|
||||||
version: "1.45"
|
version: "1.46"
|
||||||
x-logo:
|
x-logo:
|
||||||
url: "https://docs.docker.com/assets/images/logo-docker-main.png"
|
url: "https://docs.docker.com/assets/images/logo-docker-main.png"
|
||||||
description: |
|
description: |
|
||||||
|
@ -55,8 +55,8 @@ info:
|
||||||
the URL is not supported by the daemon, a HTTP `400 Bad Request` error message
|
the URL is not supported by the daemon, a HTTP `400 Bad Request` error message
|
||||||
is returned.
|
is returned.
|
||||||
|
|
||||||
If you omit the version-prefix, the current version of the API (v1.45) is used.
|
If you omit the version-prefix, the current version of the API (v1.46) is used.
|
||||||
For example, calling `/info` is the same as calling `/v1.45/info`. Using the
|
For example, calling `/info` is the same as calling `/v1.46/info`. Using the
|
||||||
API without a version-prefix is deprecated and will be removed in a future release.
|
API without a version-prefix is deprecated and will be removed in a future release.
|
||||||
|
|
||||||
Engine releases in the near future should support this version of the API,
|
Engine releases in the near future should support this version of the API,
|
||||||
|
@ -442,6 +442,21 @@ definitions:
|
||||||
Mode:
|
Mode:
|
||||||
description: "The permission mode for the tmpfs mount in an integer."
|
description: "The permission mode for the tmpfs mount in an integer."
|
||||||
type: "integer"
|
type: "integer"
|
||||||
|
Options:
|
||||||
|
description: |
|
||||||
|
The options to be passed to the tmpfs mount. An array of arrays.
|
||||||
|
Flag options should be provided as 1-length arrays. Other types
|
||||||
|
should be provided as as 2-length arrays, where the first item is
|
||||||
|
the key and the second the value.
|
||||||
|
type: "array"
|
||||||
|
items:
|
||||||
|
type: "array"
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 2
|
||||||
|
items:
|
||||||
|
type: "string"
|
||||||
|
example:
|
||||||
|
[["noexec"]]
|
||||||
|
|
||||||
RestartPolicy:
|
RestartPolicy:
|
||||||
description: |
|
description: |
|
||||||
|
@ -1198,13 +1213,6 @@ definitions:
|
||||||
ContainerConfig:
|
ContainerConfig:
|
||||||
description: |
|
description: |
|
||||||
Configuration for a container that is portable between hosts.
|
Configuration for a container that is portable between hosts.
|
||||||
|
|
||||||
When used as `ContainerConfig` field in an image, `ContainerConfig` is an
|
|
||||||
optional field containing the configuration of the container that was last
|
|
||||||
committed when creating the image.
|
|
||||||
|
|
||||||
Previous versions of Docker builder used this field to store build cache,
|
|
||||||
and it is not in active use anymore.
|
|
||||||
type: "object"
|
type: "object"
|
||||||
properties:
|
properties:
|
||||||
Hostname:
|
Hostname:
|
||||||
|
@ -1363,6 +1371,289 @@ definitions:
|
||||||
type: "string"
|
type: "string"
|
||||||
example: ["/bin/sh", "-c"]
|
example: ["/bin/sh", "-c"]
|
||||||
|
|
||||||
|
ImageConfig:
|
||||||
|
description: |
|
||||||
|
Configuration of the image. These fields are used as defaults
|
||||||
|
when starting a container from the image.
|
||||||
|
type: "object"
|
||||||
|
properties:
|
||||||
|
Hostname:
|
||||||
|
description: |
|
||||||
|
The hostname to use for the container, as a valid RFC 1123 hostname.
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always empty. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "string"
|
||||||
|
example: ""
|
||||||
|
Domainname:
|
||||||
|
description: |
|
||||||
|
The domain name to use for the container.
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always empty. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "string"
|
||||||
|
example: ""
|
||||||
|
User:
|
||||||
|
description: "The user that commands are run as inside the container."
|
||||||
|
type: "string"
|
||||||
|
example: "web:web"
|
||||||
|
AttachStdin:
|
||||||
|
description: |
|
||||||
|
Whether to attach to `stdin`.
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always false. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "boolean"
|
||||||
|
default: false
|
||||||
|
example: false
|
||||||
|
AttachStdout:
|
||||||
|
description: |
|
||||||
|
Whether to attach to `stdout`.
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always false. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "boolean"
|
||||||
|
default: false
|
||||||
|
example: false
|
||||||
|
AttachStderr:
|
||||||
|
description: |
|
||||||
|
Whether to attach to `stderr`.
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always false. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "boolean"
|
||||||
|
default: false
|
||||||
|
example: false
|
||||||
|
ExposedPorts:
|
||||||
|
description: |
|
||||||
|
An object mapping ports to an empty object in the form:
|
||||||
|
|
||||||
|
`{"<port>/<tcp|udp|sctp>": {}}`
|
||||||
|
type: "object"
|
||||||
|
x-nullable: true
|
||||||
|
additionalProperties:
|
||||||
|
type: "object"
|
||||||
|
enum:
|
||||||
|
- {}
|
||||||
|
default: {}
|
||||||
|
example: {
|
||||||
|
"80/tcp": {},
|
||||||
|
"443/tcp": {}
|
||||||
|
}
|
||||||
|
Tty:
|
||||||
|
description: |
|
||||||
|
Attach standard streams to a TTY, including `stdin` if it is not closed.
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always false. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "boolean"
|
||||||
|
default: false
|
||||||
|
example: false
|
||||||
|
OpenStdin:
|
||||||
|
description: |
|
||||||
|
Open `stdin`
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always false. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "boolean"
|
||||||
|
default: false
|
||||||
|
example: false
|
||||||
|
StdinOnce:
|
||||||
|
description: |
|
||||||
|
Close `stdin` after one attached client disconnects.
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always false. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "boolean"
|
||||||
|
default: false
|
||||||
|
example: false
|
||||||
|
Env:
|
||||||
|
description: |
|
||||||
|
A list of environment variables to set inside the container in the
|
||||||
|
form `["VAR=value", ...]`. A variable without `=` is removed from the
|
||||||
|
environment, rather than to have an empty value.
|
||||||
|
type: "array"
|
||||||
|
items:
|
||||||
|
type: "string"
|
||||||
|
example:
|
||||||
|
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||||
|
Cmd:
|
||||||
|
description: |
|
||||||
|
Command to run specified as a string or an array of strings.
|
||||||
|
type: "array"
|
||||||
|
items:
|
||||||
|
type: "string"
|
||||||
|
example: ["/bin/sh"]
|
||||||
|
Healthcheck:
|
||||||
|
$ref: "#/definitions/HealthConfig"
|
||||||
|
ArgsEscaped:
|
||||||
|
description: "Command is already escaped (Windows only)"
|
||||||
|
type: "boolean"
|
||||||
|
default: false
|
||||||
|
example: false
|
||||||
|
x-nullable: true
|
||||||
|
Image:
|
||||||
|
description: |
|
||||||
|
The name (or reference) of the image to use when creating the container,
|
||||||
|
or which was used when the container was created.
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always empty. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "string"
|
||||||
|
default: ""
|
||||||
|
example: ""
|
||||||
|
Volumes:
|
||||||
|
description: |
|
||||||
|
An object mapping mount point paths inside the container to empty
|
||||||
|
objects.
|
||||||
|
type: "object"
|
||||||
|
additionalProperties:
|
||||||
|
type: "object"
|
||||||
|
enum:
|
||||||
|
- {}
|
||||||
|
default: {}
|
||||||
|
example:
|
||||||
|
"/app/data": {}
|
||||||
|
"/app/config": {}
|
||||||
|
WorkingDir:
|
||||||
|
description: "The working directory for commands to run in."
|
||||||
|
type: "string"
|
||||||
|
example: "/public/"
|
||||||
|
Entrypoint:
|
||||||
|
description: |
|
||||||
|
The entry point for the container as a string or an array of strings.
|
||||||
|
|
||||||
|
If the array consists of exactly one empty string (`[""]`) then the
|
||||||
|
entry point is reset to system default (i.e., the entry point used by
|
||||||
|
docker when there is no `ENTRYPOINT` instruction in the `Dockerfile`).
|
||||||
|
type: "array"
|
||||||
|
items:
|
||||||
|
type: "string"
|
||||||
|
example: []
|
||||||
|
NetworkDisabled:
|
||||||
|
description: |
|
||||||
|
Disable networking for the container.
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always omitted. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "boolean"
|
||||||
|
default: false
|
||||||
|
example: false
|
||||||
|
x-nullable: true
|
||||||
|
MacAddress:
|
||||||
|
description: |
|
||||||
|
MAC address of the container.
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always omitted. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "string"
|
||||||
|
default: ""
|
||||||
|
example: ""
|
||||||
|
x-nullable: true
|
||||||
|
OnBuild:
|
||||||
|
description: |
|
||||||
|
`ONBUILD` metadata that were defined in the image's `Dockerfile`.
|
||||||
|
type: "array"
|
||||||
|
x-nullable: true
|
||||||
|
items:
|
||||||
|
type: "string"
|
||||||
|
example: []
|
||||||
|
Labels:
|
||||||
|
description: "User-defined key/value metadata."
|
||||||
|
type: "object"
|
||||||
|
additionalProperties:
|
||||||
|
type: "string"
|
||||||
|
example:
|
||||||
|
com.example.some-label: "some-value"
|
||||||
|
com.example.some-other-label: "some-other-value"
|
||||||
|
StopSignal:
|
||||||
|
description: |
|
||||||
|
Signal to stop a container as a string or unsigned integer.
|
||||||
|
type: "string"
|
||||||
|
example: "SIGTERM"
|
||||||
|
x-nullable: true
|
||||||
|
StopTimeout:
|
||||||
|
description: |
|
||||||
|
Timeout to stop a container in seconds.
|
||||||
|
|
||||||
|
<p><br /></p>
|
||||||
|
|
||||||
|
> **Deprecated**: this field is not part of the image specification and is
|
||||||
|
> always omitted. It must not be used, and will be removed in API v1.47.
|
||||||
|
type: "integer"
|
||||||
|
default: 10
|
||||||
|
x-nullable: true
|
||||||
|
Shell:
|
||||||
|
description: |
|
||||||
|
Shell for when `RUN`, `CMD`, and `ENTRYPOINT` uses a shell.
|
||||||
|
type: "array"
|
||||||
|
x-nullable: true
|
||||||
|
items:
|
||||||
|
type: "string"
|
||||||
|
example: ["/bin/sh", "-c"]
|
||||||
|
# FIXME(thaJeztah): temporarily using a full example to remove some "omitempty" fields. Remove once the fields are removed.
|
||||||
|
example:
|
||||||
|
"Hostname": ""
|
||||||
|
"Domainname": ""
|
||||||
|
"User": "web:web"
|
||||||
|
"AttachStdin": false
|
||||||
|
"AttachStdout": false
|
||||||
|
"AttachStderr": false
|
||||||
|
"ExposedPorts": {
|
||||||
|
"80/tcp": {},
|
||||||
|
"443/tcp": {}
|
||||||
|
}
|
||||||
|
"Tty": false
|
||||||
|
"OpenStdin": false
|
||||||
|
"StdinOnce": false
|
||||||
|
"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"]
|
||||||
|
"Cmd": ["/bin/sh"]
|
||||||
|
"Healthcheck": {
|
||||||
|
"Test": ["string"],
|
||||||
|
"Interval": 0,
|
||||||
|
"Timeout": 0,
|
||||||
|
"Retries": 0,
|
||||||
|
"StartPeriod": 0,
|
||||||
|
"StartInterval": 0
|
||||||
|
}
|
||||||
|
"ArgsEscaped": true
|
||||||
|
"Image": ""
|
||||||
|
"Volumes": {
|
||||||
|
"/app/data": {},
|
||||||
|
"/app/config": {}
|
||||||
|
}
|
||||||
|
"WorkingDir": "/public/"
|
||||||
|
"Entrypoint": []
|
||||||
|
"OnBuild": []
|
||||||
|
"Labels": {
|
||||||
|
"com.example.some-label": "some-value",
|
||||||
|
"com.example.some-other-label": "some-other-value"
|
||||||
|
}
|
||||||
|
"StopSignal": "SIGTERM"
|
||||||
|
"Shell": ["/bin/sh", "-c"]
|
||||||
|
|
||||||
NetworkingConfig:
|
NetworkingConfig:
|
||||||
description: |
|
description: |
|
||||||
NetworkingConfig represents the container's networking configuration for
|
NetworkingConfig represents the container's networking configuration for
|
||||||
|
@ -1758,21 +2049,6 @@ definitions:
|
||||||
format: "dateTime"
|
format: "dateTime"
|
||||||
x-nullable: true
|
x-nullable: true
|
||||||
example: "2022-02-04T21:20:12.497794809Z"
|
example: "2022-02-04T21:20:12.497794809Z"
|
||||||
Container:
|
|
||||||
description: |
|
|
||||||
The ID of the container that was used to create the image.
|
|
||||||
|
|
||||||
Depending on how the image was created, this field may be empty.
|
|
||||||
|
|
||||||
**Deprecated**: this field is kept for backward compatibility, but
|
|
||||||
will be removed in API v1.45.
|
|
||||||
type: "string"
|
|
||||||
example: "65974bc86f1770ae4bff79f651ebdbce166ae9aada632ee3fa9af3a264911735"
|
|
||||||
ContainerConfig:
|
|
||||||
description: |
|
|
||||||
**Deprecated**: this field is kept for backward compatibility, but
|
|
||||||
will be removed in API v1.45.
|
|
||||||
$ref: "#/definitions/ContainerConfig"
|
|
||||||
DockerVersion:
|
DockerVersion:
|
||||||
description: |
|
description: |
|
||||||
The version of Docker that was used to build the image.
|
The version of Docker that was used to build the image.
|
||||||
|
@ -1780,7 +2056,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
|
||||||
|
@ -1789,7 +2065,7 @@ definitions:
|
||||||
x-nullable: false
|
x-nullable: false
|
||||||
example: ""
|
example: ""
|
||||||
Config:
|
Config:
|
||||||
$ref: "#/definitions/ContainerConfig"
|
$ref: "#/definitions/ImageConfig"
|
||||||
Architecture:
|
Architecture:
|
||||||
description: |
|
description: |
|
||||||
Hardware CPU architecture that the image runs on.
|
Hardware CPU architecture that the image runs on.
|
||||||
|
@ -1866,6 +2142,7 @@ definitions:
|
||||||
format: "dateTime"
|
format: "dateTime"
|
||||||
example: "2022-02-28T14:40:02.623929178Z"
|
example: "2022-02-28T14:40:02.623929178Z"
|
||||||
x-nullable: true
|
x-nullable: true
|
||||||
|
|
||||||
ImageSummary:
|
ImageSummary:
|
||||||
type: "object"
|
type: "object"
|
||||||
x-go-name: "Summary"
|
x-go-name: "Summary"
|
||||||
|
@ -2380,6 +2657,24 @@ definitions:
|
||||||
type: "string"
|
type: "string"
|
||||||
example: "10.133.77.91"
|
example: "10.133.77.91"
|
||||||
|
|
||||||
|
NetworkCreateResponse:
|
||||||
|
description: "OK response to NetworkCreate operation"
|
||||||
|
type: "object"
|
||||||
|
title: "NetworkCreateResponse"
|
||||||
|
x-go-name: "CreateResponse"
|
||||||
|
required: [Id, Warning]
|
||||||
|
properties:
|
||||||
|
Id:
|
||||||
|
description: "The ID of the created network."
|
||||||
|
type: "string"
|
||||||
|
x-nullable: false
|
||||||
|
example: "b5c4fc71e8022147cd25de22b22173de4e3b170134117172eb595cb91b4e7e5d"
|
||||||
|
Warning:
|
||||||
|
description: "Warnings encountered when creating the container"
|
||||||
|
type: "string"
|
||||||
|
x-nullable: false
|
||||||
|
example: ""
|
||||||
|
|
||||||
BuildInfo:
|
BuildInfo:
|
||||||
type: "object"
|
type: "object"
|
||||||
properties:
|
properties:
|
||||||
|
@ -2579,6 +2874,17 @@ definitions:
|
||||||
example:
|
example:
|
||||||
- "server_x"
|
- "server_x"
|
||||||
- "server_y"
|
- "server_y"
|
||||||
|
DriverOpts:
|
||||||
|
description: |
|
||||||
|
DriverOpts is a mapping of driver options and values. These options
|
||||||
|
are passed directly to the driver and are driver specific.
|
||||||
|
type: "object"
|
||||||
|
x-nullable: true
|
||||||
|
additionalProperties:
|
||||||
|
type: "string"
|
||||||
|
example:
|
||||||
|
com.example.some-label: "some-value"
|
||||||
|
com.example.some-other-label: "some-other-value"
|
||||||
|
|
||||||
# Operational data
|
# Operational data
|
||||||
NetworkID:
|
NetworkID:
|
||||||
|
@ -2622,17 +2928,6 @@ definitions:
|
||||||
type: "integer"
|
type: "integer"
|
||||||
format: "int64"
|
format: "int64"
|
||||||
example: 64
|
example: 64
|
||||||
DriverOpts:
|
|
||||||
description: |
|
|
||||||
DriverOpts is a mapping of driver options and values. These options
|
|
||||||
are passed directly to the driver and are driver specific.
|
|
||||||
type: "object"
|
|
||||||
x-nullable: true
|
|
||||||
additionalProperties:
|
|
||||||
type: "string"
|
|
||||||
example:
|
|
||||||
com.example.some-label: "some-value"
|
|
||||||
com.example.some-other-label: "some-other-value"
|
|
||||||
DNSNames:
|
DNSNames:
|
||||||
description: |
|
description: |
|
||||||
List of all DNS names an endpoint has on a specific network. This
|
List of all DNS names an endpoint has on a specific network. This
|
||||||
|
@ -3804,6 +4099,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
|
||||||
|
@ -4000,7 +4302,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
|
||||||
|
@ -4723,6 +5025,12 @@ definitions:
|
||||||
properties:
|
properties:
|
||||||
NetworkMode:
|
NetworkMode:
|
||||||
type: "string"
|
type: "string"
|
||||||
|
Annotations:
|
||||||
|
description: "Arbitrary key-value metadata attached to container"
|
||||||
|
type: "object"
|
||||||
|
x-nullable: true
|
||||||
|
additionalProperties:
|
||||||
|
type: "string"
|
||||||
NetworkSettings:
|
NetworkSettings:
|
||||||
description: "A summary of the container's network settings"
|
description: "A summary of the container's network settings"
|
||||||
type: "object"
|
type: "object"
|
||||||
|
@ -4991,7 +5299,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
|
||||||
|
@ -5005,17 +5313,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
|
||||||
|
@ -5026,7 +5334,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")
|
||||||
|
@ -5043,7 +5351,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.
|
||||||
|
@ -5249,13 +5557,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
|
||||||
|
@ -5266,7 +5574,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
|
||||||
|
@ -5368,7 +5676,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)
|
||||||
|
@ -5520,6 +5828,58 @@ definitions:
|
||||||
example:
|
example:
|
||||||
- "/etc/cdi"
|
- "/etc/cdi"
|
||||||
- "/var/run/cdi"
|
- "/var/run/cdi"
|
||||||
|
Containerd:
|
||||||
|
$ref: "#/definitions/ContainerdInfo"
|
||||||
|
x-nullable: true
|
||||||
|
|
||||||
|
ContainerdInfo:
|
||||||
|
description: |
|
||||||
|
Information for connecting to the containerd instance that is used by the daemon.
|
||||||
|
This is included for debugging purposes only.
|
||||||
|
type: "object"
|
||||||
|
properties:
|
||||||
|
Address:
|
||||||
|
description: "The address of the containerd socket."
|
||||||
|
type: "string"
|
||||||
|
example: "/run/containerd/containerd.sock"
|
||||||
|
Namespaces:
|
||||||
|
description: |
|
||||||
|
The namespaces that the daemon uses for running containers and
|
||||||
|
plugins in containerd. These namespaces can be configured in the
|
||||||
|
daemon configuration, and are considered to be used exclusively
|
||||||
|
by the daemon, Tampering with the containerd instance may cause
|
||||||
|
unexpected behavior.
|
||||||
|
|
||||||
|
As these namespaces are considered to be exclusively accessed
|
||||||
|
by the daemon, it is not recommended to change these values,
|
||||||
|
or to change them to a value that is used by other systems,
|
||||||
|
such as cri-containerd.
|
||||||
|
type: "object"
|
||||||
|
properties:
|
||||||
|
Containers:
|
||||||
|
description: |
|
||||||
|
The default containerd namespace used for containers managed
|
||||||
|
by the daemon.
|
||||||
|
|
||||||
|
The default namespace for containers is "moby", but will be
|
||||||
|
suffixed with the `<uid>.<gid>` of the remapped `root` if
|
||||||
|
user-namespaces are enabled and the containerd image-store
|
||||||
|
is used.
|
||||||
|
type: "string"
|
||||||
|
default: "moby"
|
||||||
|
example: "moby"
|
||||||
|
Plugins:
|
||||||
|
description: |
|
||||||
|
The default containerd namespace used for plugins managed by
|
||||||
|
the daemon.
|
||||||
|
|
||||||
|
The default namespace for plugins is "plugins.moby", but will be
|
||||||
|
suffixed with the `<uid>.<gid>` of the remapped `root` if
|
||||||
|
user-namespaces are enabled and the containerd image-store
|
||||||
|
is used.
|
||||||
|
type: "string"
|
||||||
|
default: "plugins.moby"
|
||||||
|
example: "plugins.moby"
|
||||||
|
|
||||||
# PluginsInfo is a temp struct holding Plugins name
|
# PluginsInfo is a temp struct holding Plugins name
|
||||||
# registered with docker daemon. It is used by Info struct
|
# registered with docker daemon. It is used by Info struct
|
||||||
|
@ -6372,6 +6732,8 @@ paths:
|
||||||
SizeRootFs: 0
|
SizeRootFs: 0
|
||||||
HostConfig:
|
HostConfig:
|
||||||
NetworkMode: "default"
|
NetworkMode: "default"
|
||||||
|
Annotations:
|
||||||
|
io.kubernetes.docker.type: "container"
|
||||||
NetworkSettings:
|
NetworkSettings:
|
||||||
Networks:
|
Networks:
|
||||||
bridge:
|
bridge:
|
||||||
|
@ -6407,6 +6769,9 @@ paths:
|
||||||
SizeRootFs: 0
|
SizeRootFs: 0
|
||||||
HostConfig:
|
HostConfig:
|
||||||
NetworkMode: "default"
|
NetworkMode: "default"
|
||||||
|
Annotations:
|
||||||
|
io.kubernetes.docker.type: "container"
|
||||||
|
io.kubernetes.sandbox.id: "3befe639bed0fd6afdd65fd1fa84506756f59360ec4adc270b0fdac9be22b4d3"
|
||||||
NetworkSettings:
|
NetworkSettings:
|
||||||
Networks:
|
Networks:
|
||||||
bridge:
|
bridge:
|
||||||
|
@ -6435,6 +6800,9 @@ paths:
|
||||||
SizeRootFs: 0
|
SizeRootFs: 0
|
||||||
HostConfig:
|
HostConfig:
|
||||||
NetworkMode: "default"
|
NetworkMode: "default"
|
||||||
|
Annotations:
|
||||||
|
io.kubernetes.image.id: "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82"
|
||||||
|
io.kubernetes.image.name: "ubuntu:latest"
|
||||||
NetworkSettings:
|
NetworkSettings:
|
||||||
Networks:
|
Networks:
|
||||||
bridge:
|
bridge:
|
||||||
|
@ -6463,6 +6831,8 @@ paths:
|
||||||
SizeRootFs: 0
|
SizeRootFs: 0
|
||||||
HostConfig:
|
HostConfig:
|
||||||
NetworkMode: "default"
|
NetworkMode: "default"
|
||||||
|
Annotations:
|
||||||
|
io.kubernetes.config.source: "api"
|
||||||
NetworkSettings:
|
NetworkSettings:
|
||||||
Networks:
|
Networks:
|
||||||
bridge:
|
bridge:
|
||||||
|
@ -8740,6 +9110,11 @@ paths:
|
||||||
details.
|
details.
|
||||||
type: "string"
|
type: "string"
|
||||||
required: true
|
required: true
|
||||||
|
- name: "platform"
|
||||||
|
in: "query"
|
||||||
|
description: "Select a platform-specific manifest to be pushed. OCI platform (JSON encoded)"
|
||||||
|
type: "string"
|
||||||
|
x-nullable: true
|
||||||
tags: ["Image"]
|
tags: ["Image"]
|
||||||
/images/{name}/tag:
|
/images/{name}/tag:
|
||||||
post:
|
post:
|
||||||
|
@ -9188,7 +9563,7 @@ paths:
|
||||||
|
|
||||||
Containers report these events: `attach`, `commit`, `copy`, `create`, `destroy`, `detach`, `die`, `exec_create`, `exec_detach`, `exec_start`, `exec_die`, `export`, `health_status`, `kill`, `oom`, `pause`, `rename`, `resize`, `restart`, `start`, `stop`, `top`, `unpause`, `update`, and `prune`
|
Containers report these events: `attach`, `commit`, `copy`, `create`, `destroy`, `detach`, `die`, `exec_create`, `exec_detach`, `exec_start`, `exec_die`, `export`, `health_status`, `kill`, `oom`, `pause`, `rename`, `resize`, `restart`, `start`, `stop`, `top`, `unpause`, `update`, and `prune`
|
||||||
|
|
||||||
Images report these events: `delete`, `import`, `load`, `pull`, `push`, `save`, `tag`, `untag`, and `prune`
|
Images report these events: `create, `delete`, `import`, `load`, `pull`, `push`, `save`, `tag`, `untag`, and `prune`
|
||||||
|
|
||||||
Volumes report these events: `create`, `mount`, `unmount`, `destroy`, and `prune`
|
Volumes report these events: `create`, `mount`, `unmount`, `destroy`, and `prune`
|
||||||
|
|
||||||
|
@ -10144,19 +10519,9 @@ paths:
|
||||||
- "application/json"
|
- "application/json"
|
||||||
responses:
|
responses:
|
||||||
201:
|
201:
|
||||||
description: "No error"
|
description: "Network created successfully"
|
||||||
schema:
|
schema:
|
||||||
type: "object"
|
$ref: "#/definitions/NetworkCreateResponse"
|
||||||
title: "NetworkCreateResponse"
|
|
||||||
properties:
|
|
||||||
Id:
|
|
||||||
description: "The ID of the created network."
|
|
||||||
type: "string"
|
|
||||||
Warning:
|
|
||||||
type: "string"
|
|
||||||
example:
|
|
||||||
Id: "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30"
|
|
||||||
Warning: ""
|
|
||||||
400:
|
400:
|
||||||
description: "bad parameter"
|
description: "bad parameter"
|
||||||
schema:
|
schema:
|
||||||
|
@ -10189,11 +10554,6 @@ paths:
|
||||||
description: "The network's name."
|
description: "The network's name."
|
||||||
type: "string"
|
type: "string"
|
||||||
example: "my_network"
|
example: "my_network"
|
||||||
CheckDuplicate:
|
|
||||||
description: |
|
|
||||||
Deprecated: CheckDuplicate is now always enabled.
|
|
||||||
type: "boolean"
|
|
||||||
example: true
|
|
||||||
Driver:
|
Driver:
|
||||||
description: "Name of the network driver plugin to use."
|
description: "Name of the network driver plugin to use."
|
||||||
type: "string"
|
type: "string"
|
||||||
|
@ -11366,6 +11726,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:
|
||||||
|
@ -11518,6 +11879,7 @@ paths:
|
||||||
Image: "busybox"
|
Image: "busybox"
|
||||||
Args:
|
Args:
|
||||||
- "top"
|
- "top"
|
||||||
|
OomScoreAdj: 0
|
||||||
Resources:
|
Resources:
|
||||||
Limits: {}
|
Limits: {}
|
||||||
Reservations: {}
|
Reservations: {}
|
||||||
|
|
|
@ -30,7 +30,7 @@ type ContainerRmConfig struct {
|
||||||
|
|
||||||
// ContainerAttachConfig holds the streams to use when connecting to a container to view logs.
|
// ContainerAttachConfig holds the streams to use when connecting to a container to view logs.
|
||||||
type ContainerAttachConfig struct {
|
type ContainerAttachConfig struct {
|
||||||
GetStreams func(multiplexed bool) (io.ReadCloser, io.Writer, io.Writer, error)
|
GetStreams func(multiplexed bool, cancel func()) (io.ReadCloser, io.Writer, io.Writer, error)
|
||||||
UseStdin bool
|
UseStdin bool
|
||||||
UseStdout bool
|
UseStdout bool
|
||||||
UseStderr bool
|
UseStderr bool
|
||||||
|
@ -92,6 +92,14 @@ type ContainerStatsConfig struct {
|
||||||
OutStream func() io.Writer
|
OutStream func() io.Writer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExecStartConfig holds the options to start container's exec.
|
||||||
|
type ExecStartConfig struct {
|
||||||
|
Stdin io.Reader
|
||||||
|
Stdout io.Writer
|
||||||
|
Stderr io.Writer
|
||||||
|
ConsoleSize *[2]uint `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// ExecInspect holds information about a running process started
|
// ExecInspect holds information about a running process started
|
||||||
// with docker exec.
|
// with docker exec.
|
||||||
type ExecInspect struct {
|
type ExecInspect struct {
|
||||||
|
|
|
@ -2,43 +2,15 @@ package types // import "github.com/docker/docker/api/types"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
"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"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ContainerExecInspect holds information returned by exec inspect.
|
|
||||||
type ContainerExecInspect struct {
|
|
||||||
ExecID string `json:"ID"`
|
|
||||||
ContainerID string
|
|
||||||
Running bool
|
|
||||||
ExitCode int
|
|
||||||
Pid int
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyToContainerOptions holds information
|
|
||||||
// about files to copy into a container
|
|
||||||
type CopyToContainerOptions struct {
|
|
||||||
AllowOverwriteDirWithFile bool
|
|
||||||
CopyUIDGID bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// EventsOptions holds parameters to filter events with.
|
|
||||||
type EventsOptions struct {
|
|
||||||
Since string
|
|
||||||
Until string
|
|
||||||
Filters filters.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkListOptions holds parameters to filter the list of networks with.
|
|
||||||
type NetworkListOptions struct {
|
|
||||||
Filters filters.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewHijackedResponse intializes a HijackedResponse type
|
// NewHijackedResponse intializes a HijackedResponse type
|
||||||
func NewHijackedResponse(conn net.Conn, mediaType string) HijackedResponse {
|
func NewHijackedResponse(conn net.Conn, mediaType string) HijackedResponse {
|
||||||
return HijackedResponse{Conn: conn, Reader: bufio.NewReader(conn), mediaType: mediaType}
|
return HijackedResponse{Conn: conn, Reader: bufio.NewReader(conn), mediaType: mediaType}
|
||||||
|
@ -101,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
|
||||||
|
@ -122,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
|
||||||
|
@ -157,34 +129,13 @@ type ImageBuildResponse struct {
|
||||||
OSType string
|
OSType string
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImageImportSource holds source information for ImageImport
|
|
||||||
type ImageImportSource struct {
|
|
||||||
Source io.Reader // Source is the data to send to the server to create this image from. You must set SourceName to "-" to leverage this.
|
|
||||||
SourceName string // SourceName is the name of the image to pull. Set to "-" to leverage the Source attribute.
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageLoadResponse returns information to the client about a load process.
|
|
||||||
type ImageLoadResponse struct {
|
|
||||||
// Body must be closed to avoid a resource leak
|
|
||||||
Body io.ReadCloser
|
|
||||||
JSON bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// RequestPrivilegeFunc is a function interface that
|
// RequestPrivilegeFunc is a function interface that
|
||||||
// clients can supply to retry operations after
|
// clients can supply to retry operations after
|
||||||
// getting an authorization error.
|
// getting an authorization error.
|
||||||
// This function returns the registry authentication
|
// This function returns the registry authentication
|
||||||
// header value in base 64 format, or an error
|
// header value in base 64 format, or an error
|
||||||
// if the privilege request fails.
|
// if the privilege request fails.
|
||||||
type RequestPrivilegeFunc func() (string, error)
|
type RequestPrivilegeFunc func(context.Context) (string, error)
|
||||||
|
|
||||||
// ImageSearchOptions holds parameters to search images with.
|
|
||||||
type ImageSearchOptions struct {
|
|
||||||
RegistryAuth string
|
|
||||||
PrivilegeFunc RequestPrivilegeFunc
|
|
||||||
Filters filters.Args
|
|
||||||
Limit int
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeListOptions holds parameters to list nodes with.
|
// NodeListOptions holds parameters to list nodes with.
|
||||||
type NodeListOptions struct {
|
type NodeListOptions struct {
|
||||||
|
@ -289,7 +240,7 @@ type PluginInstallOptions struct {
|
||||||
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
|
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
|
||||||
RemoteRef string // RemoteRef is the plugin name on the registry
|
RemoteRef string // RemoteRef is the plugin name on the registry
|
||||||
PrivilegeFunc RequestPrivilegeFunc
|
PrivilegeFunc RequestPrivilegeFunc
|
||||||
AcceptPermissionsFunc func(PluginPrivileges) (bool, error)
|
AcceptPermissionsFunc func(context.Context, PluginPrivileges) (bool, error)
|
||||||
Args []string
|
Args []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
package types // import "github.com/docker/docker/api/types"
|
|
||||||
|
|
||||||
// ExecConfig is a small subset of the Config struct that holds the configuration
|
|
||||||
// for the exec feature of docker.
|
|
||||||
type ExecConfig struct {
|
|
||||||
User string // User that will run the command
|
|
||||||
Privileged bool // Is the container in privileged mode
|
|
||||||
Tty bool // Attach standard streams to a tty.
|
|
||||||
ConsoleSize *[2]uint `json:",omitempty"` // Initial console size [height, width]
|
|
||||||
AttachStdin bool // Attach the standard input, makes possible user interaction
|
|
||||||
AttachStderr bool // Attach the standard error
|
|
||||||
AttachStdout bool // Attach the standard output
|
|
||||||
Detach bool // Execute in detach mode
|
|
||||||
DetachKeys string // Escape keys for detach
|
|
||||||
Env []string // Environment variables
|
|
||||||
WorkingDir string // Working directory
|
|
||||||
Cmd []string // Execution commands and args
|
|
||||||
}
|
|
|
@ -1,7 +1,6 @@
|
||||||
package container // import "github.com/docker/docker/api/types/container"
|
package container // import "github.com/docker/docker/api/types/container"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/strslice"
|
"github.com/docker/docker/api/types/strslice"
|
||||||
|
@ -36,14 +35,6 @@ type StopOptions struct {
|
||||||
// HealthConfig holds configuration settings for the HEALTHCHECK feature.
|
// HealthConfig holds configuration settings for the HEALTHCHECK feature.
|
||||||
type HealthConfig = dockerspec.HealthcheckConfig
|
type HealthConfig = dockerspec.HealthcheckConfig
|
||||||
|
|
||||||
// ExecStartOptions holds the options to start container's exec.
|
|
||||||
type ExecStartOptions struct {
|
|
||||||
Stdin io.Reader
|
|
||||||
Stdout io.Writer
|
|
||||||
Stderr io.Writer
|
|
||||||
ConsoleSize *[2]uint `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Config contains the configuration data about a container.
|
// Config contains the configuration data about a container.
|
||||||
// It should hold only portable information about the container.
|
// It should hold only portable information about the container.
|
||||||
// Here, "portable" means "independent from the host we are running on".
|
// Here, "portable" means "independent from the host we are running on".
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PruneReport contains the response for Engine API:
|
||||||
|
// POST "/containers/prune"
|
||||||
|
type PruneReport struct {
|
||||||
|
ContainersDeleted []string
|
||||||
|
SpaceReclaimed uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
// PathStat is used to encode the header from
|
||||||
|
// GET "/containers/{name:.*}/archive"
|
||||||
|
// "Name" is the file or directory name.
|
||||||
|
type PathStat struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Size int64 `json:"size"`
|
||||||
|
Mode os.FileMode `json:"mode"`
|
||||||
|
Mtime time.Time `json:"mtime"`
|
||||||
|
LinkTarget string `json:"linkTarget"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CopyToContainerOptions holds information
|
||||||
|
// about files to copy into a container
|
||||||
|
type CopyToContainerOptions struct {
|
||||||
|
AllowOverwriteDirWithFile bool
|
||||||
|
CopyUIDGID bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatsResponseReader wraps an io.ReadCloser to read (a stream of) stats
|
||||||
|
// for a container, as produced by the GET "/stats" endpoint.
|
||||||
|
//
|
||||||
|
// The OSType field is set to the server's platform to allow
|
||||||
|
// platform-specific handling of the response.
|
||||||
|
//
|
||||||
|
// TODO(thaJeztah): remove this wrapper, and make OSType part of [StatsResponse].
|
||||||
|
type StatsResponseReader struct {
|
||||||
|
Body io.ReadCloser `json:"body"`
|
||||||
|
OSType string `json:"ostype"`
|
||||||
|
}
|
13
vendor/github.com/docker/docker/api/types/container/create_request.go
generated
vendored
Normal file
13
vendor/github.com/docker/docker/api/types/container/create_request.go
generated
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
import "github.com/docker/docker/api/types/network"
|
||||||
|
|
||||||
|
// CreateRequest is the request message sent to the server for container
|
||||||
|
// create calls. It is a config wrapper that holds the container [Config]
|
||||||
|
// (portable) and the corresponding [HostConfig] (non-portable) and
|
||||||
|
// [network.NetworkingConfig].
|
||||||
|
type CreateRequest struct {
|
||||||
|
*Config
|
||||||
|
HostConfig *HostConfig `json:"HostConfig,omitempty"`
|
||||||
|
NetworkingConfig *network.NetworkingConfig `json:"NetworkingConfig,omitempty"`
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package container
|
||||||
|
|
||||||
|
// ExecOptions is a small subset of the Config struct that holds the configuration
|
||||||
|
// for the exec feature of docker.
|
||||||
|
type ExecOptions struct {
|
||||||
|
User string // User that will run the command
|
||||||
|
Privileged bool // Is the container in privileged mode
|
||||||
|
Tty bool // Attach standard streams to a tty.
|
||||||
|
ConsoleSize *[2]uint `json:",omitempty"` // Initial console size [height, width]
|
||||||
|
AttachStdin bool // Attach the standard input, makes possible user interaction
|
||||||
|
AttachStderr bool // Attach the standard error
|
||||||
|
AttachStdout bool // Attach the standard output
|
||||||
|
Detach bool // Execute in detach mode
|
||||||
|
DetachKeys string // Escape keys for detach
|
||||||
|
Env []string // Environment variables
|
||||||
|
WorkingDir string // Working directory
|
||||||
|
Cmd []string // Execution commands and args
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExecStartOptions is a temp struct used by execStart
|
||||||
|
// Config fields is part of ExecConfig in runconfig package
|
||||||
|
type ExecStartOptions struct {
|
||||||
|
// ExecStart will first check if it's detached
|
||||||
|
Detach bool
|
||||||
|
// Check if there's a tty
|
||||||
|
Tty bool
|
||||||
|
// Terminal size [height, width], unused if Tty == false
|
||||||
|
ConsoleSize *[2]uint `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExecAttachOptions is a temp struct used by execAttach.
|
||||||
|
//
|
||||||
|
// TODO(thaJeztah): make this a separate type; ContainerExecAttach does not use the Detach option, and cannot run detached.
|
||||||
|
type ExecAttachOptions = ExecStartOptions
|
||||||
|
|
||||||
|
// ExecInspect holds information returned by exec inspect.
|
||||||
|
type ExecInspect struct {
|
||||||
|
ExecID string `json:"ID"`
|
||||||
|
ContainerID string
|
||||||
|
Running bool
|
||||||
|
ExitCode int
|
||||||
|
Pid int
|
||||||
|
}
|
|
@ -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
|
||||||
|
|
|
@ -9,24 +9,6 @@ func (i Isolation) IsValid() bool {
|
||||||
return i.IsDefault()
|
return i.IsDefault()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkName returns the name of the network stack.
|
|
||||||
func (n NetworkMode) NetworkName() string {
|
|
||||||
if n.IsBridge() {
|
|
||||||
return network.NetworkBridge
|
|
||||||
} else if n.IsHost() {
|
|
||||||
return network.NetworkHost
|
|
||||||
} else if n.IsContainer() {
|
|
||||||
return "container"
|
|
||||||
} else if n.IsNone() {
|
|
||||||
return network.NetworkNone
|
|
||||||
} else if n.IsDefault() {
|
|
||||||
return network.NetworkDefault
|
|
||||||
} else if n.IsUserDefined() {
|
|
||||||
return n.UserDefined()
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsBridge indicates whether container uses the bridge network stack
|
// IsBridge indicates whether container uses the bridge network stack
|
||||||
func (n NetworkMode) IsBridge() bool {
|
func (n NetworkMode) IsBridge() bool {
|
||||||
return n == network.NetworkBridge
|
return n == network.NetworkBridge
|
||||||
|
@ -41,3 +23,23 @@ func (n NetworkMode) IsHost() bool {
|
||||||
func (n NetworkMode) IsUserDefined() bool {
|
func (n NetworkMode) IsUserDefined() bool {
|
||||||
return !n.IsDefault() && !n.IsBridge() && !n.IsHost() && !n.IsNone() && !n.IsContainer()
|
return !n.IsDefault() && !n.IsBridge() && !n.IsHost() && !n.IsNone() && !n.IsContainer()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NetworkName returns the name of the network stack.
|
||||||
|
func (n NetworkMode) NetworkName() string {
|
||||||
|
switch {
|
||||||
|
case n.IsDefault():
|
||||||
|
return network.NetworkDefault
|
||||||
|
case n.IsBridge():
|
||||||
|
return network.NetworkBridge
|
||||||
|
case n.IsHost():
|
||||||
|
return network.NetworkHost
|
||||||
|
case n.IsNone():
|
||||||
|
return network.NetworkNone
|
||||||
|
case n.IsContainer():
|
||||||
|
return "container"
|
||||||
|
case n.IsUserDefined():
|
||||||
|
return n.UserDefined()
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,11 @@ package container // import "github.com/docker/docker/api/types/container"
|
||||||
|
|
||||||
import "github.com/docker/docker/api/types/network"
|
import "github.com/docker/docker/api/types/network"
|
||||||
|
|
||||||
|
// IsValid indicates if an isolation technology is valid
|
||||||
|
func (i Isolation) IsValid() bool {
|
||||||
|
return i.IsDefault() || i.IsHyperV() || i.IsProcess()
|
||||||
|
}
|
||||||
|
|
||||||
// IsBridge indicates whether container uses the bridge network stack
|
// IsBridge indicates whether container uses the bridge network stack
|
||||||
// in windows it is given the name NAT
|
// in windows it is given the name NAT
|
||||||
func (n NetworkMode) IsBridge() bool {
|
func (n NetworkMode) IsBridge() bool {
|
||||||
|
@ -19,24 +24,24 @@ func (n NetworkMode) IsUserDefined() bool {
|
||||||
return !n.IsDefault() && !n.IsNone() && !n.IsBridge() && !n.IsContainer()
|
return !n.IsDefault() && !n.IsNone() && !n.IsBridge() && !n.IsContainer()
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsValid indicates if an isolation technology is valid
|
|
||||||
func (i Isolation) IsValid() bool {
|
|
||||||
return i.IsDefault() || i.IsHyperV() || i.IsProcess()
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkName returns the name of the network stack.
|
// NetworkName returns the name of the network stack.
|
||||||
func (n NetworkMode) NetworkName() string {
|
func (n NetworkMode) NetworkName() string {
|
||||||
if n.IsDefault() {
|
switch {
|
||||||
|
case n.IsDefault():
|
||||||
return network.NetworkDefault
|
return network.NetworkDefault
|
||||||
} else if n.IsBridge() {
|
case n.IsBridge():
|
||||||
return network.NetworkNat
|
return network.NetworkNat
|
||||||
} else if n.IsNone() {
|
case n.IsHost():
|
||||||
|
// Windows currently doesn't support host network-mode, so
|
||||||
|
// this would currently never happen..
|
||||||
|
return network.NetworkHost
|
||||||
|
case n.IsNone():
|
||||||
return network.NetworkNone
|
return network.NetworkNone
|
||||||
} else if n.IsContainer() {
|
case n.IsContainer():
|
||||||
return "container"
|
return "container"
|
||||||
} else if n.IsUserDefined() {
|
case n.IsUserDefined():
|
||||||
return n.UserDefined()
|
return n.UserDefined()
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
return ""
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"`
|
|
@ -1,4 +1,5 @@
|
||||||
package events // import "github.com/docker/docker/api/types/events"
|
package events // import "github.com/docker/docker/api/types/events"
|
||||||
|
import "github.com/docker/docker/api/types/filters"
|
||||||
|
|
||||||
// Type is used for event-types.
|
// Type is used for event-types.
|
||||||
type Type string
|
type Type string
|
||||||
|
@ -125,3 +126,10 @@ type Message struct {
|
||||||
Time int64 `json:"time,omitempty"`
|
Time int64 `json:"time,omitempty"`
|
||||||
TimeNano int64 `json:"timeNano,omitempty"`
|
TimeNano int64 `json:"timeNano,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListOptions holds parameters to filter events with.
|
||||||
|
type ListOptions struct {
|
||||||
|
Since string
|
||||||
|
Until string
|
||||||
|
Filters filters.Args
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,47 @@
|
||||||
package image
|
package image
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"io"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
// Metadata contains engine-local data about the image.
|
// Metadata contains engine-local data about the image.
|
||||||
type Metadata struct {
|
type Metadata struct {
|
||||||
// LastTagTime is the date and time at which the image was last tagged.
|
// LastTagTime is the date and time at which the image was last tagged.
|
||||||
LastTagTime time.Time `json:",omitempty"`
|
LastTagTime time.Time `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PruneReport contains the response for Engine API:
|
||||||
|
// POST "/images/prune"
|
||||||
|
type PruneReport struct {
|
||||||
|
ImagesDeleted []DeleteResponse
|
||||||
|
SpaceReclaimed uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadResponse returns information to the client about a load process.
|
||||||
|
//
|
||||||
|
// TODO(thaJeztah): remove this type, and just use an io.ReadCloser
|
||||||
|
//
|
||||||
|
// This type was added in https://github.com/moby/moby/pull/18878, related
|
||||||
|
// to https://github.com/moby/moby/issues/19177;
|
||||||
|
//
|
||||||
|
// Make docker load to output json when the response content type is json
|
||||||
|
// Swarm hijacks the response from docker load and returns JSON rather
|
||||||
|
// than plain text like the Engine does. This makes the API library to return
|
||||||
|
// information to figure that out.
|
||||||
|
//
|
||||||
|
// However the "load" endpoint unconditionally returns JSON;
|
||||||
|
// https://github.com/moby/moby/blob/7b9d2ef6e5518a3d3f3cc418459f8df786cfbbd1/api/server/router/image/image_routes.go#L248-L255
|
||||||
|
//
|
||||||
|
// PR https://github.com/moby/moby/pull/21959 made the response-type depend
|
||||||
|
// on whether "quiet" was set, but this logic got changed in a follow-up
|
||||||
|
// https://github.com/moby/moby/pull/25557, which made the JSON response-type
|
||||||
|
// unconditionally, but the output produced depend on whether"quiet" was set.
|
||||||
|
//
|
||||||
|
// We should deprecated the "quiet" option, as it's really a client
|
||||||
|
// responsibility.
|
||||||
|
type LoadResponse struct {
|
||||||
|
// Body must be closed to avoid a resource leak
|
||||||
|
Body io.ReadCloser
|
||||||
|
JSON bool
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,18 @@
|
||||||
package image
|
package image
|
||||||
|
|
||||||
import "github.com/docker/docker/api/types/filters"
|
import (
|
||||||
|
"context"
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"github.com/docker/docker/api/types/filters"
|
||||||
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ImportSource holds source information for ImageImport
|
||||||
|
type ImportSource struct {
|
||||||
|
Source io.Reader // Source is the data to send to the server to create this image from. You must set SourceName to "-" to leverage this.
|
||||||
|
SourceName string // SourceName is the name of the image to pull. Set to "-" to leverage the Source attribute.
|
||||||
|
}
|
||||||
|
|
||||||
// ImportOptions holds information to import images from the client host.
|
// ImportOptions holds information to import images from the client host.
|
||||||
type ImportOptions struct {
|
type ImportOptions struct {
|
||||||
|
@ -27,12 +39,28 @@ type PullOptions struct {
|
||||||
// privilege request fails.
|
// privilege request fails.
|
||||||
//
|
//
|
||||||
// Also see [github.com/docker/docker/api/types.RequestPrivilegeFunc].
|
// Also see [github.com/docker/docker/api/types.RequestPrivilegeFunc].
|
||||||
PrivilegeFunc func() (string, error)
|
PrivilegeFunc func(context.Context) (string, error)
|
||||||
Platform string
|
Platform string
|
||||||
}
|
}
|
||||||
|
|
||||||
// PushOptions holds information to push images.
|
// PushOptions holds information to push images.
|
||||||
type PushOptions PullOptions
|
type PushOptions struct {
|
||||||
|
All bool
|
||||||
|
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
|
||||||
|
|
||||||
|
// PrivilegeFunc is a function that clients can supply to retry operations
|
||||||
|
// after getting an authorization error. This function returns the registry
|
||||||
|
// authentication header value in base64 encoded format, or an error if the
|
||||||
|
// privilege request fails.
|
||||||
|
//
|
||||||
|
// Also see [github.com/docker/docker/api/types.RequestPrivilegeFunc].
|
||||||
|
PrivilegeFunc func(context.Context) (string, error)
|
||||||
|
|
||||||
|
// Platform is an optional field that selects a specific platform to push
|
||||||
|
// when the image is a multi-platform image.
|
||||||
|
// Using this will only push a single platform-specific manifest.
|
||||||
|
Platform *ocispec.Platform `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// ListOptions holds parameters to list images with.
|
// ListOptions holds parameters to list images with.
|
||||||
type ListOptions struct {
|
type ListOptions struct {
|
||||||
|
|
|
@ -119,7 +119,11 @@ type TmpfsOptions struct {
|
||||||
SizeBytes int64 `json:",omitempty"`
|
SizeBytes int64 `json:",omitempty"`
|
||||||
// Mode of the tmpfs upon creation
|
// Mode of the tmpfs upon creation
|
||||||
Mode os.FileMode `json:",omitempty"`
|
Mode os.FileMode `json:",omitempty"`
|
||||||
|
// Options to be passed to the tmpfs mount. An array of arrays. Flag
|
||||||
|
// options should be provided as 1-length arrays. Other types should be
|
||||||
|
// provided as 2-length arrays, where the first item is the key and the
|
||||||
|
// second the value.
|
||||||
|
Options [][]string `json:",omitempty"`
|
||||||
// TODO(stevvooe): There are several more tmpfs flags, specified in the
|
// TODO(stevvooe): There are several more tmpfs flags, specified in the
|
||||||
// daemon, that are accepted. Only the most basic are added for now.
|
// daemon, that are accepted. Only the most basic are added for now.
|
||||||
//
|
//
|
||||||
|
|
19
vendor/github.com/docker/docker/api/types/network/create_response.go
generated
vendored
Normal file
19
vendor/github.com/docker/docker/api/types/network/create_response.go
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
package network
|
||||||
|
|
||||||
|
// This file was generated by the swagger tool.
|
||||||
|
// Editing this file might prove futile when you re-run the swagger generate command
|
||||||
|
|
||||||
|
// CreateResponse NetworkCreateResponse
|
||||||
|
//
|
||||||
|
// OK response to NetworkCreate operation
|
||||||
|
// swagger:model CreateResponse
|
||||||
|
type CreateResponse struct {
|
||||||
|
|
||||||
|
// The ID of the created network.
|
||||||
|
// Required: true
|
||||||
|
ID string `json:"Id"`
|
||||||
|
|
||||||
|
// Warnings encountered when creating the container
|
||||||
|
// Required: true
|
||||||
|
Warning string `json:"Warning"`
|
||||||
|
}
|
|
@ -18,6 +18,7 @@ type EndpointSettings struct {
|
||||||
// Once the container is running, it becomes operational data (it may contain a
|
// Once the container is running, it becomes operational data (it may contain a
|
||||||
// generated address).
|
// generated address).
|
||||||
MacAddress string
|
MacAddress string
|
||||||
|
DriverOpts map[string]string
|
||||||
// Operational data
|
// Operational data
|
||||||
NetworkID string
|
NetworkID string
|
||||||
EndpointID string
|
EndpointID string
|
||||||
|
@ -27,7 +28,6 @@ type EndpointSettings struct {
|
||||||
IPv6Gateway string
|
IPv6Gateway string
|
||||||
GlobalIPv6Address string
|
GlobalIPv6Address string
|
||||||
GlobalIPv6PrefixLen int
|
GlobalIPv6PrefixLen int
|
||||||
DriverOpts map[string]string
|
|
||||||
// DNSNames holds all the (non fully qualified) DNS names associated to this endpoint. First entry is used to
|
// DNSNames holds all the (non fully qualified) DNS names associated to this endpoint. First entry is used to
|
||||||
// generate PTR records.
|
// generate PTR records.
|
||||||
DNSNames []string
|
DNSNames []string
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package network // import "github.com/docker/docker/api/types/network"
|
package network // import "github.com/docker/docker/api/types/network"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -17,6 +19,82 @@ const (
|
||||||
NetworkNat = "nat"
|
NetworkNat = "nat"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CreateRequest is the request message sent to the server for network create call.
|
||||||
|
type CreateRequest struct {
|
||||||
|
CreateOptions
|
||||||
|
Name string // Name is the requested name of the network.
|
||||||
|
|
||||||
|
// Deprecated: CheckDuplicate is deprecated since API v1.44, but it defaults to true when sent by the client
|
||||||
|
// package to older daemons.
|
||||||
|
CheckDuplicate *bool `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOptions holds options to create a network.
|
||||||
|
type CreateOptions struct {
|
||||||
|
Driver string // Driver is the driver-name used to create the network (e.g. `bridge`, `overlay`)
|
||||||
|
Scope string // Scope describes the level at which the network exists (e.g. `swarm` for cluster-wide or `local` for machine level).
|
||||||
|
EnableIPv6 *bool `json:",omitempty"` // EnableIPv6 represents whether to enable IPv6.
|
||||||
|
IPAM *IPAM // IPAM is the network's IP Address Management.
|
||||||
|
Internal bool // Internal represents if the network is used internal only.
|
||||||
|
Attachable bool // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode.
|
||||||
|
Ingress bool // Ingress indicates the network is providing the routing-mesh for the swarm cluster.
|
||||||
|
ConfigOnly bool // ConfigOnly creates a config-only network. Config-only networks are place-holder networks for network configurations to be used by other networks. ConfigOnly networks cannot be used directly to run containers or services.
|
||||||
|
ConfigFrom *ConfigReference // ConfigFrom specifies the source which will provide the configuration for this network. The specified network must be a config-only network; see [CreateOptions.ConfigOnly].
|
||||||
|
Options map[string]string // Options specifies the network-specific options to use for when creating the network.
|
||||||
|
Labels map[string]string // Labels holds metadata specific to the network being created.
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListOptions holds parameters to filter the list of networks with.
|
||||||
|
type ListOptions struct {
|
||||||
|
Filters filters.Args
|
||||||
|
}
|
||||||
|
|
||||||
|
// InspectOptions holds parameters to inspect network.
|
||||||
|
type InspectOptions struct {
|
||||||
|
Scope string
|
||||||
|
Verbose bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConnectOptions represents the data to be used to connect a container to the
|
||||||
|
// network.
|
||||||
|
type ConnectOptions struct {
|
||||||
|
Container string
|
||||||
|
EndpointConfig *EndpointSettings `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DisconnectOptions represents the data to be used to disconnect a container
|
||||||
|
// from the network.
|
||||||
|
type DisconnectOptions struct {
|
||||||
|
Container string
|
||||||
|
Force bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inspect is the body of the "get network" http response message.
|
||||||
|
type Inspect struct {
|
||||||
|
Name string // Name is the name of the network
|
||||||
|
ID string `json:"Id"` // ID uniquely identifies a network on a single machine
|
||||||
|
Created time.Time // Created is the time the network created
|
||||||
|
Scope string // Scope describes the level at which the network exists (e.g. `swarm` for cluster-wide or `local` for machine level)
|
||||||
|
Driver string // Driver is the Driver name used to create the network (e.g. `bridge`, `overlay`)
|
||||||
|
EnableIPv6 bool // EnableIPv6 represents whether to enable IPv6
|
||||||
|
IPAM IPAM // IPAM is the network's IP Address Management
|
||||||
|
Internal bool // Internal represents if the network is used internal only
|
||||||
|
Attachable bool // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode.
|
||||||
|
Ingress bool // Ingress indicates the network is providing the routing-mesh for the swarm cluster.
|
||||||
|
ConfigFrom ConfigReference // ConfigFrom specifies the source which will provide the configuration for this network.
|
||||||
|
ConfigOnly bool // ConfigOnly networks are place-holder networks for network configurations to be used by other networks. ConfigOnly networks cannot be used directly to run containers or services.
|
||||||
|
Containers map[string]EndpointResource // Containers contains endpoints belonging to the network
|
||||||
|
Options map[string]string // Options holds the network specific options to use for when creating the network
|
||||||
|
Labels map[string]string // Labels holds metadata specific to the network being created
|
||||||
|
Peers []PeerInfo `json:",omitempty"` // List of peer nodes for an overlay network
|
||||||
|
Services map[string]ServiceInfo `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Summary is used as response when listing networks. It currently is an alias
|
||||||
|
// for [Inspect], but may diverge in the future, as not all information may
|
||||||
|
// be included when listing networks.
|
||||||
|
type Summary = Inspect
|
||||||
|
|
||||||
// Address represents an IP address
|
// Address represents an IP address
|
||||||
type Address struct {
|
type Address struct {
|
||||||
Addr string
|
Addr string
|
||||||
|
@ -45,6 +123,16 @@ type ServiceInfo struct {
|
||||||
Tasks []Task
|
Tasks []Task
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EndpointResource contains network resources allocated and used for a
|
||||||
|
// container in a network.
|
||||||
|
type EndpointResource struct {
|
||||||
|
Name string
|
||||||
|
EndpointID string
|
||||||
|
MacAddress string
|
||||||
|
IPv4Address string
|
||||||
|
IPv6Address string
|
||||||
|
}
|
||||||
|
|
||||||
// NetworkingConfig represents the container's networking configuration for each of its interfaces
|
// NetworkingConfig represents the container's networking configuration for each of its interfaces
|
||||||
// Carries the networking configs specified in the `docker run` and `docker network connect` commands
|
// Carries the networking configs specified in the `docker run` and `docker network connect` commands
|
||||||
type NetworkingConfig struct {
|
type NetworkingConfig struct {
|
||||||
|
@ -70,3 +158,9 @@ var acceptedFilters = map[string]bool{
|
||||||
func ValidateFilters(filter filters.Args) error {
|
func ValidateFilters(filter filters.Args) error {
|
||||||
return filter.Validate(acceptedFilters)
|
return filter.Validate(acceptedFilters)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PruneReport contains the response for Engine API:
|
||||||
|
// POST "/networks/prune"
|
||||||
|
type PruneReport struct {
|
||||||
|
NetworksDeleted []string
|
||||||
|
}
|
||||||
|
|
|
@ -84,32 +84,6 @@ type IndexInfo struct {
|
||||||
Official bool
|
Official bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchResult describes a search result returned from a registry
|
|
||||||
type SearchResult struct {
|
|
||||||
// StarCount indicates the number of stars this repository has
|
|
||||||
StarCount int `json:"star_count"`
|
|
||||||
// IsOfficial is true if the result is from an official repository.
|
|
||||||
IsOfficial bool `json:"is_official"`
|
|
||||||
// Name is the name of the repository
|
|
||||||
Name string `json:"name"`
|
|
||||||
// IsAutomated indicates whether the result is automated.
|
|
||||||
//
|
|
||||||
// Deprecated: the "is_automated" field is deprecated and will always be "false".
|
|
||||||
IsAutomated bool `json:"is_automated"`
|
|
||||||
// Description is a textual description of the repository
|
|
||||||
Description string `json:"description"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// SearchResults lists a collection search results returned from a registry
|
|
||||||
type SearchResults struct {
|
|
||||||
// Query contains the query string that generated the search results
|
|
||||||
Query string `json:"query"`
|
|
||||||
// NumResults indicates the number of results the query returned
|
|
||||||
NumResults int `json:"num_results"`
|
|
||||||
// Results is a slice containing the actual results for the search
|
|
||||||
Results []SearchResult `json:"results"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// DistributionInspect describes the result obtained from contacting the
|
// DistributionInspect describes the result obtained from contacting the
|
||||||
// registry to retrieve image metadata
|
// registry to retrieve image metadata
|
||||||
type DistributionInspect struct {
|
type DistributionInspect struct {
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
package registry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/docker/docker/api/types/filters"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SearchOptions holds parameters to search images with.
|
||||||
|
type SearchOptions struct {
|
||||||
|
RegistryAuth string
|
||||||
|
|
||||||
|
// PrivilegeFunc is a [types.RequestPrivilegeFunc] the client can
|
||||||
|
// supply to retry operations after getting an authorization error.
|
||||||
|
//
|
||||||
|
// It must return the registry authentication header value in base64
|
||||||
|
// format, or an error if the privilege request fails.
|
||||||
|
PrivilegeFunc func(context.Context) (string, error)
|
||||||
|
Filters filters.Args
|
||||||
|
Limit int
|
||||||
|
}
|
||||||
|
|
||||||
|
// SearchResult describes a search result returned from a registry
|
||||||
|
type SearchResult struct {
|
||||||
|
// StarCount indicates the number of stars this repository has
|
||||||
|
StarCount int `json:"star_count"`
|
||||||
|
// IsOfficial is true if the result is from an official repository.
|
||||||
|
IsOfficial bool `json:"is_official"`
|
||||||
|
// Name is the name of the repository
|
||||||
|
Name string `json:"name"`
|
||||||
|
// IsAutomated indicates whether the result is automated.
|
||||||
|
//
|
||||||
|
// Deprecated: the "is_automated" field is deprecated and will always be "false".
|
||||||
|
IsAutomated bool `json:"is_automated"`
|
||||||
|
// Description is a textual description of the repository
|
||||||
|
Description string `json:"description"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SearchResults lists a collection search results returned from a registry
|
||||||
|
type SearchResults struct {
|
||||||
|
// Query contains the query string that generated the search results
|
||||||
|
Query string `json:"query"`
|
||||||
|
// NumResults indicates the number of results the query returned
|
||||||
|
NumResults int `json:"num_results"`
|
||||||
|
// Results is a slice containing the actual results for the search
|
||||||
|
Results []SearchResult `json:"results"`
|
||||||
|
}
|
|
@ -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"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,6 +75,8 @@ type Info struct {
|
||||||
DefaultAddressPools []NetworkAddressPool `json:",omitempty"`
|
DefaultAddressPools []NetworkAddressPool `json:",omitempty"`
|
||||||
CDISpecDirs []string
|
CDISpecDirs []string
|
||||||
|
|
||||||
|
Containerd *ContainerdInfo `json:",omitempty"`
|
||||||
|
|
||||||
// Legacy API fields for older API versions.
|
// Legacy API fields for older API versions.
|
||||||
legacyFields
|
legacyFields
|
||||||
|
|
||||||
|
@ -85,6 +87,43 @@ type Info struct {
|
||||||
Warnings []string
|
Warnings []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ContainerdInfo holds information about the containerd instance used by the daemon.
|
||||||
|
type ContainerdInfo struct {
|
||||||
|
// Address is the path to the containerd socket.
|
||||||
|
Address string `json:",omitempty"`
|
||||||
|
// Namespaces is the containerd namespaces used by the daemon.
|
||||||
|
Namespaces ContainerdNamespaces
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContainerdNamespaces reflects the containerd namespaces used by the daemon.
|
||||||
|
//
|
||||||
|
// These namespaces can be configured in the daemon configuration, and are
|
||||||
|
// considered to be used exclusively by the daemon,
|
||||||
|
//
|
||||||
|
// As these namespaces are considered to be exclusively accessed
|
||||||
|
// by the daemon, it is not recommended to change these values,
|
||||||
|
// or to change them to a value that is used by other systems,
|
||||||
|
// such as cri-containerd.
|
||||||
|
type ContainerdNamespaces struct {
|
||||||
|
// Containers holds the default containerd namespace used for
|
||||||
|
// containers managed by the daemon.
|
||||||
|
//
|
||||||
|
// The default namespace for containers is "moby", but will be
|
||||||
|
// suffixed with the `<uid>.<gid>` of the remapped `root` if
|
||||||
|
// user-namespaces are enabled and the containerd image-store
|
||||||
|
// is used.
|
||||||
|
Containers string
|
||||||
|
|
||||||
|
// Plugins holds the default containerd namespace used for
|
||||||
|
// plugins managed by the daemon.
|
||||||
|
//
|
||||||
|
// The default namespace for plugins is "moby", but will be
|
||||||
|
// suffixed with the `<uid>.<gid>` of the remapped `root` if
|
||||||
|
// user-namespaces are enabled and the containerd image-store
|
||||||
|
// is used.
|
||||||
|
Plugins string
|
||||||
|
}
|
||||||
|
|
||||||
type legacyFields struct {
|
type legacyFields struct {
|
||||||
ExecutionDriver string `json:",omitempty"` // Deprecated: deprecated since API v1.25, but returned for older versions.
|
ExecutionDriver string `json:",omitempty"` // Deprecated: deprecated since API v1.25, but returned for older versions.
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package types // import "github.com/docker/docker/api/types"
|
package types // import "github.com/docker/docker/api/types"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/container"
|
"github.com/docker/docker/api/types/container"
|
||||||
|
@ -155,36 +153,13 @@ type Container struct {
|
||||||
State string
|
State string
|
||||||
Status string
|
Status string
|
||||||
HostConfig struct {
|
HostConfig struct {
|
||||||
NetworkMode string `json:",omitempty"`
|
NetworkMode string `json:",omitempty"`
|
||||||
|
Annotations map[string]string `json:",omitempty"`
|
||||||
}
|
}
|
||||||
NetworkSettings *SummaryNetworkSettings
|
NetworkSettings *SummaryNetworkSettings
|
||||||
Mounts []MountPoint
|
Mounts []MountPoint
|
||||||
}
|
}
|
||||||
|
|
||||||
// CopyConfig contains request body of Engine API:
|
|
||||||
// POST "/containers/"+containerID+"/copy"
|
|
||||||
type CopyConfig struct {
|
|
||||||
Resource string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerPathStat is used to encode the header from
|
|
||||||
// GET "/containers/{name:.*}/archive"
|
|
||||||
// "Name" is the file or directory name.
|
|
||||||
type ContainerPathStat struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
Size int64 `json:"size"`
|
|
||||||
Mode os.FileMode `json:"mode"`
|
|
||||||
Mtime time.Time `json:"mtime"`
|
|
||||||
LinkTarget string `json:"linkTarget"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerStats contains response of Engine API:
|
|
||||||
// GET "/stats"
|
|
||||||
type ContainerStats struct {
|
|
||||||
Body io.ReadCloser `json:"body"`
|
|
||||||
OSType string `json:"ostype"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ping contains response of Engine API:
|
// Ping contains response of Engine API:
|
||||||
// GET "/_ping"
|
// GET "/_ping"
|
||||||
type Ping struct {
|
type Ping struct {
|
||||||
|
@ -230,17 +205,6 @@ type Version struct {
|
||||||
BuildTime string `json:",omitempty"`
|
BuildTime string `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExecStartCheck is a temp struct used by execStart
|
|
||||||
// Config fields is part of ExecConfig in runconfig package
|
|
||||||
type ExecStartCheck struct {
|
|
||||||
// ExecStart will first check if it's detached
|
|
||||||
Detach bool
|
|
||||||
// Check if there's a tty
|
|
||||||
Tty bool
|
|
||||||
// Terminal size [height, width], unused if Tty == false
|
|
||||||
ConsoleSize *[2]uint `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// HealthcheckResult stores information about a single run of a healthcheck probe
|
// HealthcheckResult stores information about a single run of a healthcheck probe
|
||||||
type HealthcheckResult struct {
|
type HealthcheckResult struct {
|
||||||
Start time.Time // Start is the time this check started
|
Start time.Time // Start is the time this check started
|
||||||
|
@ -281,18 +245,6 @@ type ContainerState struct {
|
||||||
Health *Health `json:",omitempty"`
|
Health *Health `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerNode stores information about the node that a container
|
|
||||||
// is running on. It's only used by the Docker Swarm standalone API
|
|
||||||
type ContainerNode struct {
|
|
||||||
ID string
|
|
||||||
IPAddress string `json:"IP"`
|
|
||||||
Addr string
|
|
||||||
Name string
|
|
||||||
Cpus int
|
|
||||||
Memory int64
|
|
||||||
Labels map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
// ContainerJSONBase contains response of Engine API:
|
// ContainerJSONBase contains response of Engine API:
|
||||||
// GET "/containers/{name:.*}/json"
|
// GET "/containers/{name:.*}/json"
|
||||||
type ContainerJSONBase struct {
|
type ContainerJSONBase struct {
|
||||||
|
@ -306,7 +258,7 @@ type ContainerJSONBase struct {
|
||||||
HostnamePath string
|
HostnamePath string
|
||||||
HostsPath string
|
HostsPath string
|
||||||
LogPath string
|
LogPath string
|
||||||
Node *ContainerNode `json:",omitempty"` // Node is only propagated by Docker Swarm standalone API
|
Node *ContainerNode `json:",omitempty"` // Deprecated: Node was only propagated by Docker Swarm standalone API. It sill be removed in the next release.
|
||||||
Name string
|
Name string
|
||||||
RestartCount int
|
RestartCount int
|
||||||
Driver string
|
Driver string
|
||||||
|
@ -423,84 +375,6 @@ type MountPoint struct {
|
||||||
Propagation mount.Propagation
|
Propagation mount.Propagation
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkResource is the body of the "get network" http response message
|
|
||||||
type NetworkResource struct {
|
|
||||||
Name string // Name is the requested name of the network
|
|
||||||
ID string `json:"Id"` // ID uniquely identifies a network on a single machine
|
|
||||||
Created time.Time // Created is the time the network created
|
|
||||||
Scope string // Scope describes the level at which the network exists (e.g. `swarm` for cluster-wide or `local` for machine level)
|
|
||||||
Driver string // Driver is the Driver name used to create the network (e.g. `bridge`, `overlay`)
|
|
||||||
EnableIPv6 bool // EnableIPv6 represents whether to enable IPv6
|
|
||||||
IPAM network.IPAM // IPAM is the network's IP Address Management
|
|
||||||
Internal bool // Internal represents if the network is used internal only
|
|
||||||
Attachable bool // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode.
|
|
||||||
Ingress bool // Ingress indicates the network is providing the routing-mesh for the swarm cluster.
|
|
||||||
ConfigFrom network.ConfigReference // ConfigFrom specifies the source which will provide the configuration for this network.
|
|
||||||
ConfigOnly bool // ConfigOnly networks are place-holder networks for network configurations to be used by other networks. ConfigOnly networks cannot be used directly to run containers or services.
|
|
||||||
Containers map[string]EndpointResource // Containers contains endpoints belonging to the network
|
|
||||||
Options map[string]string // Options holds the network specific options to use for when creating the network
|
|
||||||
Labels map[string]string // Labels holds metadata specific to the network being created
|
|
||||||
Peers []network.PeerInfo `json:",omitempty"` // List of peer nodes for an overlay network
|
|
||||||
Services map[string]network.ServiceInfo `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// EndpointResource contains network resources allocated and used for a container in a network
|
|
||||||
type EndpointResource struct {
|
|
||||||
Name string
|
|
||||||
EndpointID string
|
|
||||||
MacAddress string
|
|
||||||
IPv4Address string
|
|
||||||
IPv6Address string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkCreate is the expected body of the "create network" http request message
|
|
||||||
type NetworkCreate struct {
|
|
||||||
// Deprecated: CheckDuplicate is deprecated since API v1.44, but it defaults to true when sent by the client
|
|
||||||
// package to older daemons.
|
|
||||||
CheckDuplicate bool `json:",omitempty"`
|
|
||||||
Driver string // Driver is the driver-name used to create the network (e.g. `bridge`, `overlay`)
|
|
||||||
Scope string // Scope describes the level at which the network exists (e.g. `swarm` for cluster-wide or `local` for machine level).
|
|
||||||
EnableIPv6 bool // EnableIPv6 represents whether to enable IPv6.
|
|
||||||
IPAM *network.IPAM // IPAM is the network's IP Address Management.
|
|
||||||
Internal bool // Internal represents if the network is used internal only.
|
|
||||||
Attachable bool // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode.
|
|
||||||
Ingress bool // Ingress indicates the network is providing the routing-mesh for the swarm cluster.
|
|
||||||
ConfigOnly bool // ConfigOnly creates a config-only network. Config-only networks are place-holder networks for network configurations to be used by other networks. ConfigOnly networks cannot be used directly to run containers or services.
|
|
||||||
ConfigFrom *network.ConfigReference // ConfigFrom specifies the source which will provide the configuration for this network. The specified network must be a config-only network; see [NetworkCreate.ConfigOnly].
|
|
||||||
Options map[string]string // Options specifies the network-specific options to use for when creating the network.
|
|
||||||
Labels map[string]string // Labels holds metadata specific to the network being created.
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkCreateRequest is the request message sent to the server for network create call.
|
|
||||||
type NetworkCreateRequest struct {
|
|
||||||
NetworkCreate
|
|
||||||
Name string // Name is the requested name of the network.
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkCreateResponse is the response message sent by the server for network create call
|
|
||||||
type NetworkCreateResponse struct {
|
|
||||||
ID string `json:"Id"`
|
|
||||||
Warning string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkConnect represents the data to be used to connect a container to the network
|
|
||||||
type NetworkConnect struct {
|
|
||||||
Container string
|
|
||||||
EndpointConfig *network.EndpointSettings `json:",omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkDisconnect represents the data to be used to disconnect a container from the network
|
|
||||||
type NetworkDisconnect struct {
|
|
||||||
Container string
|
|
||||||
Force bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// NetworkInspectOptions holds parameters to inspect network
|
|
||||||
type NetworkInspectOptions struct {
|
|
||||||
Scope string
|
|
||||||
Verbose bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// DiskUsageObject represents an object type used for disk usage query filtering.
|
// DiskUsageObject represents an object type used for disk usage query filtering.
|
||||||
type DiskUsageObject string
|
type DiskUsageObject string
|
||||||
|
|
||||||
|
@ -533,27 +407,6 @@ type DiskUsage struct {
|
||||||
BuilderSize int64 `json:",omitempty"` // Deprecated: deprecated in API 1.38, and no longer used since API 1.40.
|
BuilderSize int64 `json:",omitempty"` // Deprecated: deprecated in API 1.38, and no longer used since API 1.40.
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainersPruneReport contains the response for Engine API:
|
|
||||||
// POST "/containers/prune"
|
|
||||||
type ContainersPruneReport struct {
|
|
||||||
ContainersDeleted []string
|
|
||||||
SpaceReclaimed uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// VolumesPruneReport contains the response for Engine API:
|
|
||||||
// POST "/volumes/prune"
|
|
||||||
type VolumesPruneReport struct {
|
|
||||||
VolumesDeleted []string
|
|
||||||
SpaceReclaimed uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImagesPruneReport contains the response for Engine API:
|
|
||||||
// POST "/images/prune"
|
|
||||||
type ImagesPruneReport struct {
|
|
||||||
ImagesDeleted []image.DeleteResponse
|
|
||||||
SpaceReclaimed uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// BuildCachePruneReport contains the response for Engine API:
|
// BuildCachePruneReport contains the response for Engine API:
|
||||||
// POST "/build/prune"
|
// POST "/build/prune"
|
||||||
type BuildCachePruneReport struct {
|
type BuildCachePruneReport struct {
|
||||||
|
@ -561,12 +414,6 @@ type BuildCachePruneReport struct {
|
||||||
SpaceReclaimed uint64
|
SpaceReclaimed uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworksPruneReport contains the response for Engine API:
|
|
||||||
// POST "/networks/prune"
|
|
||||||
type NetworksPruneReport struct {
|
|
||||||
NetworksDeleted []string
|
|
||||||
}
|
|
||||||
|
|
||||||
// SecretCreateResponse contains the information returned to a client
|
// SecretCreateResponse contains the information returned to a client
|
||||||
// on the creation of a new secret.
|
// on the creation of a new secret.
|
||||||
type SecretCreateResponse struct {
|
type SecretCreateResponse struct {
|
||||||
|
|
|
@ -1,35 +1,210 @@
|
||||||
package types
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/docker/docker/api/types/container"
|
||||||
|
"github.com/docker/docker/api/types/events"
|
||||||
"github.com/docker/docker/api/types/image"
|
"github.com/docker/docker/api/types/image"
|
||||||
|
"github.com/docker/docker/api/types/network"
|
||||||
|
"github.com/docker/docker/api/types/registry"
|
||||||
|
"github.com/docker/docker/api/types/volume"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ImageImportOptions holds information to import images from the client host.
|
// ImagesPruneReport contains the response for Engine API:
|
||||||
|
// POST "/images/prune"
|
||||||
//
|
//
|
||||||
// Deprecated: use [image.ImportOptions].
|
// Deprecated: use [image.PruneReport].
|
||||||
type ImageImportOptions = image.ImportOptions
|
type ImagesPruneReport = image.PruneReport
|
||||||
|
|
||||||
// ImageCreateOptions holds information to create images.
|
// VolumesPruneReport contains the response for Engine API:
|
||||||
|
// POST "/volumes/prune".
|
||||||
//
|
//
|
||||||
// Deprecated: use [image.CreateOptions].
|
// Deprecated: use [volume.PruneReport].
|
||||||
type ImageCreateOptions = image.CreateOptions
|
type VolumesPruneReport = volume.PruneReport
|
||||||
|
|
||||||
// ImagePullOptions holds information to pull images.
|
// NetworkCreateRequest is the request message sent to the server for network create call.
|
||||||
//
|
//
|
||||||
// Deprecated: use [image.PullOptions].
|
// Deprecated: use [network.CreateRequest].
|
||||||
type ImagePullOptions = image.PullOptions
|
type NetworkCreateRequest = network.CreateRequest
|
||||||
|
|
||||||
// ImagePushOptions holds information to push images.
|
// NetworkCreate is the expected body of the "create network" http request message
|
||||||
//
|
//
|
||||||
// Deprecated: use [image.PushOptions].
|
// Deprecated: use [network.CreateOptions].
|
||||||
type ImagePushOptions = image.PushOptions
|
type NetworkCreate = network.CreateOptions
|
||||||
|
|
||||||
// ImageListOptions holds parameters to list images with.
|
// NetworkListOptions holds parameters to filter the list of networks with.
|
||||||
//
|
//
|
||||||
// Deprecated: use [image.ListOptions].
|
// Deprecated: use [network.ListOptions].
|
||||||
type ImageListOptions = image.ListOptions
|
type NetworkListOptions = network.ListOptions
|
||||||
|
|
||||||
// ImageRemoveOptions holds parameters to remove images.
|
// NetworkCreateResponse is the response message sent by the server for network create call.
|
||||||
//
|
//
|
||||||
// Deprecated: use [image.RemoveOptions].
|
// Deprecated: use [network.CreateResponse].
|
||||||
type ImageRemoveOptions = image.RemoveOptions
|
type NetworkCreateResponse = network.CreateResponse
|
||||||
|
|
||||||
|
// NetworkInspectOptions holds parameters to inspect network.
|
||||||
|
//
|
||||||
|
// Deprecated: use [network.InspectOptions].
|
||||||
|
type NetworkInspectOptions = network.InspectOptions
|
||||||
|
|
||||||
|
// NetworkConnect represents the data to be used to connect a container to the network
|
||||||
|
//
|
||||||
|
// Deprecated: use [network.ConnectOptions].
|
||||||
|
type NetworkConnect = network.ConnectOptions
|
||||||
|
|
||||||
|
// NetworkDisconnect represents the data to be used to disconnect a container from the network
|
||||||
|
//
|
||||||
|
// Deprecated: use [network.DisconnectOptions].
|
||||||
|
type NetworkDisconnect = network.DisconnectOptions
|
||||||
|
|
||||||
|
// EndpointResource contains network resources allocated and used for a container in a network.
|
||||||
|
//
|
||||||
|
// Deprecated: use [network.EndpointResource].
|
||||||
|
type EndpointResource = network.EndpointResource
|
||||||
|
|
||||||
|
// NetworkResource is the body of the "get network" http response message/
|
||||||
|
//
|
||||||
|
// Deprecated: use [network.Inspect] or [network.Summary] (for list operations).
|
||||||
|
type NetworkResource = network.Inspect
|
||||||
|
|
||||||
|
// NetworksPruneReport contains the response for Engine API:
|
||||||
|
// POST "/networks/prune"
|
||||||
|
//
|
||||||
|
// Deprecated: use [network.PruneReport].
|
||||||
|
type NetworksPruneReport = network.PruneReport
|
||||||
|
|
||||||
|
// ExecConfig is a small subset of the Config struct that holds the configuration
|
||||||
|
// for the exec feature of docker.
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.ExecOptions].
|
||||||
|
type ExecConfig = container.ExecOptions
|
||||||
|
|
||||||
|
// ExecStartCheck is a temp struct used by execStart
|
||||||
|
// Config fields is part of ExecConfig in runconfig package
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.ExecStartOptions] or [container.ExecAttachOptions].
|
||||||
|
type ExecStartCheck = container.ExecStartOptions
|
||||||
|
|
||||||
|
// ContainerExecInspect holds information returned by exec inspect.
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.ExecInspect].
|
||||||
|
type ContainerExecInspect = container.ExecInspect
|
||||||
|
|
||||||
|
// ContainersPruneReport contains the response for Engine API:
|
||||||
|
// POST "/containers/prune"
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.PruneReport].
|
||||||
|
type ContainersPruneReport = container.PruneReport
|
||||||
|
|
||||||
|
// ContainerPathStat is used to encode the header from
|
||||||
|
// GET "/containers/{name:.*}/archive"
|
||||||
|
// "Name" is the file or directory name.
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.PathStat].
|
||||||
|
type ContainerPathStat = container.PathStat
|
||||||
|
|
||||||
|
// CopyToContainerOptions holds information
|
||||||
|
// about files to copy into a container.
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.CopyToContainerOptions],
|
||||||
|
type CopyToContainerOptions = container.CopyToContainerOptions
|
||||||
|
|
||||||
|
// ContainerStats contains response of Engine API:
|
||||||
|
// GET "/stats"
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.StatsResponseReader].
|
||||||
|
type ContainerStats = container.StatsResponseReader
|
||||||
|
|
||||||
|
// ThrottlingData stores CPU throttling stats of one running container.
|
||||||
|
// Not used on Windows.
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.ThrottlingData].
|
||||||
|
type ThrottlingData = container.ThrottlingData
|
||||||
|
|
||||||
|
// CPUUsage stores All CPU stats aggregated since container inception.
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.CPUUsage].
|
||||||
|
type CPUUsage = container.CPUUsage
|
||||||
|
|
||||||
|
// CPUStats aggregates and wraps all CPU related info of container
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.CPUStats].
|
||||||
|
type CPUStats = container.CPUStats
|
||||||
|
|
||||||
|
// MemoryStats aggregates all memory stats since container inception on Linux.
|
||||||
|
// Windows returns stats for commit and private working set only.
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.MemoryStats].
|
||||||
|
type MemoryStats = container.MemoryStats
|
||||||
|
|
||||||
|
// BlkioStatEntry is one small entity to store a piece of Blkio stats
|
||||||
|
// Not used on Windows.
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.BlkioStatEntry].
|
||||||
|
type BlkioStatEntry = container.BlkioStatEntry
|
||||||
|
|
||||||
|
// BlkioStats stores All IO service stats for data read and write.
|
||||||
|
// This is a Linux specific structure as the differences between expressing
|
||||||
|
// block I/O on Windows and Linux are sufficiently significant to make
|
||||||
|
// little sense attempting to morph into a combined structure.
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.BlkioStats].
|
||||||
|
type BlkioStats = container.BlkioStats
|
||||||
|
|
||||||
|
// StorageStats is the disk I/O stats for read/write on Windows.
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.StorageStats].
|
||||||
|
type StorageStats = container.StorageStats
|
||||||
|
|
||||||
|
// NetworkStats aggregates the network stats of one container
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.NetworkStats].
|
||||||
|
type NetworkStats = container.NetworkStats
|
||||||
|
|
||||||
|
// PidsStats contains the stats of a container's pids
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.PidsStats].
|
||||||
|
type PidsStats = container.PidsStats
|
||||||
|
|
||||||
|
// Stats is Ultimate struct aggregating all types of stats of one container
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.Stats].
|
||||||
|
type Stats = container.Stats
|
||||||
|
|
||||||
|
// StatsJSON is newly used Networks
|
||||||
|
//
|
||||||
|
// Deprecated: use [container.StatsResponse].
|
||||||
|
type StatsJSON = container.StatsResponse
|
||||||
|
|
||||||
|
// EventsOptions holds parameters to filter events with.
|
||||||
|
//
|
||||||
|
// Deprecated: use [events.ListOptions].
|
||||||
|
type EventsOptions = events.ListOptions
|
||||||
|
|
||||||
|
// ImageSearchOptions holds parameters to search images with.
|
||||||
|
//
|
||||||
|
// Deprecated: use [registry.SearchOptions].
|
||||||
|
type ImageSearchOptions = registry.SearchOptions
|
||||||
|
|
||||||
|
// ImageImportSource holds source information for ImageImport
|
||||||
|
//
|
||||||
|
// Deprecated: use [image.ImportSource].
|
||||||
|
type ImageImportSource image.ImportSource
|
||||||
|
|
||||||
|
// ImageLoadResponse returns information to the client about a load process.
|
||||||
|
//
|
||||||
|
// Deprecated: use [image.LoadResponse].
|
||||||
|
type ImageLoadResponse = image.LoadResponse
|
||||||
|
|
||||||
|
// ContainerNode stores information about the node that a container
|
||||||
|
// is running on. It's only used by the Docker Swarm standalone API.
|
||||||
|
//
|
||||||
|
// Deprecated: ContainerNode was used for the classic Docker Swarm standalone API. It will be removed in the next release.
|
||||||
|
type ContainerNode struct {
|
||||||
|
ID string
|
||||||
|
IPAddress string `json:"IP"`
|
||||||
|
Addr string
|
||||||
|
Name string
|
||||||
|
Cpus int
|
||||||
|
Memory int64
|
||||||
|
Labels map[string]string
|
||||||
|
}
|
||||||
|
|
|
@ -6,3 +6,10 @@ import "github.com/docker/docker/api/types/filters"
|
||||||
type ListOptions struct {
|
type ListOptions struct {
|
||||||
Filters filters.Args
|
Filters filters.Args
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PruneReport contains the response for Engine API:
|
||||||
|
// POST "/volumes/prune"
|
||||||
|
type PruneReport struct {
|
||||||
|
VolumesDeleted []string
|
||||||
|
SpaceReclaimed uint64
|
||||||
|
}
|
||||||
|
|
|
@ -49,6 +49,8 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/api"
|
"github.com/docker/docker/api"
|
||||||
|
@ -131,7 +133,10 @@ type Client struct {
|
||||||
negotiateVersion bool
|
negotiateVersion bool
|
||||||
|
|
||||||
// negotiated indicates that API version negotiation took place
|
// negotiated indicates that API version negotiation took place
|
||||||
negotiated bool
|
negotiated atomic.Bool
|
||||||
|
|
||||||
|
// negotiateLock is used to single-flight the version negotiation process
|
||||||
|
negotiateLock sync.Mutex
|
||||||
|
|
||||||
tp trace.TracerProvider
|
tp trace.TracerProvider
|
||||||
|
|
||||||
|
@ -266,7 +271,16 @@ func (cli *Client) Close() error {
|
||||||
// be negotiated when making the actual requests, and for which cases
|
// be negotiated when making the actual requests, and for which cases
|
||||||
// we cannot do the negotiation lazily.
|
// we cannot do the negotiation lazily.
|
||||||
func (cli *Client) checkVersion(ctx context.Context) error {
|
func (cli *Client) checkVersion(ctx context.Context) error {
|
||||||
if !cli.manualOverride && cli.negotiateVersion && !cli.negotiated {
|
if !cli.manualOverride && cli.negotiateVersion && !cli.negotiated.Load() {
|
||||||
|
// Ensure exclusive write access to version and negotiated fields
|
||||||
|
cli.negotiateLock.Lock()
|
||||||
|
defer cli.negotiateLock.Unlock()
|
||||||
|
|
||||||
|
// May have been set during last execution of critical zone
|
||||||
|
if cli.negotiated.Load() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
ping, err := cli.Ping(ctx)
|
ping, err := cli.Ping(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -312,6 +326,10 @@ func (cli *Client) ClientVersion() string {
|
||||||
// added (1.24).
|
// added (1.24).
|
||||||
func (cli *Client) NegotiateAPIVersion(ctx context.Context) {
|
func (cli *Client) NegotiateAPIVersion(ctx context.Context) {
|
||||||
if !cli.manualOverride {
|
if !cli.manualOverride {
|
||||||
|
// Avoid concurrent modification of version-related fields
|
||||||
|
cli.negotiateLock.Lock()
|
||||||
|
defer cli.negotiateLock.Unlock()
|
||||||
|
|
||||||
ping, err := cli.Ping(ctx)
|
ping, err := cli.Ping(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// FIXME(thaJeztah): Ping returns an error when failing to connect to the API; we should not swallow the error here, and instead returning it.
|
// FIXME(thaJeztah): Ping returns an error when failing to connect to the API; we should not swallow the error here, and instead returning it.
|
||||||
|
@ -336,6 +354,10 @@ func (cli *Client) NegotiateAPIVersion(ctx context.Context) {
|
||||||
// added (1.24).
|
// added (1.24).
|
||||||
func (cli *Client) NegotiateAPIVersionPing(pingResponse types.Ping) {
|
func (cli *Client) NegotiateAPIVersionPing(pingResponse types.Ping) {
|
||||||
if !cli.manualOverride {
|
if !cli.manualOverride {
|
||||||
|
// Avoid concurrent modification of version-related fields
|
||||||
|
cli.negotiateLock.Lock()
|
||||||
|
defer cli.negotiateLock.Unlock()
|
||||||
|
|
||||||
cli.negotiateAPIVersionPing(pingResponse)
|
cli.negotiateAPIVersionPing(pingResponse)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -361,7 +383,7 @@ func (cli *Client) negotiateAPIVersionPing(pingResponse types.Ping) {
|
||||||
// Store the results, so that automatic API version negotiation (if enabled)
|
// Store the results, so that automatic API version negotiation (if enabled)
|
||||||
// won't be performed on the next request.
|
// won't be performed on the next request.
|
||||||
if cli.negotiateVersion {
|
if cli.negotiateVersion {
|
||||||
cli.negotiated = true
|
cli.negotiated.Store(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,11 +11,11 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types/container"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ContainerStatPath returns stat information about a path inside the container filesystem.
|
// ContainerStatPath returns stat information about a path inside the container filesystem.
|
||||||
func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path string) (types.ContainerPathStat, error) {
|
func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path string) (container.PathStat, error) {
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API.
|
query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API.
|
||||||
|
|
||||||
|
@ -23,14 +23,14 @@ func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path stri
|
||||||
response, err := cli.head(ctx, urlStr, query, nil)
|
response, err := cli.head(ctx, urlStr, query, nil)
|
||||||
defer ensureReaderClosed(response)
|
defer ensureReaderClosed(response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return types.ContainerPathStat{}, err
|
return container.PathStat{}, err
|
||||||
}
|
}
|
||||||
return getContainerPathStatFromHeader(response.header)
|
return getContainerPathStatFromHeader(response.header)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CopyToContainer copies content into the container filesystem.
|
// CopyToContainer copies content into the container filesystem.
|
||||||
// Note that `content` must be a Reader for a TAR archive
|
// Note that `content` must be a Reader for a TAR archive
|
||||||
func (cli *Client) CopyToContainer(ctx context.Context, containerID, dstPath string, content io.Reader, options types.CopyToContainerOptions) error {
|
func (cli *Client) CopyToContainer(ctx context.Context, containerID, dstPath string, content io.Reader, options container.CopyToContainerOptions) error {
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
query.Set("path", filepath.ToSlash(dstPath)) // Normalize the paths used in the API.
|
query.Set("path", filepath.ToSlash(dstPath)) // Normalize the paths used in the API.
|
||||||
// Do not allow for an existing directory to be overwritten by a non-directory and vice versa.
|
// Do not allow for an existing directory to be overwritten by a non-directory and vice versa.
|
||||||
|
@ -55,14 +55,14 @@ func (cli *Client) CopyToContainer(ctx context.Context, containerID, dstPath str
|
||||||
|
|
||||||
// CopyFromContainer gets the content from the container and returns it as a Reader
|
// CopyFromContainer gets the content from the container and returns it as a Reader
|
||||||
// for a TAR archive to manipulate it in the host. It's up to the caller to close the reader.
|
// for a TAR archive to manipulate it in the host. It's up to the caller to close the reader.
|
||||||
func (cli *Client) CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) {
|
func (cli *Client) CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, container.PathStat, error) {
|
||||||
query := make(url.Values, 1)
|
query := make(url.Values, 1)
|
||||||
query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API.
|
query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API.
|
||||||
|
|
||||||
apiPath := "/containers/" + containerID + "/archive"
|
apiPath := "/containers/" + containerID + "/archive"
|
||||||
response, err := cli.get(ctx, apiPath, query, nil)
|
response, err := cli.get(ctx, apiPath, query, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, types.ContainerPathStat{}, err
|
return nil, container.PathStat{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// In order to get the copy behavior right, we need to know information
|
// In order to get the copy behavior right, we need to know information
|
||||||
|
@ -78,8 +78,8 @@ func (cli *Client) CopyFromContainer(ctx context.Context, containerID, srcPath s
|
||||||
return response.body, stat, err
|
return response.body, stat, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func getContainerPathStatFromHeader(header http.Header) (types.ContainerPathStat, error) {
|
func getContainerPathStatFromHeader(header http.Header) (container.PathStat, error) {
|
||||||
var stat types.ContainerPathStat
|
var stat container.PathStat
|
||||||
|
|
||||||
encodedStat := header.Get("X-Docker-Container-Path-Stat")
|
encodedStat := header.Get("X-Docker-Container-Path-Stat")
|
||||||
statDecoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(encodedStat))
|
statDecoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(encodedStat))
|
||||||
|
|
|
@ -6,11 +6,12 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
|
"github.com/docker/docker/api/types/container"
|
||||||
"github.com/docker/docker/api/types/versions"
|
"github.com/docker/docker/api/types/versions"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ContainerExecCreate creates a new exec configuration to run an exec process.
|
// ContainerExecCreate creates a new exec configuration to run an exec process.
|
||||||
func (cli *Client) ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) {
|
func (cli *Client) ContainerExecCreate(ctx context.Context, container string, options container.ExecOptions) (types.IDResponse, error) {
|
||||||
var response types.IDResponse
|
var response types.IDResponse
|
||||||
|
|
||||||
// Make sure we negotiated (if the client is configured to do so),
|
// Make sure we negotiated (if the client is configured to do so),
|
||||||
|
@ -22,14 +23,14 @@ func (cli *Client) ContainerExecCreate(ctx context.Context, container string, co
|
||||||
return response, err
|
return response, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cli.NewVersionError(ctx, "1.25", "env"); len(config.Env) != 0 && err != nil {
|
if err := cli.NewVersionError(ctx, "1.25", "env"); len(options.Env) != 0 && err != nil {
|
||||||
return response, err
|
return response, err
|
||||||
}
|
}
|
||||||
if versions.LessThan(cli.ClientVersion(), "1.42") {
|
if versions.LessThan(cli.ClientVersion(), "1.42") {
|
||||||
config.ConsoleSize = nil
|
options.ConsoleSize = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := cli.post(ctx, "/containers/"+container+"/exec", nil, config, nil)
|
resp, err := cli.post(ctx, "/containers/"+container+"/exec", nil, options, nil)
|
||||||
defer ensureReaderClosed(resp)
|
defer ensureReaderClosed(resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return response, err
|
return response, err
|
||||||
|
@ -39,7 +40,7 @@ func (cli *Client) ContainerExecCreate(ctx context.Context, container string, co
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerExecStart starts an exec process already created in the docker host.
|
// ContainerExecStart starts an exec process already created in the docker host.
|
||||||
func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config types.ExecStartCheck) error {
|
func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config container.ExecStartOptions) error {
|
||||||
if versions.LessThan(cli.ClientVersion(), "1.42") {
|
if versions.LessThan(cli.ClientVersion(), "1.42") {
|
||||||
config.ConsoleSize = nil
|
config.ConsoleSize = nil
|
||||||
}
|
}
|
||||||
|
@ -52,7 +53,7 @@ func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config
|
||||||
// It returns a types.HijackedConnection with the hijacked connection
|
// It returns a types.HijackedConnection with the hijacked connection
|
||||||
// and the a reader to get output. It's up to the called to close
|
// and the a reader to get output. It's up to the called to close
|
||||||
// the hijacked connection by calling types.HijackedResponse.Close.
|
// the hijacked connection by calling types.HijackedResponse.Close.
|
||||||
func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) {
|
func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config container.ExecAttachOptions) (types.HijackedResponse, error) {
|
||||||
if versions.LessThan(cli.ClientVersion(), "1.42") {
|
if versions.LessThan(cli.ClientVersion(), "1.42") {
|
||||||
config.ConsoleSize = nil
|
config.ConsoleSize = nil
|
||||||
}
|
}
|
||||||
|
@ -62,8 +63,8 @@ func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, confi
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerExecInspect returns information about a specific exec process on the docker host.
|
// ContainerExecInspect returns information about a specific exec process on the docker host.
|
||||||
func (cli *Client) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) {
|
func (cli *Client) ContainerExecInspect(ctx context.Context, execID string) (container.ExecInspect, error) {
|
||||||
var response types.ContainerExecInspect
|
var response container.ExecInspect
|
||||||
resp, err := cli.get(ctx, "/exec/"+execID+"/json", nil, nil)
|
resp, err := cli.get(ctx, "/exec/"+execID+"/json", nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return response, err
|
return response, err
|
||||||
|
|
|
@ -5,13 +5,13 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types/container"
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ContainersPrune requests the daemon to delete unused data
|
// ContainersPrune requests the daemon to delete unused data
|
||||||
func (cli *Client) ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error) {
|
func (cli *Client) ContainersPrune(ctx context.Context, pruneFilters filters.Args) (container.PruneReport, error) {
|
||||||
var report types.ContainersPruneReport
|
var report container.PruneReport
|
||||||
|
|
||||||
if err := cli.NewVersionError(ctx, "1.25", "container prune"); err != nil {
|
if err := cli.NewVersionError(ctx, "1.25", "container prune"); err != nil {
|
||||||
return report, err
|
return report, err
|
||||||
|
|
|
@ -4,12 +4,12 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types/container"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 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) (types.ContainerStats, 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 types.ContainerStats{}, err
|
return container.StatsResponseReader{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return types.ContainerStats{
|
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) (types.ContainerStats, 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 types.ContainerStats{}, err
|
return container.StatsResponseReader{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return types.ContainerStats{
|
return container.StatsResponseReader{
|
||||||
Body: resp.body,
|
Body: resp.body,
|
||||||
OSType: getDockerOS(resp.header.Get("Server")),
|
OSType: getDockerOS(resp.header.Get("Server")),
|
||||||
}, nil
|
}, nil
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/api/types/events"
|
"github.com/docker/docker/api/types/events"
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
timetypes "github.com/docker/docker/api/types/time"
|
timetypes "github.com/docker/docker/api/types/time"
|
||||||
|
@ -16,7 +15,7 @@ import (
|
||||||
// by cancelling the context. Once the stream has been completely read an io.EOF error will
|
// by cancelling the context. Once the stream has been completely read an io.EOF error will
|
||||||
// be sent over the error channel. If an error is sent all processing will be stopped. It's up
|
// be sent over the error channel. If an error is sent all processing will be stopped. It's up
|
||||||
// to the caller to reopen the stream in the event of an error by reinvoking this method.
|
// to the caller to reopen the stream in the event of an error by reinvoking this method.
|
||||||
func (cli *Client) Events(ctx context.Context, options types.EventsOptions) (<-chan events.Message, <-chan error) {
|
func (cli *Client) Events(ctx context.Context, options events.ListOptions) (<-chan events.Message, <-chan error) {
|
||||||
messages := make(chan events.Message)
|
messages := make(chan events.Message)
|
||||||
errs := make(chan error, 1)
|
errs := make(chan error, 1)
|
||||||
|
|
||||||
|
@ -68,7 +67,7 @@ func (cli *Client) Events(ctx context.Context, options types.EventsOptions) (<-c
|
||||||
return messages, errs
|
return messages, errs
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildEventsQueryParams(cliVersion string, options types.EventsOptions) (url.Values, error) {
|
func buildEventsQueryParams(cliVersion string, options events.ListOptions) (url.Values, error) {
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
ref := time.Now()
|
ref := time.Now()
|
||||||
|
|
||||||
|
|
|
@ -7,13 +7,12 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/distribution/reference"
|
"github.com/distribution/reference"
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/api/types/image"
|
"github.com/docker/docker/api/types/image"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ImageImport creates a new image based on the source options.
|
// ImageImport creates a new image based on the source options.
|
||||||
// It returns the JSON content in the response body.
|
// It returns the JSON content in the response body.
|
||||||
func (cli *Client) ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options image.ImportOptions) (io.ReadCloser, error) {
|
func (cli *Client) ImageImport(ctx context.Context, source image.ImportSource, ref string, options image.ImportOptions) (io.ReadCloser, error) {
|
||||||
if ref != "" {
|
if ref != "" {
|
||||||
// Check if the given image name can be resolved
|
// Check if the given image name can be resolved
|
||||||
if _, err := reference.ParseNormalizedNamed(ref); err != nil {
|
if _, err := reference.ParseNormalizedNamed(ref); err != nil {
|
||||||
|
|
|
@ -6,13 +6,13 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types/image"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ImageLoad loads an image in the docker host from the client host.
|
// ImageLoad loads an image in the docker host from the client host.
|
||||||
// It's up to the caller to close the io.ReadCloser in the
|
// It's up to the caller to close the io.ReadCloser in the
|
||||||
// ImageLoadResponse returned by this function.
|
// ImageLoadResponse returned by this function.
|
||||||
func (cli *Client) ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) {
|
func (cli *Client) ImageLoad(ctx context.Context, input io.Reader, quiet bool) (image.LoadResponse, error) {
|
||||||
v := url.Values{}
|
v := url.Values{}
|
||||||
v.Set("quiet", "0")
|
v.Set("quiet", "0")
|
||||||
if quiet {
|
if quiet {
|
||||||
|
@ -22,9 +22,9 @@ func (cli *Client) ImageLoad(ctx context.Context, input io.Reader, quiet bool) (
|
||||||
"Content-Type": {"application/x-tar"},
|
"Content-Type": {"application/x-tar"},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return types.ImageLoadResponse{}, err
|
return image.LoadResponse{}, err
|
||||||
}
|
}
|
||||||
return types.ImageLoadResponse{
|
return image.LoadResponse{
|
||||||
Body: resp.body,
|
Body: resp.body,
|
||||||
JSON: resp.header.Get("Content-Type") == "application/json",
|
JSON: resp.header.Get("Content-Type") == "application/json",
|
||||||
}, nil
|
}, nil
|
||||||
|
|
|
@ -5,13 +5,13 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
|
"github.com/docker/docker/api/types/image"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ImagesPrune requests the daemon to delete unused data
|
// ImagesPrune requests the daemon to delete unused data
|
||||||
func (cli *Client) ImagesPrune(ctx context.Context, pruneFilters filters.Args) (types.ImagesPruneReport, error) {
|
func (cli *Client) ImagesPrune(ctx context.Context, pruneFilters filters.Args) (image.PruneReport, error) {
|
||||||
var report types.ImagesPruneReport
|
var report image.PruneReport
|
||||||
|
|
||||||
if err := cli.NewVersionError(ctx, "1.25", "image prune"); err != nil {
|
if err := cli.NewVersionError(ctx, "1.25", "image prune"); err != nil {
|
||||||
return report, err
|
return report, err
|
||||||
|
|
|
@ -36,7 +36,7 @@ func (cli *Client) ImagePull(ctx context.Context, refStr string, options image.P
|
||||||
|
|
||||||
resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
|
resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
|
||||||
if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
|
if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
|
||||||
newAuthHeader, privilegeErr := options.PrivilegeFunc()
|
newAuthHeader, privilegeErr := options.PrivilegeFunc(ctx)
|
||||||
if privilegeErr != nil {
|
if privilegeErr != nil {
|
||||||
return nil, privilegeErr
|
return nil, privilegeErr
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,9 @@ package client // import "github.com/docker/docker/client"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
@ -36,9 +38,23 @@ func (cli *Client) ImagePush(ctx context.Context, image string, options image.Pu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if options.Platform != nil {
|
||||||
|
if err := cli.NewVersionError(ctx, "1.46", "platform"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
p := *options.Platform
|
||||||
|
pJson, err := json.Marshal(p)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("invalid platform: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
query.Set("platform", string(pJson))
|
||||||
|
}
|
||||||
|
|
||||||
resp, err := cli.tryImagePush(ctx, name, query, options.RegistryAuth)
|
resp, err := cli.tryImagePush(ctx, name, query, options.RegistryAuth)
|
||||||
if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
|
if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
|
||||||
newAuthHeader, privilegeErr := options.PrivilegeFunc()
|
newAuthHeader, privilegeErr := options.PrivilegeFunc(ctx)
|
||||||
if privilegeErr != nil {
|
if privilegeErr != nil {
|
||||||
return nil, privilegeErr
|
return nil, privilegeErr
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"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"
|
||||||
"github.com/docker/docker/errdefs"
|
"github.com/docker/docker/errdefs"
|
||||||
|
@ -15,7 +14,7 @@ import (
|
||||||
|
|
||||||
// ImageSearch makes the docker host search by a term in a remote registry.
|
// ImageSearch makes the docker host search by a term in a remote registry.
|
||||||
// The list of results is not sorted in any fashion.
|
// The list of results is not sorted in any fashion.
|
||||||
func (cli *Client) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) {
|
func (cli *Client) ImageSearch(ctx context.Context, term string, options registry.SearchOptions) ([]registry.SearchResult, error) {
|
||||||
var results []registry.SearchResult
|
var results []registry.SearchResult
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
query.Set("term", term)
|
query.Set("term", term)
|
||||||
|
@ -34,7 +33,7 @@ func (cli *Client) ImageSearch(ctx context.Context, term string, options types.I
|
||||||
resp, err := cli.tryImageSearch(ctx, query, options.RegistryAuth)
|
resp, err := cli.tryImageSearch(ctx, query, options.RegistryAuth)
|
||||||
defer ensureReaderClosed(resp)
|
defer ensureReaderClosed(resp)
|
||||||
if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
|
if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
|
||||||
newAuthHeader, privilegeErr := options.PrivilegeFunc()
|
newAuthHeader, privilegeErr := options.PrivilegeFunc(ctx)
|
||||||
if privilegeErr != nil {
|
if privilegeErr != nil {
|
||||||
return results, privilegeErr
|
return results, privilegeErr
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,11 +50,11 @@ type ContainerAPIClient interface {
|
||||||
ContainerCommit(ctx context.Context, container string, options container.CommitOptions) (types.IDResponse, error)
|
ContainerCommit(ctx context.Context, container string, options container.CommitOptions) (types.IDResponse, error)
|
||||||
ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *ocispec.Platform, containerName string) (container.CreateResponse, error)
|
ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *ocispec.Platform, containerName string) (container.CreateResponse, error)
|
||||||
ContainerDiff(ctx context.Context, container string) ([]container.FilesystemChange, error)
|
ContainerDiff(ctx context.Context, container string) ([]container.FilesystemChange, error)
|
||||||
ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error)
|
ContainerExecAttach(ctx context.Context, execID string, options container.ExecAttachOptions) (types.HijackedResponse, error)
|
||||||
ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error)
|
ContainerExecCreate(ctx context.Context, container string, options container.ExecOptions) (types.IDResponse, error)
|
||||||
ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error)
|
ContainerExecInspect(ctx context.Context, execID string) (container.ExecInspect, error)
|
||||||
ContainerExecResize(ctx context.Context, execID string, options container.ResizeOptions) error
|
ContainerExecResize(ctx context.Context, execID string, options container.ResizeOptions) error
|
||||||
ContainerExecStart(ctx context.Context, execID string, config types.ExecStartCheck) error
|
ContainerExecStart(ctx context.Context, execID string, options container.ExecStartOptions) error
|
||||||
ContainerExport(ctx context.Context, container string) (io.ReadCloser, error)
|
ContainerExport(ctx context.Context, container string) (io.ReadCloser, error)
|
||||||
ContainerInspect(ctx context.Context, container string) (types.ContainerJSON, error)
|
ContainerInspect(ctx context.Context, container string) (types.ContainerJSON, error)
|
||||||
ContainerInspectWithRaw(ctx context.Context, container string, getSize bool) (types.ContainerJSON, []byte, error)
|
ContainerInspectWithRaw(ctx context.Context, container string, getSize bool) (types.ContainerJSON, []byte, error)
|
||||||
|
@ -66,18 +66,18 @@ type ContainerAPIClient interface {
|
||||||
ContainerRename(ctx context.Context, container, newContainerName string) error
|
ContainerRename(ctx context.Context, container, newContainerName string) error
|
||||||
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) (types.ContainerPathStat, error)
|
ContainerStatPath(ctx context.Context, container, path string) (container.PathStat, error)
|
||||||
ContainerStats(ctx context.Context, container string, stream bool) (types.ContainerStats, error)
|
ContainerStats(ctx context.Context, container string, stream bool) (container.StatsResponseReader, error)
|
||||||
ContainerStatsOneShot(ctx context.Context, container string) (types.ContainerStats, 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)
|
||||||
ContainerUnpause(ctx context.Context, container string) error
|
ContainerUnpause(ctx context.Context, container string) error
|
||||||
ContainerUpdate(ctx context.Context, container string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error)
|
ContainerUpdate(ctx context.Context, container string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error)
|
||||||
ContainerWait(ctx context.Context, container string, condition container.WaitCondition) (<-chan container.WaitResponse, <-chan error)
|
ContainerWait(ctx context.Context, container string, condition container.WaitCondition) (<-chan container.WaitResponse, <-chan error)
|
||||||
CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error)
|
CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, container.PathStat, error)
|
||||||
CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error
|
CopyToContainer(ctx context.Context, container, path string, content io.Reader, options container.CopyToContainerOptions) error
|
||||||
ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error)
|
ContainersPrune(ctx context.Context, pruneFilters filters.Args) (container.PruneReport, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DistributionAPIClient defines API client methods for the registry
|
// DistributionAPIClient defines API client methods for the registry
|
||||||
|
@ -92,29 +92,29 @@ type ImageAPIClient interface {
|
||||||
BuildCancel(ctx context.Context, id string) error
|
BuildCancel(ctx context.Context, id string) error
|
||||||
ImageCreate(ctx context.Context, parentReference string, options image.CreateOptions) (io.ReadCloser, error)
|
ImageCreate(ctx context.Context, parentReference string, options image.CreateOptions) (io.ReadCloser, error)
|
||||||
ImageHistory(ctx context.Context, image string) ([]image.HistoryResponseItem, error)
|
ImageHistory(ctx context.Context, image string) ([]image.HistoryResponseItem, error)
|
||||||
ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options image.ImportOptions) (io.ReadCloser, error)
|
ImageImport(ctx context.Context, source image.ImportSource, ref string, options image.ImportOptions) (io.ReadCloser, error)
|
||||||
ImageInspectWithRaw(ctx context.Context, image string) (types.ImageInspect, []byte, error)
|
ImageInspectWithRaw(ctx context.Context, image string) (types.ImageInspect, []byte, error)
|
||||||
ImageList(ctx context.Context, options image.ListOptions) ([]image.Summary, error)
|
ImageList(ctx context.Context, options image.ListOptions) ([]image.Summary, error)
|
||||||
ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error)
|
ImageLoad(ctx context.Context, input io.Reader, quiet bool) (image.LoadResponse, error)
|
||||||
ImagePull(ctx context.Context, ref string, options image.PullOptions) (io.ReadCloser, error)
|
ImagePull(ctx context.Context, ref string, options image.PullOptions) (io.ReadCloser, error)
|
||||||
ImagePush(ctx context.Context, ref string, options image.PushOptions) (io.ReadCloser, error)
|
ImagePush(ctx context.Context, ref string, options image.PushOptions) (io.ReadCloser, error)
|
||||||
ImageRemove(ctx context.Context, image string, options image.RemoveOptions) ([]image.DeleteResponse, error)
|
ImageRemove(ctx context.Context, image string, options image.RemoveOptions) ([]image.DeleteResponse, error)
|
||||||
ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error)
|
ImageSearch(ctx context.Context, term string, options registry.SearchOptions) ([]registry.SearchResult, error)
|
||||||
ImageSave(ctx context.Context, images []string) (io.ReadCloser, error)
|
ImageSave(ctx context.Context, images []string) (io.ReadCloser, error)
|
||||||
ImageTag(ctx context.Context, image, ref string) error
|
ImageTag(ctx context.Context, image, ref string) error
|
||||||
ImagesPrune(ctx context.Context, pruneFilter filters.Args) (types.ImagesPruneReport, error)
|
ImagesPrune(ctx context.Context, pruneFilter filters.Args) (image.PruneReport, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkAPIClient defines API client methods for the networks
|
// NetworkAPIClient defines API client methods for the networks
|
||||||
type NetworkAPIClient interface {
|
type NetworkAPIClient interface {
|
||||||
NetworkConnect(ctx context.Context, network, container string, config *network.EndpointSettings) error
|
NetworkConnect(ctx context.Context, network, container string, config *network.EndpointSettings) error
|
||||||
NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error)
|
NetworkCreate(ctx context.Context, name string, options network.CreateOptions) (network.CreateResponse, error)
|
||||||
NetworkDisconnect(ctx context.Context, network, container string, force bool) error
|
NetworkDisconnect(ctx context.Context, network, container string, force bool) error
|
||||||
NetworkInspect(ctx context.Context, network string, options types.NetworkInspectOptions) (types.NetworkResource, error)
|
NetworkInspect(ctx context.Context, network string, options network.InspectOptions) (network.Inspect, error)
|
||||||
NetworkInspectWithRaw(ctx context.Context, network string, options types.NetworkInspectOptions) (types.NetworkResource, []byte, error)
|
NetworkInspectWithRaw(ctx context.Context, network string, options network.InspectOptions) (network.Inspect, []byte, error)
|
||||||
NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error)
|
NetworkList(ctx context.Context, options network.ListOptions) ([]network.Summary, error)
|
||||||
NetworkRemove(ctx context.Context, network string) error
|
NetworkRemove(ctx context.Context, network string) error
|
||||||
NetworksPrune(ctx context.Context, pruneFilter filters.Args) (types.NetworksPruneReport, error)
|
NetworksPrune(ctx context.Context, pruneFilter filters.Args) (network.PruneReport, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeAPIClient defines API client methods for the nodes
|
// NodeAPIClient defines API client methods for the nodes
|
||||||
|
@ -165,7 +165,7 @@ type SwarmAPIClient interface {
|
||||||
|
|
||||||
// SystemAPIClient defines API client methods for the system
|
// SystemAPIClient defines API client methods for the system
|
||||||
type SystemAPIClient interface {
|
type SystemAPIClient interface {
|
||||||
Events(ctx context.Context, options types.EventsOptions) (<-chan events.Message, <-chan error)
|
Events(ctx context.Context, options events.ListOptions) (<-chan events.Message, <-chan error)
|
||||||
Info(ctx context.Context) (system.Info, error)
|
Info(ctx context.Context) (system.Info, error)
|
||||||
RegistryLogin(ctx context.Context, auth registry.AuthConfig) (registry.AuthenticateOKBody, error)
|
RegistryLogin(ctx context.Context, auth registry.AuthConfig) (registry.AuthenticateOKBody, error)
|
||||||
DiskUsage(ctx context.Context, options types.DiskUsageOptions) (types.DiskUsage, error)
|
DiskUsage(ctx context.Context, options types.DiskUsageOptions) (types.DiskUsage, error)
|
||||||
|
@ -179,7 +179,7 @@ type VolumeAPIClient interface {
|
||||||
VolumeInspectWithRaw(ctx context.Context, volumeID string) (volume.Volume, []byte, error)
|
VolumeInspectWithRaw(ctx context.Context, volumeID string) (volume.Volume, []byte, error)
|
||||||
VolumeList(ctx context.Context, options volume.ListOptions) (volume.ListResponse, error)
|
VolumeList(ctx context.Context, options volume.ListOptions) (volume.ListResponse, error)
|
||||||
VolumeRemove(ctx context.Context, volumeID string, force bool) error
|
VolumeRemove(ctx context.Context, volumeID string, force bool) error
|
||||||
VolumesPrune(ctx context.Context, pruneFilter filters.Args) (types.VolumesPruneReport, error)
|
VolumesPrune(ctx context.Context, pruneFilter filters.Args) (volume.PruneReport, error)
|
||||||
VolumeUpdate(ctx context.Context, volumeID string, version swarm.Version, options volume.UpdateOptions) error
|
VolumeUpdate(ctx context.Context, volumeID string, version swarm.Version, options volume.UpdateOptions) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,13 +3,12 @@ package client // import "github.com/docker/docker/client"
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/api/types/network"
|
"github.com/docker/docker/api/types/network"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NetworkConnect connects a container to an existent network in the docker host.
|
// NetworkConnect connects a container to an existent network in the docker host.
|
||||||
func (cli *Client) NetworkConnect(ctx context.Context, networkID, containerID string, config *network.EndpointSettings) error {
|
func (cli *Client) NetworkConnect(ctx context.Context, networkID, containerID string, config *network.EndpointSettings) error {
|
||||||
nc := types.NetworkConnect{
|
nc := network.ConnectOptions{
|
||||||
Container: containerID,
|
Container: containerID,
|
||||||
EndpointConfig: config,
|
EndpointConfig: config,
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,13 +4,13 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types/network"
|
||||||
"github.com/docker/docker/api/types/versions"
|
"github.com/docker/docker/api/types/versions"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NetworkCreate creates a new network in the docker host.
|
// NetworkCreate creates a new network in the docker host.
|
||||||
func (cli *Client) NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) {
|
func (cli *Client) NetworkCreate(ctx context.Context, name string, options network.CreateOptions) (network.CreateResponse, error) {
|
||||||
var response types.NetworkCreateResponse
|
var response network.CreateResponse
|
||||||
|
|
||||||
// Make sure we negotiated (if the client is configured to do so),
|
// Make sure we negotiated (if the client is configured to do so),
|
||||||
// as code below contains API-version specific handling of options.
|
// as code below contains API-version specific handling of options.
|
||||||
|
@ -21,12 +21,13 @@ func (cli *Client) NetworkCreate(ctx context.Context, name string, options types
|
||||||
return response, err
|
return response, err
|
||||||
}
|
}
|
||||||
|
|
||||||
networkCreateRequest := types.NetworkCreateRequest{
|
networkCreateRequest := network.CreateRequest{
|
||||||
NetworkCreate: options,
|
CreateOptions: options,
|
||||||
Name: name,
|
Name: name,
|
||||||
}
|
}
|
||||||
if versions.LessThan(cli.version, "1.44") {
|
if versions.LessThan(cli.version, "1.44") {
|
||||||
networkCreateRequest.CheckDuplicate = true //nolint:staticcheck // ignore SA1019: CheckDuplicate is deprecated since API v1.44.
|
enabled := true
|
||||||
|
networkCreateRequest.CheckDuplicate = &enabled //nolint:staticcheck // ignore SA1019: CheckDuplicate is deprecated since API v1.44.
|
||||||
}
|
}
|
||||||
|
|
||||||
serverResp, err := cli.post(ctx, "/networks/create", nil, networkCreateRequest, nil)
|
serverResp, err := cli.post(ctx, "/networks/create", nil, networkCreateRequest, nil)
|
||||||
|
|
|
@ -3,12 +3,15 @@ package client // import "github.com/docker/docker/client"
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types/network"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NetworkDisconnect disconnects a container from an existent network in the docker host.
|
// NetworkDisconnect disconnects a container from an existent network in the docker host.
|
||||||
func (cli *Client) NetworkDisconnect(ctx context.Context, networkID, containerID string, force bool) error {
|
func (cli *Client) NetworkDisconnect(ctx context.Context, networkID, containerID string, force bool) error {
|
||||||
nd := types.NetworkDisconnect{Container: containerID, Force: force}
|
nd := network.DisconnectOptions{
|
||||||
|
Container: containerID,
|
||||||
|
Force: force,
|
||||||
|
}
|
||||||
resp, err := cli.post(ctx, "/networks/"+networkID+"/disconnect", nil, nd, nil)
|
resp, err := cli.post(ctx, "/networks/"+networkID+"/disconnect", nil, nd, nil)
|
||||||
ensureReaderClosed(resp)
|
ensureReaderClosed(resp)
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -7,25 +7,20 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types/network"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NetworkInspect returns the information for a specific network configured in the docker host.
|
// NetworkInspect returns the information for a specific network configured in the docker host.
|
||||||
func (cli *Client) NetworkInspect(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, error) {
|
func (cli *Client) NetworkInspect(ctx context.Context, networkID string, options network.InspectOptions) (network.Inspect, error) {
|
||||||
networkResource, _, err := cli.NetworkInspectWithRaw(ctx, networkID, options)
|
networkResource, _, err := cli.NetworkInspectWithRaw(ctx, networkID, options)
|
||||||
return networkResource, err
|
return networkResource, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkInspectWithRaw returns the information for a specific network configured in the docker host and its raw representation.
|
// NetworkInspectWithRaw returns the information for a specific network configured in the docker host and its raw representation.
|
||||||
func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, []byte, error) {
|
func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string, options network.InspectOptions) (network.Inspect, []byte, error) {
|
||||||
if networkID == "" {
|
if networkID == "" {
|
||||||
return types.NetworkResource{}, nil, objectNotFoundError{object: "network", id: networkID}
|
return network.Inspect{}, nil, objectNotFoundError{object: "network", id: networkID}
|
||||||
}
|
}
|
||||||
var (
|
|
||||||
networkResource types.NetworkResource
|
|
||||||
resp serverResponse
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
if options.Verbose {
|
if options.Verbose {
|
||||||
query.Set("verbose", "true")
|
query.Set("verbose", "true")
|
||||||
|
@ -33,17 +28,19 @@ func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string,
|
||||||
if options.Scope != "" {
|
if options.Scope != "" {
|
||||||
query.Set("scope", options.Scope)
|
query.Set("scope", options.Scope)
|
||||||
}
|
}
|
||||||
resp, err = cli.get(ctx, "/networks/"+networkID, query, nil)
|
|
||||||
|
resp, err := cli.get(ctx, "/networks/"+networkID, query, nil)
|
||||||
defer ensureReaderClosed(resp)
|
defer ensureReaderClosed(resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return networkResource, nil, err
|
return network.Inspect{}, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
body, err := io.ReadAll(resp.body)
|
raw, err := io.ReadAll(resp.body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return networkResource, nil, err
|
return network.Inspect{}, nil, err
|
||||||
}
|
}
|
||||||
rdr := bytes.NewReader(body)
|
|
||||||
err = json.NewDecoder(rdr).Decode(&networkResource)
|
var nw network.Inspect
|
||||||
return networkResource, body, err
|
err = json.NewDecoder(bytes.NewReader(raw)).Decode(&nw)
|
||||||
|
return nw, raw, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,12 +5,12 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
|
"github.com/docker/docker/api/types/network"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NetworkList returns the list of networks configured in the docker host.
|
// NetworkList returns the list of networks configured in the docker host.
|
||||||
func (cli *Client) NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error) {
|
func (cli *Client) NetworkList(ctx context.Context, options network.ListOptions) ([]network.Summary, error) {
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
if options.Filters.Len() > 0 {
|
if options.Filters.Len() > 0 {
|
||||||
//nolint:staticcheck // ignore SA1019 for old code
|
//nolint:staticcheck // ignore SA1019 for old code
|
||||||
|
@ -21,7 +21,7 @@ func (cli *Client) NetworkList(ctx context.Context, options types.NetworkListOpt
|
||||||
|
|
||||||
query.Set("filters", filterJSON)
|
query.Set("filters", filterJSON)
|
||||||
}
|
}
|
||||||
var networkResources []types.NetworkResource
|
var networkResources []network.Summary
|
||||||
resp, err := cli.get(ctx, "/networks", query, nil)
|
resp, err := cli.get(ctx, "/networks", query, nil)
|
||||||
defer ensureReaderClosed(resp)
|
defer ensureReaderClosed(resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -5,13 +5,13 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
|
"github.com/docker/docker/api/types/network"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NetworksPrune requests the daemon to delete unused networks
|
// NetworksPrune requests the daemon to delete unused networks
|
||||||
func (cli *Client) NetworksPrune(ctx context.Context, pruneFilters filters.Args) (types.NetworksPruneReport, error) {
|
func (cli *Client) NetworksPrune(ctx context.Context, pruneFilters filters.Args) (network.PruneReport, error) {
|
||||||
var report types.NetworksPruneReport
|
var report network.PruneReport
|
||||||
|
|
||||||
if err := cli.NewVersionError(ctx, "1.25", "network prune"); err != nil {
|
if err := cli.NewVersionError(ctx, "1.25", "network prune"); err != nil {
|
||||||
return report, err
|
return report, err
|
||||||
|
|
|
@ -84,7 +84,7 @@ func (cli *Client) checkPluginPermissions(ctx context.Context, query url.Values,
|
||||||
resp, err := cli.tryPluginPrivileges(ctx, query, options.RegistryAuth)
|
resp, err := cli.tryPluginPrivileges(ctx, query, options.RegistryAuth)
|
||||||
if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
|
if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
|
||||||
// todo: do inspect before to check existing name before checking privileges
|
// todo: do inspect before to check existing name before checking privileges
|
||||||
newAuthHeader, privilegeErr := options.PrivilegeFunc()
|
newAuthHeader, privilegeErr := options.PrivilegeFunc(ctx)
|
||||||
if privilegeErr != nil {
|
if privilegeErr != nil {
|
||||||
ensureReaderClosed(resp)
|
ensureReaderClosed(resp)
|
||||||
return nil, privilegeErr
|
return nil, privilegeErr
|
||||||
|
@ -105,7 +105,7 @@ func (cli *Client) checkPluginPermissions(ctx context.Context, query url.Values,
|
||||||
ensureReaderClosed(resp)
|
ensureReaderClosed(resp)
|
||||||
|
|
||||||
if !options.AcceptAllPermissions && options.AcceptPermissionsFunc != nil && len(privileges) > 0 {
|
if !options.AcceptAllPermissions && options.AcceptPermissionsFunc != nil && len(privileges) > 0 {
|
||||||
accept, err := options.AcceptPermissionsFunc(privileges)
|
accept, err := options.AcceptPermissionsFunc(ctx, privileges)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,10 +184,10 @@ func (cli *Client) doRequest(req *http.Request) (serverResponse, error) {
|
||||||
// `open //./pipe/docker_engine: Le fichier spécifié est introuvable.`
|
// `open //./pipe/docker_engine: Le fichier spécifié est introuvable.`
|
||||||
if strings.Contains(err.Error(), `open //./pipe/docker_engine`) {
|
if strings.Contains(err.Error(), `open //./pipe/docker_engine`) {
|
||||||
// Checks if client is running with elevated privileges
|
// Checks if client is running with elevated privileges
|
||||||
if f, elevatedErr := os.Open("\\\\.\\PHYSICALDRIVE0"); elevatedErr == nil {
|
if f, elevatedErr := os.Open(`\\.\PHYSICALDRIVE0`); elevatedErr != nil {
|
||||||
err = errors.Wrap(err, "in the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect")
|
err = errors.Wrap(err, "in the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect")
|
||||||
} else {
|
} else {
|
||||||
f.Close()
|
_ = f.Close()
|
||||||
err = errors.Wrap(err, "this error may indicate that the docker daemon is not running")
|
err = errors.Wrap(err, "this error may indicate that the docker daemon is not running")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -278,7 +278,7 @@ func encodeData(data interface{}) (*bytes.Buffer, error) {
|
||||||
func ensureReaderClosed(response serverResponse) {
|
func ensureReaderClosed(response serverResponse) {
|
||||||
if response.body != nil {
|
if response.body != nil {
|
||||||
// Drain up to 512 bytes and close the body to let the Transport reuse the connection
|
// Drain up to 512 bytes and close the body to let the Transport reuse the connection
|
||||||
io.CopyN(io.Discard, response.body, 512)
|
_, _ = io.CopyN(io.Discard, response.body, 512)
|
||||||
response.body.Close()
|
_ = response.body.Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,13 +5,13 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
|
"github.com/docker/docker/api/types/volume"
|
||||||
)
|
)
|
||||||
|
|
||||||
// VolumesPrune requests the daemon to delete unused data
|
// VolumesPrune requests the daemon to delete unused data
|
||||||
func (cli *Client) VolumesPrune(ctx context.Context, pruneFilters filters.Args) (types.VolumesPruneReport, error) {
|
func (cli *Client) VolumesPrune(ctx context.Context, pruneFilters filters.Args) (volume.PruneReport, error) {
|
||||||
var report types.VolumesPruneReport
|
var report volume.PruneReport
|
||||||
|
|
||||||
if err := cli.NewVersionError(ctx, "1.25", "volume prune"); err != nil {
|
if err := cli.NewVersionError(ctx, "1.25", "volume prune"); err != nil {
|
||||||
return report, err
|
return report, err
|
||||||
|
|
|
@ -20,7 +20,6 @@ import (
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/containerd/containerd/pkg/userns"
|
|
||||||
"github.com/containerd/log"
|
"github.com/containerd/log"
|
||||||
"github.com/docker/docker/pkg/idtools"
|
"github.com/docker/docker/pkg/idtools"
|
||||||
"github.com/docker/docker/pkg/ioutils"
|
"github.com/docker/docker/pkg/ioutils"
|
||||||
|
@ -98,24 +97,16 @@ func NewDefaultArchiver() *Archiver {
|
||||||
type breakoutError error
|
type breakoutError error
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// Uncompressed represents the uncompressed.
|
Uncompressed Compression = 0 // Uncompressed represents the uncompressed.
|
||||||
Uncompressed Compression = iota
|
Bzip2 Compression = 1 // Bzip2 is bzip2 compression algorithm.
|
||||||
// Bzip2 is bzip2 compression algorithm.
|
Gzip Compression = 2 // Gzip is gzip compression algorithm.
|
||||||
Bzip2
|
Xz Compression = 3 // Xz is xz compression algorithm.
|
||||||
// Gzip is gzip compression algorithm.
|
Zstd Compression = 4 // Zstd is zstd compression algorithm.
|
||||||
Gzip
|
|
||||||
// Xz is xz compression algorithm.
|
|
||||||
Xz
|
|
||||||
// Zstd is zstd compression algorithm.
|
|
||||||
Zstd
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// AUFSWhiteoutFormat is the default format for whiteouts
|
AUFSWhiteoutFormat WhiteoutFormat = 0 // AUFSWhiteoutFormat is the default format for whiteouts
|
||||||
AUFSWhiteoutFormat WhiteoutFormat = iota
|
OverlayWhiteoutFormat WhiteoutFormat = 1 // OverlayWhiteoutFormat formats whiteout according to the overlay standard.
|
||||||
// OverlayWhiteoutFormat formats whiteout according to the overlay
|
|
||||||
// standard.
|
|
||||||
OverlayWhiteoutFormat
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// IsArchivePath checks if the (possibly compressed) file at the given path
|
// IsArchivePath checks if the (possibly compressed) file at the given path
|
||||||
|
@ -159,7 +150,7 @@ func magicNumberMatcher(m []byte) matcher {
|
||||||
// zstdMatcher detects zstd compression algorithm.
|
// zstdMatcher detects zstd compression algorithm.
|
||||||
// Zstandard compressed data is made of one or more frames.
|
// Zstandard compressed data is made of one or more frames.
|
||||||
// There are two frame formats defined by Zstandard: Zstandard frames and Skippable frames.
|
// There are two frame formats defined by Zstandard: Zstandard frames and Skippable frames.
|
||||||
// See https://tools.ietf.org/id/draft-kucherawy-dispatch-zstd-00.html#rfc.section.2 for more details.
|
// See https://datatracker.ietf.org/doc/html/rfc8878#section-3 for more details.
|
||||||
func zstdMatcher() matcher {
|
func zstdMatcher() matcher {
|
||||||
return func(source []byte) bool {
|
return func(source []byte) bool {
|
||||||
if bytes.HasPrefix(source, zstdMagic) {
|
if bytes.HasPrefix(source, zstdMagic) {
|
||||||
|
@ -541,8 +532,10 @@ func newTarAppender(idMapping idtools.IdentityMapping, writer io.Writer, chownOp
|
||||||
}
|
}
|
||||||
|
|
||||||
// CanonicalTarNameForPath canonicalizes relativePath to a POSIX-style path using
|
// CanonicalTarNameForPath canonicalizes relativePath to a POSIX-style path using
|
||||||
// forward slashes. It is an alias for filepath.ToSlash, which is a no-op on
|
// forward slashes. It is an alias for [filepath.ToSlash], which is a no-op on
|
||||||
// Linux and Unix.
|
// Linux and Unix.
|
||||||
|
//
|
||||||
|
// Deprecated: use [filepath.ToSlash]. This function will be removed in the next release.
|
||||||
func CanonicalTarNameForPath(relativePath string) string {
|
func CanonicalTarNameForPath(relativePath string) string {
|
||||||
return filepath.ToSlash(relativePath)
|
return filepath.ToSlash(relativePath)
|
||||||
}
|
}
|
||||||
|
@ -681,9 +674,11 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, o
|
||||||
inUserns, bestEffortXattrs bool
|
inUserns, bestEffortXattrs bool
|
||||||
chownOpts *idtools.Identity
|
chownOpts *idtools.Identity
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TODO(thaJeztah): make opts a required argument.
|
||||||
if opts != nil {
|
if opts != nil {
|
||||||
Lchown = !opts.NoLchown
|
Lchown = !opts.NoLchown
|
||||||
inUserns = opts.InUserNS
|
inUserns = opts.InUserNS // TODO(thaJeztah): consider deprecating opts.InUserNS and detect locally.
|
||||||
chownOpts = opts.ChownOpts
|
chownOpts = opts.ChownOpts
|
||||||
bestEffortXattrs = opts.BestEffortXattrs
|
bestEffortXattrs = opts.BestEffortXattrs
|
||||||
}
|
}
|
||||||
|
@ -718,6 +713,7 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, o
|
||||||
|
|
||||||
case tar.TypeBlock, tar.TypeChar:
|
case tar.TypeBlock, tar.TypeChar:
|
||||||
if inUserns { // cannot create devices in a userns
|
if inUserns { // cannot create devices in a userns
|
||||||
|
log.G(context.TODO()).WithFields(log.Fields{"path": path, "type": hdr.Typeflag}).Debug("skipping device nodes in a userns")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// Handle this is an OS-specific way
|
// Handle this is an OS-specific way
|
||||||
|
@ -728,6 +724,11 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, o
|
||||||
case tar.TypeFifo:
|
case tar.TypeFifo:
|
||||||
// Handle this is an OS-specific way
|
// Handle this is an OS-specific way
|
||||||
if err := handleTarTypeBlockCharFifo(hdr, path); err != nil {
|
if err := handleTarTypeBlockCharFifo(hdr, path); err != nil {
|
||||||
|
if inUserns && errors.Is(err, syscall.EPERM) {
|
||||||
|
// In most cases, cannot create a fifo if running in user namespace
|
||||||
|
log.G(context.TODO()).WithFields(log.Fields{"error": err, "path": path, "type": hdr.Typeflag}).Debug("creating fifo node in a userns")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -771,7 +772,7 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, o
|
||||||
}
|
}
|
||||||
if err := os.Lchown(path, chownOpts.UID, chownOpts.GID); err != nil {
|
if err := os.Lchown(path, chownOpts.UID, chownOpts.GID); err != nil {
|
||||||
msg := "failed to Lchown %q for UID %d, GID %d"
|
msg := "failed to Lchown %q for UID %d, GID %d"
|
||||||
if errors.Is(err, syscall.EINVAL) && userns.RunningInUserNS() {
|
if inUserns && errors.Is(err, syscall.EINVAL) {
|
||||||
msg += " (try increasing the number of subordinate IDs in /etc/subuid and /etc/subgid)"
|
msg += " (try increasing the number of subordinate IDs in /etc/subuid and /etc/subgid)"
|
||||||
}
|
}
|
||||||
return errors.Wrapf(err, msg, path, hdr.Uid, hdr.Gid)
|
return errors.Wrapf(err, msg, path, hdr.Uid, hdr.Gid)
|
||||||
|
@ -877,21 +878,16 @@ func NewTarballer(srcPath string, options *TarOptions) (*Tarballer, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
whiteoutConverter, err := getWhiteoutConverter(options.WhiteoutFormat, options.InUserNS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &Tarballer{
|
return &Tarballer{
|
||||||
// Fix the source path to work with long path names. This is a no-op
|
// Fix the source path to work with long path names. This is a no-op
|
||||||
// on platforms other than Windows.
|
// on platforms other than Windows.
|
||||||
srcPath: fixVolumePathPrefix(srcPath),
|
srcPath: addLongPathPrefix(srcPath),
|
||||||
options: options,
|
options: options,
|
||||||
pm: pm,
|
pm: pm,
|
||||||
pipeReader: pipeReader,
|
pipeReader: pipeReader,
|
||||||
pipeWriter: pipeWriter,
|
pipeWriter: pipeWriter,
|
||||||
compressWriter: compressWriter,
|
compressWriter: compressWriter,
|
||||||
whiteoutConverter: whiteoutConverter,
|
whiteoutConverter: getWhiteoutConverter(options.WhiteoutFormat),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1086,10 +1082,7 @@ func Unpack(decompressedArchive io.Reader, dest string, options *TarOptions) err
|
||||||
defer pools.BufioReader32KPool.Put(trBuf)
|
defer pools.BufioReader32KPool.Put(trBuf)
|
||||||
|
|
||||||
var dirs []*tar.Header
|
var dirs []*tar.Header
|
||||||
whiteoutConverter, err := getWhiteoutConverter(options.WhiteoutFormat, options.InUserNS)
|
whiteoutConverter := getWhiteoutConverter(options.WhiteoutFormat)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterate through the files in the archive.
|
// Iterate through the files in the archive.
|
||||||
loop:
|
loop:
|
||||||
|
@ -1452,6 +1445,8 @@ func cmdStream(cmd *exec.Cmd, input io.Reader) (io.ReadCloser, error) {
|
||||||
// NewTempArchive reads the content of src into a temporary file, and returns the contents
|
// NewTempArchive reads the content of src into a temporary file, and returns the contents
|
||||||
// of that file as an archive. The archive can only be read once - as soon as reading completes,
|
// of that file as an archive. The archive can only be read once - as soon as reading completes,
|
||||||
// the file will be deleted.
|
// the file will be deleted.
|
||||||
|
//
|
||||||
|
// Deprecated: NewTempArchive is only used in tests and will be removed in the next release.
|
||||||
func NewTempArchive(src io.Reader, dir string) (*TempArchive, error) {
|
func NewTempArchive(src io.Reader, dir string) (*TempArchive, error) {
|
||||||
f, err := os.CreateTemp(dir, "")
|
f, err := os.CreateTemp(dir, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1473,6 +1468,8 @@ func NewTempArchive(src io.Reader, dir string) (*TempArchive, error) {
|
||||||
|
|
||||||
// TempArchive is a temporary archive. The archive can only be read once - as soon as reading completes,
|
// TempArchive is a temporary archive. The archive can only be read once - as soon as reading completes,
|
||||||
// the file will be deleted.
|
// the file will be deleted.
|
||||||
|
//
|
||||||
|
// Deprecated: TempArchive is only used in tests and will be removed in the next release.
|
||||||
type TempArchive struct {
|
type TempArchive struct {
|
||||||
*os.File
|
*os.File
|
||||||
Size int64 // Pre-computed from Stat().Size() as a convenience
|
Size int64 // Pre-computed from Stat().Size() as a convenience
|
||||||
|
|
|
@ -6,19 +6,17 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/containerd/containerd/pkg/userns"
|
||||||
"github.com/docker/docker/pkg/system"
|
"github.com/docker/docker/pkg/system"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
func getWhiteoutConverter(format WhiteoutFormat, inUserNS bool) (tarWhiteoutConverter, error) {
|
func getWhiteoutConverter(format WhiteoutFormat) tarWhiteoutConverter {
|
||||||
if format == OverlayWhiteoutFormat {
|
if format == OverlayWhiteoutFormat {
|
||||||
if inUserNS {
|
return overlayWhiteoutConverter{}
|
||||||
return nil, errors.New("specifying OverlayWhiteoutFormat is not allowed in userns")
|
|
||||||
}
|
|
||||||
return overlayWhiteoutConverter{}, nil
|
|
||||||
}
|
}
|
||||||
return nil, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type overlayWhiteoutConverter struct{}
|
type overlayWhiteoutConverter struct{}
|
||||||
|
@ -35,20 +33,25 @@ func (overlayWhiteoutConverter) ConvertWrite(hdr *tar.Header, path string, fi os
|
||||||
}
|
}
|
||||||
|
|
||||||
if fi.Mode()&os.ModeDir != 0 {
|
if fi.Mode()&os.ModeDir != 0 {
|
||||||
|
opaqueXattrName := "trusted.overlay.opaque"
|
||||||
|
if userns.RunningInUserNS() {
|
||||||
|
opaqueXattrName = "user.overlay.opaque"
|
||||||
|
}
|
||||||
|
|
||||||
// convert opaque dirs to AUFS format by writing an empty file with the prefix
|
// convert opaque dirs to AUFS format by writing an empty file with the prefix
|
||||||
opaque, err := system.Lgetxattr(path, "trusted.overlay.opaque")
|
opaque, err := system.Lgetxattr(path, opaqueXattrName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if len(opaque) == 1 && opaque[0] == 'y' {
|
if len(opaque) == 1 && opaque[0] == 'y' {
|
||||||
delete(hdr.PAXRecords, paxSchilyXattr+"trusted.overlay.opaque")
|
delete(hdr.PAXRecords, paxSchilyXattr+opaqueXattrName)
|
||||||
|
|
||||||
// create a header for the whiteout file
|
// create a header for the whiteout file
|
||||||
// it should inherit some properties from the parent, but be a regular file
|
// it should inherit some properties from the parent, but be a regular file
|
||||||
wo = &tar.Header{
|
wo = &tar.Header{
|
||||||
Typeflag: tar.TypeReg,
|
Typeflag: tar.TypeReg,
|
||||||
Mode: hdr.Mode & int64(os.ModePerm),
|
Mode: hdr.Mode & int64(os.ModePerm),
|
||||||
Name: filepath.Join(hdr.Name, WhiteoutOpaqueDir),
|
Name: filepath.Join(hdr.Name, WhiteoutOpaqueDir), // #nosec G305 -- An archive is being created, not extracted.
|
||||||
Size: 0,
|
Size: 0,
|
||||||
Uid: hdr.Uid,
|
Uid: hdr.Uid,
|
||||||
Uname: hdr.Uname,
|
Uname: hdr.Uname,
|
||||||
|
@ -56,7 +59,7 @@ func (overlayWhiteoutConverter) ConvertWrite(hdr *tar.Header, path string, fi os
|
||||||
Gname: hdr.Gname,
|
Gname: hdr.Gname,
|
||||||
AccessTime: hdr.AccessTime,
|
AccessTime: hdr.AccessTime,
|
||||||
ChangeTime: hdr.ChangeTime,
|
ChangeTime: hdr.ChangeTime,
|
||||||
} //#nosec G305 -- An archive is being created, not extracted.
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,9 +72,14 @@ func (c overlayWhiteoutConverter) ConvertRead(hdr *tar.Header, path string) (boo
|
||||||
|
|
||||||
// if a directory is marked as opaque by the AUFS special file, we need to translate that to overlay
|
// if a directory is marked as opaque by the AUFS special file, we need to translate that to overlay
|
||||||
if base == WhiteoutOpaqueDir {
|
if base == WhiteoutOpaqueDir {
|
||||||
err := unix.Setxattr(dir, "trusted.overlay.opaque", []byte{'y'}, 0)
|
opaqueXattrName := "trusted.overlay.opaque"
|
||||||
|
if userns.RunningInUserNS() {
|
||||||
|
opaqueXattrName = "user.overlay.opaque"
|
||||||
|
}
|
||||||
|
|
||||||
|
err := unix.Setxattr(dir, opaqueXattrName, []byte{'y'}, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, errors.Wrapf(err, "setxattr(%q, trusted.overlay.opaque=y)", dir)
|
return false, errors.Wrapf(err, "setxattr(%q, %s=y)", dir, opaqueXattrName)
|
||||||
}
|
}
|
||||||
// don't write the file itself
|
// don't write the file itself
|
||||||
return false, err
|
return false, err
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
|
|
||||||
package archive // import "github.com/docker/docker/pkg/archive"
|
package archive // import "github.com/docker/docker/pkg/archive"
|
||||||
|
|
||||||
func getWhiteoutConverter(format WhiteoutFormat, inUserNS bool) (tarWhiteoutConverter, error) {
|
func getWhiteoutConverter(format WhiteoutFormat) tarWhiteoutConverter {
|
||||||
return nil, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/containerd/containerd/pkg/userns"
|
|
||||||
"github.com/docker/docker/pkg/idtools"
|
"github.com/docker/docker/pkg/idtools"
|
||||||
"github.com/docker/docker/pkg/system"
|
"github.com/docker/docker/pkg/system"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
|
@ -21,9 +20,9 @@ func init() {
|
||||||
sysStat = statUnix
|
sysStat = statUnix
|
||||||
}
|
}
|
||||||
|
|
||||||
// fixVolumePathPrefix does platform specific processing to ensure that if
|
// addLongPathPrefix adds the Windows long path prefix to the path provided if
|
||||||
// the path being passed in is not in a volume path format, convert it to one.
|
// it does not already have it. It is a no-op on platforms other than Windows.
|
||||||
func fixVolumePathPrefix(srcPath string) string {
|
func addLongPathPrefix(srcPath string) string {
|
||||||
return srcPath
|
return srcPath
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +94,10 @@ func getFileUIDGID(stat interface{}) (idtools.Identity, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleTarTypeBlockCharFifo is an OS-specific helper function used by
|
// handleTarTypeBlockCharFifo is an OS-specific helper function used by
|
||||||
// createTarFile to handle the following types of header: Block; Char; Fifo
|
// createTarFile to handle the following types of header: Block; Char; Fifo.
|
||||||
|
//
|
||||||
|
// Creating device nodes is not supported when running in a user namespace,
|
||||||
|
// produces a [syscall.EPERM] in most cases.
|
||||||
func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error {
|
func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error {
|
||||||
mode := uint32(hdr.Mode & 0o7777)
|
mode := uint32(hdr.Mode & 0o7777)
|
||||||
switch hdr.Typeflag {
|
switch hdr.Typeflag {
|
||||||
|
@ -107,12 +109,7 @@ func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error {
|
||||||
mode |= unix.S_IFIFO
|
mode |= unix.S_IFIFO
|
||||||
}
|
}
|
||||||
|
|
||||||
err := system.Mknod(path, mode, int(system.Mkdev(hdr.Devmajor, hdr.Devminor)))
|
return system.Mknod(path, mode, int(system.Mkdev(hdr.Devmajor, hdr.Devminor)))
|
||||||
if errors.Is(err, syscall.EPERM) && userns.RunningInUserNS() {
|
|
||||||
// In most cases, cannot create a device if running in user namespace
|
|
||||||
err = nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo) error {
|
func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo) error {
|
||||||
|
|
|
@ -4,15 +4,27 @@ import (
|
||||||
"archive/tar"
|
"archive/tar"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/docker/pkg/idtools"
|
"github.com/docker/docker/pkg/idtools"
|
||||||
"github.com/docker/docker/pkg/longpath"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// fixVolumePathPrefix does platform specific processing to ensure that if
|
// longPathPrefix is the longpath prefix for Windows file paths.
|
||||||
// the path being passed in is not in a volume path format, convert it to one.
|
const longPathPrefix = `\\?\`
|
||||||
func fixVolumePathPrefix(srcPath string) string {
|
|
||||||
return longpath.AddPrefix(srcPath)
|
// addLongPathPrefix adds the Windows long path prefix to the path provided if
|
||||||
|
// it does not already have it. It is a no-op on platforms other than Windows.
|
||||||
|
//
|
||||||
|
// addLongPathPrefix is a copy of [github.com/docker/docker/pkg/longpath.AddPrefix].
|
||||||
|
func addLongPathPrefix(srcPath string) string {
|
||||||
|
if strings.HasPrefix(srcPath, longPathPrefix) {
|
||||||
|
return srcPath
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(srcPath, `\\`) {
|
||||||
|
// This is a UNC path, so we need to add 'UNC' to the path as well.
|
||||||
|
return longPathPrefix + `UNC` + srcPath[1:]
|
||||||
|
}
|
||||||
|
return longPathPrefix + srcPath
|
||||||
}
|
}
|
||||||
|
|
||||||
// getWalkRoot calculates the root path when performing a TarWithOptions.
|
// getWalkRoot calculates the root path when performing a TarWithOptions.
|
||||||
|
|
|
@ -23,12 +23,9 @@ import (
|
||||||
type ChangeType int
|
type ChangeType int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// ChangeModify represents the modify operation.
|
ChangeModify = 0 // ChangeModify represents the modify operation.
|
||||||
ChangeModify = iota
|
ChangeAdd = 1 // ChangeAdd represents the add operation.
|
||||||
// ChangeAdd represents the add operation.
|
ChangeDelete = 2 // ChangeDelete represents the delete operation.
|
||||||
ChangeAdd
|
|
||||||
// ChangeDelete represents the delete operation.
|
|
||||||
ChangeDelete
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c ChangeType) String() string {
|
func (c ChangeType) String() string {
|
||||||
|
|
|
@ -72,19 +72,23 @@ func collectFileInfo(sourceDir string) (*FileInfo, error) {
|
||||||
return fmt.Errorf("collectFileInfo: Unexpectedly no parent for %s", relPath)
|
return fmt.Errorf("collectFileInfo: Unexpectedly no parent for %s", relPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
info := &FileInfo{
|
|
||||||
name: filepath.Base(relPath),
|
|
||||||
children: make(map[string]*FileInfo),
|
|
||||||
parent: parent,
|
|
||||||
}
|
|
||||||
|
|
||||||
s, err := system.Lstat(path)
|
s, err := system.Lstat(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
info.stat = s
|
|
||||||
|
|
||||||
info.capability, _ = system.Lgetxattr(path, "security.capability")
|
info := &FileInfo{
|
||||||
|
name: filepath.Base(relPath),
|
||||||
|
children: make(map[string]*FileInfo),
|
||||||
|
parent: parent,
|
||||||
|
stat: s,
|
||||||
|
}
|
||||||
|
|
||||||
|
// system.Lgetxattr is only implemented on Linux and produces an error
|
||||||
|
// on other platforms. This code is intentionally left commented-out
|
||||||
|
// as a reminder to include this code if this would ever be implemented
|
||||||
|
// on other platforms.
|
||||||
|
// info.capability, _ = system.Lgetxattr(path, "security.capability")
|
||||||
|
|
||||||
parent.children[info.name] = info
|
parent.children[info.name] = info
|
||||||
|
|
||||||
|
|
|
@ -102,7 +102,7 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64,
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//#nosec G305 -- The joined path is guarded against path traversal.
|
// #nosec G305 -- The joined path is guarded against path traversal.
|
||||||
path := filepath.Join(dest, hdr.Name)
|
path := filepath.Join(dest, hdr.Name)
|
||||||
rel, err := filepath.Rel(dest, path)
|
rel, err := filepath.Rel(dest, path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -198,7 +198,7 @@ func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, hdr := range dirs {
|
for _, hdr := range dirs {
|
||||||
//#nosec G305 -- The header was checked for path traversal before it was appended to the dirs slice.
|
// #nosec G305 -- The header was checked for path traversal before it was appended to the dirs slice.
|
||||||
path := filepath.Join(dest, hdr.Name)
|
path := filepath.Join(dest, hdr.Name)
|
||||||
if err := system.Chtimes(path, hdr.AccessTime, hdr.ModTime); err != nil {
|
if err := system.Chtimes(path, hdr.AccessTime, hdr.ModTime); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
// NewAtomicFileWriter returns WriteCloser so that writing to it writes to a
|
// NewAtomicFileWriter returns WriteCloser so that writing to it writes to a
|
||||||
// temporary file and closing it atomically changes the temporary file to
|
// temporary file and closing it atomically changes the temporary file to
|
||||||
// destination path. Writing and closing concurrently is not allowed.
|
// destination path. Writing and closing concurrently is not allowed.
|
||||||
|
// NOTE: umask is not considered for the file's permissions.
|
||||||
func NewAtomicFileWriter(filename string, perm os.FileMode) (io.WriteCloser, error) {
|
func NewAtomicFileWriter(filename string, perm os.FileMode) (io.WriteCloser, error) {
|
||||||
f, err := os.CreateTemp(filepath.Dir(filename), ".tmp-"+filepath.Base(filename))
|
f, err := os.CreateTemp(filepath.Dir(filename), ".tmp-"+filepath.Base(filename))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -26,7 +27,8 @@ func NewAtomicFileWriter(filename string, perm os.FileMode) (io.WriteCloser, err
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// AtomicWriteFile atomically writes data to a file named by filename.
|
// AtomicWriteFile atomically writes data to a file named by filename and with the specified permission bits.
|
||||||
|
// NOTE: umask is not considered for the file's permissions.
|
||||||
func AtomicWriteFile(filename string, data []byte, perm os.FileMode) error {
|
func AtomicWriteFile(filename string, data []byte, perm os.FileMode) error {
|
||||||
f, err := NewAtomicFileWriter(filename, perm)
|
f, err := NewAtomicFileWriter(filename, perm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
// Package longpath introduces some constants and helper functions for handling
|
|
||||||
// long paths in Windows.
|
|
||||||
//
|
|
||||||
// Long paths are expected to be prepended with "\\?\" and followed by either a
|
|
||||||
// drive letter, a UNC server\share, or a volume identifier.
|
|
||||||
package longpath // import "github.com/docker/docker/pkg/longpath"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"runtime"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Prefix is the longpath prefix for Windows file paths.
|
|
||||||
const Prefix = `\\?\`
|
|
||||||
|
|
||||||
// AddPrefix adds the Windows long path prefix to the path provided if
|
|
||||||
// it does not already have it.
|
|
||||||
func AddPrefix(path string) string {
|
|
||||||
if !strings.HasPrefix(path, Prefix) {
|
|
||||||
if strings.HasPrefix(path, `\\`) {
|
|
||||||
// This is a UNC path, so we need to add 'UNC' to the path as well.
|
|
||||||
path = Prefix + `UNC` + path[1:]
|
|
||||||
} else {
|
|
||||||
path = Prefix + path
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return path
|
|
||||||
}
|
|
||||||
|
|
||||||
// MkdirTemp is the equivalent of [os.MkdirTemp], except that on Windows
|
|
||||||
// the result is in Windows longpath format. On Unix systems it is
|
|
||||||
// equivalent to [os.MkdirTemp].
|
|
||||||
func MkdirTemp(dir, prefix string) (string, error) {
|
|
||||||
tempDir, err := os.MkdirTemp(dir, prefix)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
if runtime.GOOS != "windows" {
|
|
||||||
return tempDir, nil
|
|
||||||
}
|
|
||||||
return AddPrefix(tempDir), nil
|
|
||||||
}
|
|
|
@ -469,7 +469,7 @@ github.com/distribution/reference
|
||||||
github.com/docker/distribution/registry/api/errcode
|
github.com/docker/distribution/registry/api/errcode
|
||||||
github.com/docker/distribution/registry/api/v2
|
github.com/docker/distribution/registry/api/v2
|
||||||
github.com/docker/distribution/registry/client/auth/challenge
|
github.com/docker/distribution/registry/client/auth/challenge
|
||||||
# github.com/docker/docker v26.1.4+incompatible
|
# github.com/docker/docker v27.0.3+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
|
||||||
|
@ -498,7 +498,6 @@ github.com/docker/docker/pkg/homedir
|
||||||
github.com/docker/docker/pkg/idtools
|
github.com/docker/docker/pkg/idtools
|
||||||
github.com/docker/docker/pkg/ioutils
|
github.com/docker/docker/pkg/ioutils
|
||||||
github.com/docker/docker/pkg/jsonmessage
|
github.com/docker/docker/pkg/jsonmessage
|
||||||
github.com/docker/docker/pkg/longpath
|
|
||||||
github.com/docker/docker/pkg/meminfo
|
github.com/docker/docker/pkg/meminfo
|
||||||
github.com/docker/docker/pkg/namesgenerator
|
github.com/docker/docker/pkg/namesgenerator
|
||||||
github.com/docker/docker/pkg/parsers
|
github.com/docker/docker/pkg/parsers
|
||||||
|
|
Loading…
Reference in New Issue