build: change --console=[auto,false,true] to --progress=[auto,plain,tty]

This changes the experimental --console flag to --progress following
feedback indicating avoidable confusion.

In addition to naming changes, the help output now has an additional
clarification, specifically: container output during builds are only
shown when progress output is set to plain. Not mentioning this was also
a big cause of confusion.

Signed-off-by: Tibor Vass <tibor@docker.com>
This commit is contained in:
Tibor Vass 2018-08-06 22:44:28 +00:00
parent b5768bea9b
commit faeb8bb571
3 changed files with 22 additions and 43 deletions

View File

@ -58,7 +58,7 @@ type buildOptions struct {
isolation string isolation string
quiet bool quiet bool
noCache bool noCache bool
console opts.NullableBool progress string
rm bool rm bool
forceRm bool forceRm bool
pull bool pull bool
@ -153,9 +153,9 @@ func NewBuildCommand(dockerCli command.Cli) *cobra.Command {
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.Var(&options.console, "console", "Show console output (with buildkit only) (true, false, auto)") 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.SetAnnotation("console", "experimental", nil) flags.SetAnnotation("progress", "experimental", nil)
flags.SetAnnotation("console", "version", []string{"1.38"}) flags.SetAnnotation("progress", "version", []string{"1.38"})
return cmd return cmd
} }

View File

@ -15,6 +15,7 @@ import (
"github.com/docker/cli/cli" "github.com/docker/cli/cli"
"github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/command/image/build" "github.com/docker/cli/cli/command/image/build"
"github.com/docker/cli/opts"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/jsonmessage"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
@ -191,11 +192,14 @@ func doBuild(ctx context.Context, eg *errgroup.Group, dockerCli command.Cli, opt
t := newTracer() t := newTracer()
ssArr := []*client.SolveStatus{} ssArr := []*client.SolveStatus{}
if err := opts.ValidateProgressOutput(options.progress); err != nil {
return err
}
displayStatus := func(out *os.File, displayCh chan *client.SolveStatus) { displayStatus := func(out *os.File, displayCh chan *client.SolveStatus) {
var c console.Console var c console.Console
// TODO: Handle interactive output in non-interactive environment. // TODO: Handle tty output in non-tty environment.
consoleOpt := options.console.Value() if cons, err := console.ConsoleFromFile(out); err == nil && (options.progress == "auto" || options.progress == "tty") {
if cons, err := console.ConsoleFromFile(out); err == nil && (consoleOpt == nil || *consoleOpt) {
c = cons c = cons
} }
// not using shared context to not disrupt display but let is finish reporting errors // not using shared context to not disrupt display but let is finish reporting errors

View File

@ -6,7 +6,6 @@ import (
"net" "net"
"path" "path"
"regexp" "regexp"
"strconv"
"strings" "strings"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
@ -308,6 +307,17 @@ func ValidateSysctl(val string) (string, error) {
return "", fmt.Errorf("sysctl '%s' is not whitelisted", val) return "", fmt.Errorf("sysctl '%s' is not whitelisted", val)
} }
// ValidateProgressOutput errors out if an invalid value is passed to --progress
func ValidateProgressOutput(val string) error {
valid := []string{"auto", "plain", "tty"}
for _, s := range valid {
if s == val {
return nil
}
}
return fmt.Errorf("invalid value %q passed to --progress, valid values are: %s", val, strings.Join(valid, ", "))
}
// FilterOpt is a flag type for validating filters // FilterOpt is a flag type for validating filters
type FilterOpt struct { type FilterOpt struct {
filter filters.Args filter filters.Args
@ -497,38 +507,3 @@ func (m *MemSwapBytes) UnmarshalJSON(s []byte) error {
b := MemBytes(*m) b := MemBytes(*m)
return b.UnmarshalJSON(s) return b.UnmarshalJSON(s)
} }
// NullableBool is a type for tri-state boolean options
type NullableBool struct {
b *bool
}
// Type returns the type
func (n *NullableBool) Type() string {
return ""
}
// Value returns the value in *bool
func (n *NullableBool) Value() *bool {
return n.b
}
// Set sets the value. If value is empty string or "auto", nil is set.
// Otherwise true or false are set based on flag.Bool behavior.
func (n *NullableBool) Set(value string) error {
if value != "auto" && value != "" {
b, err := strconv.ParseBool(value)
if err != nil {
return err
}
n.b = &b
}
return nil
}
func (n *NullableBool) String() string {
if n.b == nil {
return "auto"
}
return strconv.FormatBool(*n.b)
}