diff --git a/commands/build.go b/commands/build.go index b8348f7b..15355ce7 100644 --- a/commands/build.go +++ b/commands/build.go @@ -704,6 +704,7 @@ func parseInvokeConfig(invoke string) (cfg invokeConfig, err error) { } csvReader := csv.NewReader(strings.NewReader(invoke)) + csvReader.LazyQuotes = true fields, err := csvReader.Read() if err != nil { return cfg, err @@ -723,14 +724,14 @@ func parseInvokeConfig(invoke string) (cfg invokeConfig, err error) { value := parts[1] switch key { case "args": - cfg.Cmd = append(cfg.Cmd, value) // TODO: support JSON + cfg.Cmd = append(cfg.Cmd, maybeJSONArray(value)...) case "entrypoint": - cfg.Entrypoint = append(cfg.Entrypoint, value) // TODO: support JSON + cfg.Entrypoint = append(cfg.Entrypoint, maybeJSONArray(value)...) if cfg.Cmd == nil { cfg.Cmd = []string{} } case "env": - cfg.Env = append(cfg.Env, value) + cfg.Env = append(cfg.Env, maybeJSONArray(value)...) case "user": cfg.User = value cfg.NoUser = false @@ -749,6 +750,14 @@ func parseInvokeConfig(invoke string) (cfg invokeConfig, err error) { return cfg, nil } +func maybeJSONArray(v string) []string { + var list []string + if err := json.Unmarshal([]byte(v), &list); err == nil { + return list + } + return []string{v} +} + func listToMap(values []string, defaultEnv bool) map[string]string { result := make(map[string]string, len(values)) for _, value := range values { diff --git a/docs/guides/debugging.md b/docs/guides/debugging.md index df1b49b8..08e68631 100644 --- a/docs/guides/debugging.md +++ b/docs/guides/debugging.md @@ -49,6 +49,16 @@ bin etc lib mnt proc run srv tmp var dev home media opt root sbin sys usr work ``` +Optional long form allows you specifying detailed configurations of the process. +It must be CSV-styled comma-separated key-value pairs. +Supported keys are `args` (can be JSON array format), `entrypoint` (can be JSON array format), `env` (can be JSON array format), `user`, `cwd` and `tty` (bool). + +Example: + +``` +$ docker buildx build --invoke 'entrypoint=["sh"],"args=[""-c"", ""env | grep -e FOO -e AAA""]","env=[""FOO=bar"", ""AAA=bbb""]"' . +``` + #### `on-error` If you want to start a debug session when a build fails, you can use @@ -151,4 +161,4 @@ Attached to process "3ug8iqaufiwwnukimhqqt06jz". Press Ctrl-a-c to switch to the bin etc lib mnt proc run srv tmp var dev home media opt root sbin sys usr work / # -``` \ No newline at end of file +```