mirror of
https://github.com/docker/cli.git
synced 2026-11-13 08:13:40 -04:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b72abbb6f0 | ||
|
|
26e9ff49c8 | ||
|
|
4021ee92fe | ||
|
|
326c7138bb | ||
|
|
ee359a394b | ||
|
|
004e2925d7 | ||
|
|
6691085012 | ||
|
|
60f2d38d53 | ||
|
|
81b482ea5e | ||
|
|
211e74b240 | ||
|
|
8beff78d85 | ||
|
|
e64914c890 | ||
|
|
c1d70d1fbb | ||
|
|
53a3f0be18 | ||
|
|
4add46d686 | ||
|
|
ccea7d8a30 | ||
|
|
4cf5afaefa | ||
|
|
6c2b06d535 | ||
|
|
1c6a8ecf2e | ||
|
|
6d1c387af2 | ||
|
|
1e6db5d24b |
@@ -64,7 +64,7 @@ jobs:
|
|||||||
name: Set up Go
|
name: Set up Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: 1.21.9
|
go-version: 1.21.10
|
||||||
-
|
-
|
||||||
name: Test
|
name: Test
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ ARG BASE_VARIANT=alpine
|
|||||||
ARG ALPINE_VERSION=3.18
|
ARG ALPINE_VERSION=3.18
|
||||||
ARG BASE_DEBIAN_DISTRO=bookworm
|
ARG BASE_DEBIAN_DISTRO=bookworm
|
||||||
|
|
||||||
ARG GO_VERSION=1.21.9
|
ARG GO_VERSION=1.21.10
|
||||||
ARG XX_VERSION=1.4.0
|
ARG XX_VERSION=1.4.0
|
||||||
ARG GOVERSIONINFO_VERSION=v1.3.0
|
ARG GOVERSIONINFO_VERSION=v1.3.0
|
||||||
ARG GOTESTSUM_VERSION=v1.10.0
|
ARG GOTESTSUM_VERSION=v1.10.0
|
||||||
|
|||||||
@@ -240,8 +240,7 @@ func PluginRunCommand(dockerCli command.Cli, name string, rootcmd *cobra.Command
|
|||||||
cmd.Stdout = os.Stdout
|
cmd.Stdout = os.Stdout
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
|
|
||||||
cmd.Env = os.Environ()
|
cmd.Env = append(cmd.Environ(), ReexecEnvvar+"="+os.Args[0])
|
||||||
cmd.Env = append(cmd.Env, ReexecEnvvar+"="+os.Args[0])
|
|
||||||
cmd.Env = appendPluginResourceAttributesEnvvar(cmd.Env, rootcmd, plugin)
|
cmd.Env = appendPluginResourceAttributesEnvvar(cmd.Env, rootcmd, plugin)
|
||||||
|
|
||||||
return cmd, nil
|
return cmd, nil
|
||||||
|
|||||||
@@ -52,6 +52,24 @@ func RunPlugin(dockerCli *command.DockerCli, plugin *cobra.Command, meta manager
|
|||||||
opts = append(opts, withPluginClientConn(plugin.Name()))
|
opts = append(opts, withPluginClientConn(plugin.Name()))
|
||||||
}
|
}
|
||||||
err = tcmd.Initialize(opts...)
|
err = tcmd.Initialize(opts...)
|
||||||
|
ogRunE := cmd.RunE
|
||||||
|
if ogRunE == nil {
|
||||||
|
ogRun := cmd.Run
|
||||||
|
// necessary because error will always be nil here
|
||||||
|
// see: https://github.com/golangci/golangci-lint/issues/1379
|
||||||
|
//nolint:unparam
|
||||||
|
ogRunE = func(cmd *cobra.Command, args []string) error {
|
||||||
|
ogRun(cmd, args)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
cmd.Run = nil
|
||||||
|
}
|
||||||
|
cmd.RunE = func(cmd *cobra.Command, args []string) error {
|
||||||
|
stopInstrumentation := dockerCli.StartInstrumentation(cmd)
|
||||||
|
err := ogRunE(cmd, args)
|
||||||
|
stopInstrumentation(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
})
|
})
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -273,6 +273,11 @@ func (cli *DockerCli) Initialize(opts *cliflags.ClientOptions, ops ...CLIOption)
|
|||||||
return ResolveDefaultContext(cli.options, cli.contextStoreConfig)
|
return ResolveDefaultContext(cli.options, cli.contextStoreConfig)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(krissetto): pass ctx to the funcs instead of using this
|
||||||
|
cli.createGlobalMeterProvider(cli.baseCtx)
|
||||||
|
cli.createGlobalTracerProvider(cli.baseCtx)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -186,7 +186,11 @@ func runContainer(ctx context.Context, dockerCli command.Cli, runOpts *runOption
|
|||||||
defer closeFn()
|
defer closeFn()
|
||||||
}
|
}
|
||||||
|
|
||||||
statusChan := waitExitOrRemoved(ctx, apiClient, containerID, copts.autoRemove)
|
// New context here because we don't to cancel waiting on container exit/remove
|
||||||
|
// when we cancel attach, etc.
|
||||||
|
statusCtx, cancelStatusCtx := context.WithCancel(context.WithoutCancel(ctx))
|
||||||
|
defer cancelStatusCtx()
|
||||||
|
statusChan := waitExitOrRemoved(statusCtx, apiClient, containerID, copts.autoRemove)
|
||||||
|
|
||||||
// start the container
|
// start the container
|
||||||
if err := apiClient.ContainerStart(ctx, containerID, container.StartOptions{}); err != nil {
|
if err := apiClient.ContainerStart(ctx, containerID, container.StartOptions{}); err != nil {
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ func waitExitOrRemoved(ctx context.Context, apiClient client.APIClient, containe
|
|||||||
|
|
||||||
statusC := make(chan int)
|
statusC := make(chan int)
|
||||||
go func() {
|
go func() {
|
||||||
|
defer close(statusC)
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return
|
return
|
||||||
|
|||||||
+41
-25
@@ -41,35 +41,25 @@ type TelemetryClient interface {
|
|||||||
// each time this function is invoked.
|
// each time this function is invoked.
|
||||||
Resource() *resource.Resource
|
Resource() *resource.Resource
|
||||||
|
|
||||||
// TracerProvider returns a TracerProvider. This TracerProvider will be configured
|
// TracerProvider returns the currently initialized TracerProvider. This TracerProvider will be configured
|
||||||
// with the default tracing components for a CLI program along with any options given
|
// with the default tracing components for a CLI program
|
||||||
// for the SDK.
|
TracerProvider() trace.TracerProvider
|
||||||
TracerProvider(ctx context.Context, opts ...sdktrace.TracerProviderOption) TracerProvider
|
|
||||||
|
|
||||||
// MeterProvider returns a MeterProvider. This MeterProvider will be configured
|
// MeterProvider returns the currently initialized MeterProvider. This MeterProvider will be configured
|
||||||
// with the default metric components for a CLI program along with any options given
|
// with the default metric components for a CLI program
|
||||||
// for the SDK.
|
MeterProvider() metric.MeterProvider
|
||||||
MeterProvider(ctx context.Context, opts ...sdkmetric.Option) MeterProvider
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *DockerCli) Resource() *resource.Resource {
|
func (cli *DockerCli) Resource() *resource.Resource {
|
||||||
return cli.res.Get()
|
return cli.res.Get()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *DockerCli) TracerProvider(ctx context.Context, opts ...sdktrace.TracerProviderOption) TracerProvider {
|
func (cli *DockerCli) TracerProvider() trace.TracerProvider {
|
||||||
allOpts := make([]sdktrace.TracerProviderOption, 0, len(opts)+2)
|
return otel.GetTracerProvider()
|
||||||
allOpts = append(allOpts, sdktrace.WithResource(cli.Resource()))
|
|
||||||
allOpts = append(allOpts, dockerSpanExporter(ctx, cli)...)
|
|
||||||
allOpts = append(allOpts, opts...)
|
|
||||||
return sdktrace.NewTracerProvider(allOpts...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *DockerCli) MeterProvider(ctx context.Context, opts ...sdkmetric.Option) MeterProvider {
|
func (cli *DockerCli) MeterProvider() metric.MeterProvider {
|
||||||
allOpts := make([]sdkmetric.Option, 0, len(opts)+2)
|
return otel.GetMeterProvider()
|
||||||
allOpts = append(allOpts, sdkmetric.WithResource(cli.Resource()))
|
|
||||||
allOpts = append(allOpts, dockerMetricExporter(ctx, cli)...)
|
|
||||||
allOpts = append(allOpts, opts...)
|
|
||||||
return sdkmetric.NewMeterProvider(allOpts...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithResourceOptions configures additional options for the default resource. The default
|
// WithResourceOptions configures additional options for the default resource. The default
|
||||||
@@ -122,6 +112,28 @@ func (r *telemetryResource) init() {
|
|||||||
r.opts = nil
|
r.opts = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// createGlobalMeterProvider creates a new MeterProvider from the initialized DockerCli struct
|
||||||
|
// with the given options and sets it as the global meter provider
|
||||||
|
func (cli *DockerCli) createGlobalMeterProvider(ctx context.Context, opts ...sdkmetric.Option) {
|
||||||
|
allOpts := make([]sdkmetric.Option, 0, len(opts)+2)
|
||||||
|
allOpts = append(allOpts, sdkmetric.WithResource(cli.Resource()))
|
||||||
|
allOpts = append(allOpts, dockerMetricExporter(ctx, cli)...)
|
||||||
|
allOpts = append(allOpts, opts...)
|
||||||
|
mp := sdkmetric.NewMeterProvider(allOpts...)
|
||||||
|
otel.SetMeterProvider(mp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// createGlobalTracerProvider creates a new TracerProvider from the initialized DockerCli struct
|
||||||
|
// with the given options and sets it as the global tracer provider
|
||||||
|
func (cli *DockerCli) createGlobalTracerProvider(ctx context.Context, opts ...sdktrace.TracerProviderOption) {
|
||||||
|
allOpts := make([]sdktrace.TracerProviderOption, 0, len(opts)+2)
|
||||||
|
allOpts = append(allOpts, sdktrace.WithResource(cli.Resource()))
|
||||||
|
allOpts = append(allOpts, dockerSpanExporter(ctx, cli)...)
|
||||||
|
allOpts = append(allOpts, opts...)
|
||||||
|
tp := sdktrace.NewTracerProvider(allOpts...)
|
||||||
|
otel.SetTracerProvider(tp)
|
||||||
|
}
|
||||||
|
|
||||||
func defaultResourceOptions() []resource.Option {
|
func defaultResourceOptions() []resource.Option {
|
||||||
return []resource.Option{
|
return []resource.Option{
|
||||||
resource.WithDetectors(serviceNameDetector{}),
|
resource.WithDetectors(serviceNameDetector{}),
|
||||||
@@ -174,11 +186,6 @@ func newCLIReader(exp sdkmetric.Exporter) sdkmetric.Reader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *cliReader) Shutdown(ctx context.Context) error {
|
func (r *cliReader) Shutdown(ctx context.Context) error {
|
||||||
var rm metricdata.ResourceMetrics
|
|
||||||
if err := r.Reader.Collect(ctx, &rm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Place a pretty tight constraint on the actual reporting.
|
// Place a pretty tight constraint on the actual reporting.
|
||||||
// We don't want CLI metrics to prevent the CLI from exiting
|
// We don't want CLI metrics to prevent the CLI from exiting
|
||||||
// so if there's some kind of issue we need to abort pretty
|
// so if there's some kind of issue we need to abort pretty
|
||||||
@@ -186,6 +193,15 @@ func (r *cliReader) Shutdown(ctx context.Context) error {
|
|||||||
ctx, cancel := context.WithTimeout(ctx, exportTimeout)
|
ctx, cancel := context.WithTimeout(ctx, exportTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
|
return r.ForceFlush(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *cliReader) ForceFlush(ctx context.Context) error {
|
||||||
|
var rm metricdata.ResourceMetrics
|
||||||
|
if err := r.Reader.Collect(ctx, &rm); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return r.exporter.Export(ctx, &rm)
|
return r.exporter.Export(ctx, &rm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,7 @@ func BaseCommandAttributes(cmd *cobra.Command, streams Streams) []attribute.KeyV
|
|||||||
// Note: this should be the last func to wrap/modify the PersistentRunE/RunE funcs before command execution.
|
// Note: this should be the last func to wrap/modify the PersistentRunE/RunE funcs before command execution.
|
||||||
//
|
//
|
||||||
// can also be used for spans!
|
// can also be used for spans!
|
||||||
func (cli *DockerCli) InstrumentCobraCommands(cmd *cobra.Command, mp metric.MeterProvider) {
|
func (cli *DockerCli) InstrumentCobraCommands(ctx context.Context, cmd *cobra.Command) {
|
||||||
meter := getDefaultMeter(mp)
|
|
||||||
// If PersistentPreRunE is nil, make it execute PersistentPreRun and return nil by default
|
// If PersistentPreRunE is nil, make it execute PersistentPreRun and return nil by default
|
||||||
ogPersistentPreRunE := cmd.PersistentPreRunE
|
ogPersistentPreRunE := cmd.PersistentPreRunE
|
||||||
if ogPersistentPreRunE == nil {
|
if ogPersistentPreRunE == nil {
|
||||||
@@ -55,10 +54,9 @@ func (cli *DockerCli) InstrumentCobraCommands(cmd *cobra.Command, mp metric.Mete
|
|||||||
}
|
}
|
||||||
cmd.RunE = func(cmd *cobra.Command, args []string) error {
|
cmd.RunE = func(cmd *cobra.Command, args []string) error {
|
||||||
// start the timer as the first step of every cobra command
|
// start the timer as the first step of every cobra command
|
||||||
baseAttrs := BaseCommandAttributes(cmd, cli)
|
stopInstrumentation := cli.StartInstrumentation(cmd)
|
||||||
stopCobraCmdTimer := startCobraCommandTimer(cmd, meter, baseAttrs)
|
|
||||||
cmdErr := ogRunE(cmd, args)
|
cmdErr := ogRunE(cmd, args)
|
||||||
stopCobraCmdTimer(cmdErr)
|
stopInstrumentation(cmdErr)
|
||||||
return cmdErr
|
return cmdErr
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,8 +64,17 @@ func (cli *DockerCli) InstrumentCobraCommands(cmd *cobra.Command, mp metric.Mete
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func startCobraCommandTimer(cmd *cobra.Command, meter metric.Meter, attrs []attribute.KeyValue) func(err error) {
|
// StartInstrumentation instruments CLI commands with the individual metrics and spans configured.
|
||||||
ctx := cmd.Context()
|
// It's the main command OTel utility, and new command-related metrics should be added to it.
|
||||||
|
// It should be called immediately before command execution, and returns a stopInstrumentation function
|
||||||
|
// that must be called with the error resulting from the command execution.
|
||||||
|
func (cli *DockerCli) StartInstrumentation(cmd *cobra.Command) (stopInstrumentation func(error)) {
|
||||||
|
baseAttrs := BaseCommandAttributes(cmd, cli)
|
||||||
|
return startCobraCommandTimer(cli.MeterProvider(), baseAttrs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func startCobraCommandTimer(mp metric.MeterProvider, attrs []attribute.KeyValue) func(err error) {
|
||||||
|
meter := getDefaultMeter(mp)
|
||||||
durationCounter, _ := meter.Float64Counter(
|
durationCounter, _ := meter.Float64Counter(
|
||||||
"command.time",
|
"command.time",
|
||||||
metric.WithDescription("Measures the duration of the cobra command"),
|
metric.WithDescription("Measures the duration of the cobra command"),
|
||||||
@@ -76,12 +83,20 @@ func startCobraCommandTimer(cmd *cobra.Command, meter metric.Meter, attrs []attr
|
|||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
|
||||||
return func(err error) {
|
return func(err error) {
|
||||||
|
// Use a new context for the export so that the command being cancelled
|
||||||
|
// doesn't affect the metrics, and we get metrics for cancelled commands.
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), exportTimeout)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
duration := float64(time.Since(start)) / float64(time.Millisecond)
|
duration := float64(time.Since(start)) / float64(time.Millisecond)
|
||||||
cmdStatusAttrs := attributesFromError(err)
|
cmdStatusAttrs := attributesFromError(err)
|
||||||
durationCounter.Add(ctx, duration,
|
durationCounter.Add(ctx, duration,
|
||||||
metric.WithAttributes(attrs...),
|
metric.WithAttributes(attrs...),
|
||||||
metric.WithAttributes(cmdStatusAttrs...),
|
metric.WithAttributes(cmdStatusAttrs...),
|
||||||
)
|
)
|
||||||
|
if mp, ok := mp.(MeterProvider); ok {
|
||||||
|
mp.ForceFlush(ctx)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -307,10 +307,14 @@ func runDocker(ctx context.Context, dockerCli *command.DockerCli) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
mp := dockerCli.MeterProvider(ctx)
|
mp := dockerCli.MeterProvider()
|
||||||
defer mp.Shutdown(ctx)
|
if mp, ok := mp.(command.MeterProvider); ok {
|
||||||
otel.SetMeterProvider(mp)
|
defer mp.Shutdown(ctx)
|
||||||
dockerCli.InstrumentCobraCommands(cmd, mp)
|
} else {
|
||||||
|
fmt.Fprint(dockerCli.Err(), "Warning: Unexpected OTEL error, metrics may not be flushed")
|
||||||
|
}
|
||||||
|
|
||||||
|
dockerCli.InstrumentCobraCommands(ctx, cmd)
|
||||||
|
|
||||||
var envs []string
|
var envs []string
|
||||||
args, os.Args, envs, err = processAliases(dockerCli, cmd, args, os.Args)
|
args, os.Args, envs, err = processAliases(dockerCli, cmd, args, os.Args)
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
variable "GO_VERSION" {
|
variable "GO_VERSION" {
|
||||||
default = "1.21.9"
|
default = "1.21.10"
|
||||||
}
|
}
|
||||||
variable "VERSION" {
|
variable "VERSION" {
|
||||||
default = ""
|
default = ""
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# syntax=docker/dockerfile:1
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
ARG GO_VERSION=1.21.9
|
ARG GO_VERSION=1.21.10
|
||||||
ARG ALPINE_VERSION=3.18
|
ARG ALPINE_VERSION=3.18
|
||||||
|
|
||||||
ARG BUILDX_VERSION=0.12.1
|
ARG BUILDX_VERSION=0.12.1
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# syntax=docker/dockerfile:1
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
ARG GO_VERSION=1.21.9
|
ARG GO_VERSION=1.21.10
|
||||||
ARG ALPINE_VERSION=3.18
|
ARG ALPINE_VERSION=3.18
|
||||||
ARG GOLANGCI_LINT_VERSION=v1.55.2
|
ARG GOLANGCI_LINT_VERSION=v1.55.2
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# syntax=docker/dockerfile:1
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
ARG GO_VERSION=1.21.9
|
ARG GO_VERSION=1.21.10
|
||||||
ARG ALPINE_VERSION=3.18
|
ARG ALPINE_VERSION=3.18
|
||||||
ARG MODOUTDATED_VERSION=v0.8.0
|
ARG MODOUTDATED_VERSION=v0.8.0
|
||||||
|
|
||||||
|
|||||||
@@ -117,6 +117,12 @@ data traffic from the management traffic of the cluster.
|
|||||||
|
|
||||||
If unspecified, the IP address or interface of the advertise address is used.
|
If unspecified, the IP address or interface of the advertise address is used.
|
||||||
|
|
||||||
|
Setting `--data-path-addr` does not restrict which interfaces or source IP
|
||||||
|
addresses the VXLAN socket is bound to. Similar to `--advertise-addr`, the
|
||||||
|
purpose of this flag is to inform other members of the swarm about which
|
||||||
|
address to use for control plane traffic. To restrict access to the VXLAN port
|
||||||
|
of the node, use firewall rules.
|
||||||
|
|
||||||
### <a name="data-path-port"></a> Configure port number for data traffic (--data-path-port)
|
### <a name="data-path-port"></a> Configure port number for data traffic (--data-path-port)
|
||||||
|
|
||||||
The `--data-path-port` flag allows you to configure the UDP port number to use
|
The `--data-path-port` flag allows you to configure the UDP port number to use
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/docker/cli/e2e/internal/fixtures"
|
"github.com/docker/cli/e2e/internal/fixtures"
|
||||||
"github.com/docker/cli/internal/test/environment"
|
"github.com/docker/cli/internal/test/environment"
|
||||||
@@ -34,6 +35,22 @@ func TestRunAttachedFromRemoteImageAndRemove(t *testing.T) {
|
|||||||
golden.Assert(t, result.Stderr(), "run-attached-from-remote-and-remove.golden")
|
golden.Assert(t, result.Stderr(), "run-attached-from-remote-and-remove.golden")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Regression test for https://github.com/docker/cli/issues/5053
|
||||||
|
func TestRunInvalidEntrypointWithAutoremove(t *testing.T) {
|
||||||
|
environment.SkipIfDaemonNotLinux(t)
|
||||||
|
|
||||||
|
result := make(chan *icmd.Result)
|
||||||
|
go func() {
|
||||||
|
result <- icmd.RunCommand("docker", "run", "--rm", fixtures.AlpineImage, "invalidcommand")
|
||||||
|
}()
|
||||||
|
select {
|
||||||
|
case r := <-result:
|
||||||
|
r.Assert(t, icmd.Expected{ExitCode: 127})
|
||||||
|
case <-time.After(4 * time.Second):
|
||||||
|
t.Fatal("test took too long, shouldn't hang")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRunWithContentTrust(t *testing.T) {
|
func TestRunWithContentTrust(t *testing.T) {
|
||||||
skip.If(t, environment.RemoteDaemon())
|
skip.If(t, environment.RemoteDaemon())
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
# syntax=docker/dockerfile:1
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
ARG GO_VERSION=1.21.9
|
ARG GO_VERSION=1.21.10
|
||||||
|
|
||||||
FROM golang:${GO_VERSION}-alpine AS generated
|
FROM golang:${GO_VERSION}-alpine AS generated
|
||||||
ENV GOTOOLCHAIN=local
|
ENV GOTOOLCHAIN=local
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@ require (
|
|||||||
github.com/creack/pty v1.1.21
|
github.com/creack/pty v1.1.21
|
||||||
github.com/distribution/reference v0.5.0
|
github.com/distribution/reference v0.5.0
|
||||||
github.com/docker/distribution v2.8.3+incompatible
|
github.com/docker/distribution v2.8.3+incompatible
|
||||||
github.com/docker/docker v26.0.1-0.20240422144514-c8af8ebe4a89+incompatible
|
github.com/docker/docker v26.1.3-0.20240515073302-8e96db1c328d+incompatible
|
||||||
github.com/docker/docker-credential-helpers v0.8.1
|
github.com/docker/docker-credential-helpers v0.8.1
|
||||||
github.com/docker/go-connections v0.5.0
|
github.com/docker/go-connections v0.5.0
|
||||||
github.com/docker/go-units v0.5.0
|
github.com/docker/go-units v0.5.0
|
||||||
|
|||||||
+2
-2
@@ -57,8 +57,8 @@ github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5
|
|||||||
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||||
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
|
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
|
||||||
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||||
github.com/docker/docker v26.0.1-0.20240422144514-c8af8ebe4a89+incompatible h1:9eSHthT5Vvfh3aYy9xUaxMuecDicnMjfe7s9/qndRMw=
|
github.com/docker/docker v26.1.3-0.20240515073302-8e96db1c328d+incompatible h1:J+p52tFajMpC0is/1M2mIArncOp4qa+E8hj5Vwt11vs=
|
||||||
github.com/docker/docker v26.0.1-0.20240422144514-c8af8ebe4a89+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
github.com/docker/docker v26.1.3-0.20240515073302-8e96db1c328d+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||||
github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo=
|
github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo=
|
||||||
github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
|
github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
|
||||||
github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0=
|
github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0=
|
||||||
|
|||||||
Vendored
+1
-1
@@ -56,7 +56,7 @@ github.com/docker/distribution/registry/client/transport
|
|||||||
github.com/docker/distribution/registry/storage/cache
|
github.com/docker/distribution/registry/storage/cache
|
||||||
github.com/docker/distribution/registry/storage/cache/memory
|
github.com/docker/distribution/registry/storage/cache/memory
|
||||||
github.com/docker/distribution/uuid
|
github.com/docker/distribution/uuid
|
||||||
# github.com/docker/docker v26.0.1-0.20240422144514-c8af8ebe4a89+incompatible
|
# github.com/docker/docker v26.1.3-0.20240515073302-8e96db1c328d+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
|
||||||
|
|||||||
Reference in New Issue
Block a user