mirror of https://github.com/docker/cli.git
Merge pull request #1427 from tiborvass/hide-buildkit-flags-if-not-enabled
build: only show buildkit-specific flags if buildkit is enabled
This commit is contained in:
commit
6153a0967b
|
@ -8,6 +8,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/cli/cli"
|
"github.com/docker/cli/cli"
|
||||||
|
@ -133,6 +134,20 @@ func (cli *DockerCli) ContentTrustEnabled() bool {
|
||||||
return cli.contentTrust
|
return cli.contentTrust
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BuildKitEnabled returns whether buildkit is enabled either through a daemon setting
|
||||||
|
// or otherwise the client-side DOCKER_BUILDKIT environment variable
|
||||||
|
func BuildKitEnabled(si ServerInfo) (bool, error) {
|
||||||
|
buildkitEnabled := si.BuildkitVersion == types.BuilderBuildKit
|
||||||
|
if buildkitEnv := os.Getenv("DOCKER_BUILDKIT"); buildkitEnv != "" {
|
||||||
|
var err error
|
||||||
|
buildkitEnabled, err = strconv.ParseBool(buildkitEnv)
|
||||||
|
if err != nil {
|
||||||
|
return false, errors.Wrap(err, "DOCKER_BUILDKIT environment variable expects boolean value")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buildkitEnabled, nil
|
||||||
|
}
|
||||||
|
|
||||||
// ManifestStore returns a store for local manifests
|
// ManifestStore returns a store for local manifests
|
||||||
func (cli *DockerCli) ManifestStore() manifeststore.Store {
|
func (cli *DockerCli) ManifestStore() manifeststore.Store {
|
||||||
// TODO: support override default location from config file
|
// TODO: support override default location from config file
|
||||||
|
|
|
@ -13,7 +13,6 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/docker/cli/cli"
|
"github.com/docker/cli/cli"
|
||||||
|
@ -137,6 +136,8 @@ func NewBuildCommand(dockerCli command.Cli) *cobra.Command {
|
||||||
flags.BoolVar(&options.pull, "pull", false, "Always attempt to pull a newer version of the image")
|
flags.BoolVar(&options.pull, "pull", false, "Always attempt to pull a newer version of the image")
|
||||||
flags.StringSliceVar(&options.cacheFrom, "cache-from", []string{}, "Images to consider as cache sources")
|
flags.StringSliceVar(&options.cacheFrom, "cache-from", []string{}, "Images to consider as cache sources")
|
||||||
flags.BoolVar(&options.compress, "compress", false, "Compress the build context using gzip")
|
flags.BoolVar(&options.compress, "compress", false, "Compress the build context using gzip")
|
||||||
|
flags.SetAnnotation("compress", "no-buildkit", nil)
|
||||||
|
|
||||||
flags.StringSliceVar(&options.securityOpt, "security-opt", []string{}, "Security options")
|
flags.StringSliceVar(&options.securityOpt, "security-opt", []string{}, "Security options")
|
||||||
flags.StringVar(&options.networkMode, "network", "default", "Set the networking mode for the RUN instructions during build")
|
flags.StringVar(&options.networkMode, "network", "default", "Set the networking mode for the RUN instructions during build")
|
||||||
flags.SetAnnotation("network", "version", []string{"1.25"})
|
flags.SetAnnotation("network", "version", []string{"1.25"})
|
||||||
|
@ -154,14 +155,18 @@ func NewBuildCommand(dockerCli command.Cli) *cobra.Command {
|
||||||
flags.BoolVar(&options.stream, "stream", false, "Stream attaches to server to negotiate build context")
|
flags.BoolVar(&options.stream, "stream", false, "Stream attaches to server to negotiate build context")
|
||||||
flags.SetAnnotation("stream", "experimental", nil)
|
flags.SetAnnotation("stream", "experimental", nil)
|
||||||
flags.SetAnnotation("stream", "version", []string{"1.31"})
|
flags.SetAnnotation("stream", "version", []string{"1.31"})
|
||||||
|
flags.SetAnnotation("stream", "no-buildkit", nil)
|
||||||
|
|
||||||
flags.StringVar(&options.progress, "progress", "auto", "Set type of progress output (only if BuildKit enabled) (auto, plain, tty). Use plain to show container output")
|
flags.StringVar(&options.progress, "progress", "auto", "Set type of progress output (auto, plain, tty). Use plain to show container output")
|
||||||
|
flags.SetAnnotation("progress", "buildkit", nil)
|
||||||
|
|
||||||
flags.StringArrayVar(&options.secrets, "secret", []string{}, "Secret file to expose to the build (only if BuildKit enabled): id=mysecret,src=/local/secret")
|
flags.StringArrayVar(&options.secrets, "secret", []string{}, "Secret file to expose to the build (only if BuildKit enabled): id=mysecret,src=/local/secret")
|
||||||
flags.SetAnnotation("secret", "version", []string{"1.39"})
|
flags.SetAnnotation("secret", "version", []string{"1.39"})
|
||||||
|
flags.SetAnnotation("secret", "buildkit", nil)
|
||||||
|
|
||||||
flags.StringArrayVar(&options.ssh, "ssh", []string{}, "SSH agent socket or keys to expose to the build (only if BuildKit enabled) (format: default|<id>[=<socket>|<key>[,<key>]])")
|
flags.StringArrayVar(&options.ssh, "ssh", []string{}, "SSH agent socket or keys to expose to the build (only if BuildKit enabled) (format: default|<id>[=<socket>|<key>[,<key>]])")
|
||||||
flags.SetAnnotation("ssh", "version", []string{"1.39"})
|
flags.SetAnnotation("ssh", "version", []string{"1.39"})
|
||||||
|
flags.SetAnnotation("ssh", "buildkit", nil)
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,22 +188,17 @@ func (out *lastProgressOutput) WriteProgress(prog progress.Progress) error {
|
||||||
|
|
||||||
// nolint: gocyclo
|
// nolint: gocyclo
|
||||||
func runBuild(dockerCli command.Cli, options buildOptions) error {
|
func runBuild(dockerCli command.Cli, options buildOptions) error {
|
||||||
if buildkitEnv := os.Getenv("DOCKER_BUILDKIT"); buildkitEnv != "" {
|
buildkitEnabled, err := command.BuildKitEnabled(dockerCli.ServerInfo())
|
||||||
enableBuildkit, err := strconv.ParseBool(buildkitEnv)
|
if err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return errors.Wrap(err, "DOCKER_BUILDKIT environment variable expects boolean value")
|
}
|
||||||
}
|
if buildkitEnabled {
|
||||||
if enableBuildkit {
|
|
||||||
return runBuildBuildKit(dockerCli, options)
|
|
||||||
}
|
|
||||||
} else if dockerCli.ServerInfo().BuildkitVersion == types.BuilderBuildKit {
|
|
||||||
return runBuildBuildKit(dockerCli, options)
|
return runBuildBuildKit(dockerCli, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
buildCtx io.ReadCloser
|
buildCtx io.ReadCloser
|
||||||
dockerfileCtx io.ReadCloser
|
dockerfileCtx io.ReadCloser
|
||||||
err error
|
|
||||||
contextDir string
|
contextDir string
|
||||||
tempDir string
|
tempDir string
|
||||||
relDockerfile string
|
relDockerfile string
|
||||||
|
|
|
@ -100,8 +100,10 @@ func setHelpFunc(dockerCli *command.DockerCli, cmd *cobra.Command, flags *pflag.
|
||||||
ccmd.Println(err)
|
ccmd.Println(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if err := hideUnsupportedFeatures(ccmd, dockerCli); err != nil {
|
||||||
hideUnsupportedFeatures(ccmd, dockerCli)
|
ccmd.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
defaultHelpFunc(ccmd, args)
|
defaultHelpFunc(ccmd, args)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -235,15 +237,21 @@ func hideFeatureSubCommand(subcmd *cobra.Command, hasFeature bool, annotation st
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func hideUnsupportedFeatures(cmd *cobra.Command, details versionDetails) {
|
func hideUnsupportedFeatures(cmd *cobra.Command, details versionDetails) error {
|
||||||
clientVersion := details.Client().ClientVersion()
|
clientVersion := details.Client().ClientVersion()
|
||||||
osType := details.ServerInfo().OSType
|
osType := details.ServerInfo().OSType
|
||||||
hasExperimental := details.ServerInfo().HasExperimental
|
hasExperimental := details.ServerInfo().HasExperimental
|
||||||
hasExperimentalCLI := details.ClientInfo().HasExperimental
|
hasExperimentalCLI := details.ClientInfo().HasExperimental
|
||||||
|
hasBuildKit, err := command.BuildKitEnabled(details.ServerInfo())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
cmd.Flags().VisitAll(func(f *pflag.Flag) {
|
cmd.Flags().VisitAll(func(f *pflag.Flag) {
|
||||||
hideFeatureFlag(f, hasExperimental, "experimental")
|
hideFeatureFlag(f, hasExperimental, "experimental")
|
||||||
hideFeatureFlag(f, hasExperimentalCLI, "experimentalCLI")
|
hideFeatureFlag(f, hasExperimentalCLI, "experimentalCLI")
|
||||||
|
hideFeatureFlag(f, hasBuildKit, "buildkit")
|
||||||
|
hideFeatureFlag(f, !hasBuildKit, "no-buildkit")
|
||||||
// hide flags not supported by the server
|
// hide flags not supported by the server
|
||||||
if !isOSTypeSupported(f, osType) || !isVersionSupported(f, clientVersion) {
|
if !isOSTypeSupported(f, osType) || !isVersionSupported(f, clientVersion) {
|
||||||
f.Hidden = true
|
f.Hidden = true
|
||||||
|
@ -259,6 +267,8 @@ func hideUnsupportedFeatures(cmd *cobra.Command, details versionDetails) {
|
||||||
for _, subcmd := range cmd.Commands() {
|
for _, subcmd := range cmd.Commands() {
|
||||||
hideFeatureSubCommand(subcmd, hasExperimental, "experimental")
|
hideFeatureSubCommand(subcmd, hasExperimental, "experimental")
|
||||||
hideFeatureSubCommand(subcmd, hasExperimentalCLI, "experimentalCLI")
|
hideFeatureSubCommand(subcmd, hasExperimentalCLI, "experimentalCLI")
|
||||||
|
hideFeatureSubCommand(subcmd, hasBuildKit, "buildkit")
|
||||||
|
hideFeatureSubCommand(subcmd, !hasBuildKit, "no-buildkit")
|
||||||
// hide subcommands not supported by the server
|
// hide subcommands not supported by the server
|
||||||
if subcmdVersion, ok := subcmd.Annotations["version"]; ok && versions.LessThan(clientVersion, subcmdVersion) {
|
if subcmdVersion, ok := subcmd.Annotations["version"]; ok && versions.LessThan(clientVersion, subcmdVersion) {
|
||||||
subcmd.Hidden = true
|
subcmd.Hidden = true
|
||||||
|
@ -267,6 +277,7 @@ func hideUnsupportedFeatures(cmd *cobra.Command, details versionDetails) {
|
||||||
subcmd.Hidden = true
|
subcmd.Hidden = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checks if a command or one of its ancestors is in the list
|
// Checks if a command or one of its ancestors is in the list
|
||||||
|
@ -313,6 +324,7 @@ func areFlagsSupported(cmd *cobra.Command, details versionDetails) error {
|
||||||
if _, ok := f.Annotations["experimentalCLI"]; ok && !hasExperimentalCLI {
|
if _, ok := f.Annotations["experimentalCLI"]; ok && !hasExperimentalCLI {
|
||||||
errs = append(errs, fmt.Sprintf("\"--%s\" is on a Docker cli with experimental cli features enabled", f.Name))
|
errs = append(errs, fmt.Sprintf("\"--%s\" is on a Docker cli with experimental cli features enabled", f.Name))
|
||||||
}
|
}
|
||||||
|
// buildkit-specific flags are noop when buildkit is not enabled, so we do not add an error in that case
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
|
|
Loading…
Reference in New Issue