diff --git a/Makefile b/Makefile index 9c67a1a9..4d03a8de 100644 --- a/Makefile +++ b/Makefile @@ -22,10 +22,10 @@ test: validate-vendor: ./hack/validate-vendor - + validate-docs: ./hack/validate-docs - + validate-all: lint test validate-vendor validate-docs vendor: diff --git a/build/build.go b/build/build.go index 18dc2005..21d6662a 100644 --- a/build/build.go +++ b/build/build.go @@ -684,8 +684,9 @@ func Build(ctx context.Context, drivers []DriverInfo, opt map[string]Options, do resp[k] = res[0] respMu.Unlock() if len(res) == 1 { + digest := res[0].ExporterResponse["containerimage.digest"] if opt.ImageIDFile != "" { - return ioutil.WriteFile(opt.ImageIDFile, []byte(res[0].ExporterResponse["containerimage.digest"]), 0644) + return ioutil.WriteFile(opt.ImageIDFile, []byte(digest), 0644) } return nil } diff --git a/commands/build.go b/commands/build.go index 93ef9570..0b575de7 100644 --- a/commands/build.go +++ b/commands/build.go @@ -3,6 +3,7 @@ package commands import ( "context" "encoding/json" + "fmt" "os" "path/filepath" "strings" @@ -19,7 +20,6 @@ import ( "github.com/moby/buildkit/session/auth/authprovider" "github.com/moby/buildkit/util/appcontext" "github.com/pkg/errors" - "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/pflag" ) @@ -44,10 +44,10 @@ type buildOptions struct { imageIDFile string extraHosts []string networkMode string + quiet bool // unimplemented squash bool - quiet bool allow []string @@ -85,10 +85,6 @@ func runBuild(dockerCli command.Cli, in buildOptions) (err error) { if in.squash { return errors.Errorf("squash currently not implemented") } - if in.quiet { - logrus.Warnf("quiet currently not implemented") - } - ctx := appcontext.Context() ctx, end, err := tracing.TraceCurrentCommand(ctx, "build") @@ -108,6 +104,12 @@ func runBuild(dockerCli command.Cli, in buildOptions) (err error) { pull = *in.pull } + if in.quiet && in.progress != "auto" && in.progress != "quiet" { + return errors.Errorf("progress=%s and quiet cannot be used together", in.progress) + } else if in.quiet { + in.progress = "quiet" + } + opts := build.Options{ Inputs: build.Inputs{ ContextPath: in.contextPath, @@ -214,17 +216,26 @@ func runBuild(dockerCli command.Cli, in buildOptions) (err error) { contextPathHash = in.contextPath } - return buildTargets(ctx, dockerCli, map[string]build.Options{defaultTargetName: opts}, in.progress, contextPathHash, in.builder, in.metadataFile) + imageID, err := buildTargets(ctx, dockerCli, map[string]build.Options{defaultTargetName: opts}, in.progress, contextPathHash, in.builder, in.metadataFile) + if err != nil { + return err + } + + if in.quiet { + fmt.Println(imageID) + } + return nil } -func buildTargets(ctx context.Context, dockerCli command.Cli, opts map[string]build.Options, progressMode, contextPathHash, instance string, metadataFile string) error { +func buildTargets(ctx context.Context, dockerCli command.Cli, opts map[string]build.Options, progressMode, contextPathHash, instance string, metadataFile string) (imageID string, err error) { dis, err := getInstanceOrDefault(ctx, dockerCli, instance, contextPathHash) if err != nil { - return err + return "", err } ctx2, cancel := context.WithCancel(context.TODO()) defer cancel() + printer := progress.NewPrinter(ctx2, os.Stderr, progressMode) resp, err := build.Build(ctx, dis, opts, dockerAPI(dockerCli), dockerCli.ConfigFile(), printer) @@ -233,20 +244,20 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, opts map[string]bu err = err1 } if err != nil { - return err + return "", err } if len(metadataFile) > 0 && resp != nil { mdatab, err := json.MarshalIndent(resp[defaultTargetName].ExporterResponse, "", " ") if err != nil { - return err + return "", err } if err := ioutils.AtomicWriteFile(metadataFile, mdatab, 0644); err != nil { - return err + return "", err } } - return err + return resp[defaultTargetName].ExporterResponse["containerimage.digest"], err } func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { @@ -287,14 +298,14 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { flags.StringSliceVar(&options.allow, "allow", []string{}, "Allow extra privileged entitlement, e.g. network.host, security.insecure") - // not implemented flags.BoolVarP(&options.quiet, "quiet", "q", false, "Suppress the build output and print image ID on success") flags.StringVar(&options.networkMode, "network", "default", "Set the networking mode for the RUN instructions during build") flags.StringSliceVar(&options.extraHosts, "add-host", []string{}, "Add a custom host-to-IP mapping (host:ip)") flags.SetAnnotation("add-host", "docs.external.url", []string{"https://docs.docker.com/engine/reference/commandline/build/#add-entries-to-container-hosts-file---add-host"}) flags.StringVar(&options.imageIDFile, "iidfile", "", "Write the image ID to the file") + + // not implemented flags.BoolVar(&options.squash, "squash", false, "Squash newly built layers into a single new layer") - flags.MarkHidden("quiet") flags.MarkHidden("squash") // hidden flags diff --git a/docs/reference/buildx_build.md b/docs/reference/buildx_build.md index a9c1f39b..7e67fede 100644 --- a/docs/reference/buildx_build.md +++ b/docs/reference/buildx_build.md @@ -33,6 +33,7 @@ Start a build | [`--progress string`](#progress) | Set type of progress output (auto, plain, tty). Use plain to show container output | | `--pull` | Always attempt to pull a newer version of the image | | [`--push`](#push) | Shorthand for --output=type=registry | +| `-q`, `--quiet` | Suppress the build output and print image ID on success | | `--secret stringArray` | Secret file to expose to the build: id=mysecret,src=/local/secret | | `--ssh stringArray` | SSH agent socket or keys to expose to the build (format: `default\|[=\|[,]]`) | | [`-t`](https://docs.docker.com/engine/reference/commandline/build/#tag-an-image--t), [`--tag stringArray`](https://docs.docker.com/engine/reference/commandline/build/#tag-an-image--t) | Name and optionally a tag in the 'name:tag' format |