docker / buildx

Docker CLI plugin for extended build capabilities with BuildKit
Apache License 2.0
3.56k stars 481 forks source link

Proposal: flag to list bake targets #1072

Closed crazy-max closed 2 months ago

crazy-max commented 2 years ago

Atm the bake definition needs to be opened to find out available targets. This is not practical and should be available through the cli.

Suggest to add a --targets or --list flag for bake cmd that would list the available targets.

Targets would need a description field to be displayed:

variable "GO_VERSION" {
  default = "1.17"
}

target "_common" {
  args = {
    GO_VERSION = GO_VERSION
  }
}

target "lint" {
  description = "Validate using golangci-lint and yamllint linters"
  inherits = ["_common"]
  dockerfile = "./hack/dockerfiles/lint.Dockerfile"
  output = ["type=cacheonly"]
}

target "test" {
  description = "Runs tests suite" 
  inherits = ["_common"]
  target = "test-coverage"
  output = ["./coverage"]
}

target "binaries" {
  description = "Build binaries for the current platform"
  inherits = ["_common"]
  target = "binaries"
  output = ["./bin"]
  platforms = ["local"]
}

target "binaries-cross" {
  description = "Build binaries for multi platform"
  inherits = ["binaries"]
  platforms = [
    "darwin/amd64",
    "darwin/arm64",
    "linux/amd64",
    "linux/arm/v6",
    "linux/arm/v7",
    "linux/arm64",
    "linux/ppc64le",
    "linux/riscv64",
    "linux/s390x",
    "windows/amd64",
    "windows/arm64"
  ]
}
$ docker buildx bake --list
lint:           Validate using golangci-lint and yamllint linters
test:           Runs tests suite
binaries:       Build binaries for the current platform
binaries-cross: Build binaries for multi platform

Targets that don't specify a description will not be displayed.

This flag cannot be used if a target is specified.

For compose it might be tricky as there is no such field in the compose spec that we could use. Maybe a comment can work in this case but not supported with JSON format:

# Build binaries for the current platform
target "binaries" {
  inherits = ["_common"]
  target = "binaries"
  output = ["./bin"]
  platforms = ["local"]
}
services:
  binaries: # Build binaries for the current platform
    build:
      target: binaries

Or an extra arg to target:

target "binaries" "Build binaries for the current platform" {
  inherits = ["_common"]
  target = "binaries"
  output = ["./bin"]
  platforms = ["local"]
}

But again not suitable for a JSON representation as well as a compose file.

Open to suggestions.

thaJeztah commented 2 years ago

This looks useful, but wondering if we want to limit it to just targets; variables could be important as well (?) Perhaps a command that (pretty)prints information about the bake file?

skaldesh commented 2 years ago

Why exclude targets without a description? I think its useful to have them printed regardless

crazy-max commented 2 years ago

We should also take a look at what is currently done in just: https://github.com/casey/just#command-line-options

jedevc commented 2 years ago

This looks useful, but wondering if we want to limit it to just targets; variables could be important as well (?) Perhaps a command that (pretty)prints information about the bake file?

I think this is a slightly different case than printing out the targets/groups, as far as I'm aware the variables are an hcl-level concept, and are removed upon parsing?

thaJeztah commented 2 years ago

I think this is a slightly different case than printing out the targets/groups, as far as I'm aware the variables are an hcl-level concept, and are removed upon parsing?

Possibly, yes. My view on this was; "what information would I be looking for (as a user) that I can pass to buildx bake to control the build?"; one of that is the target to build, but other parameters can be variables that it takes.

jedevc commented 1 year ago

Is there anything blocking starting development on this? I'm happy to take a look.

I wonder if we could automagically extract descriptions from the Dockerfile using the new --print feature, if the target stage has a comment? And then allow overriding with the description bake field?

jsternberg commented 2 months ago

This seems to have already been done in https://github.com/docker/buildx/pull/2556. I'm going to close this issue.