From bb57783ab81527a568d7d9e71d008dabf078f9db Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Tue, 22 Aug 2023 09:34:09 +0200 Subject: [PATCH] cmd/docker: areFlagsSupported: don't Ping if not needed This is a similar fix as 006c9463894581a69845d3f25131acf15b73727f, which fixed this for detection of commands that were executed. Make sure we don't call the "/_ping" endpoint if we don't need to. Signed-off-by: Sebastiaan van Stijn --- cmd/docker/docker.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cmd/docker/docker.go b/cmd/docker/docker.go index 30c48b40d1a7..e0504771bf25 100644 --- a/cmd/docker/docker.go +++ b/cmd/docker/docker.go @@ -401,14 +401,22 @@ func areFlagsSupported(cmd *cobra.Command, details versionDetails) error { errs := []string{} cmd.Flags().VisitAll(func(f *pflag.Flag) { - if !f.Changed { + if !f.Changed || len(f.Annotations) == 0 { return } - if !isVersionSupported(f, details.CurrentVersion()) { + // Important: in the code below, calls to "details.CurrentVersion()" and + // "details.ServerInfo()" are deliberately executed inline to make them + // be executed "lazily". This is to prevent making a connection with the + // daemon to perform a "ping" (even for flags that do not require a + // daemon connection). + // + // See commit b39739123b845f872549e91be184cc583f5b387c for details. + + if _, ok := f.Annotations["version"]; ok && !isVersionSupported(f, details.CurrentVersion()) { errs = append(errs, fmt.Sprintf(`"--%s" requires API version %s, but the Docker daemon API version is %s`, f.Name, getFlagAnnotation(f, "version"), details.CurrentVersion())) return } - if !isOSTypeSupported(f, details.ServerInfo().OSType) { + if _, ok := f.Annotations["ostype"]; ok && !isOSTypeSupported(f, details.ServerInfo().OSType) { errs = append(errs, fmt.Sprintf( `"--%s" is only supported on a Docker daemon running on %s, but the Docker daemon is running on %s`, f.Name,