From 62bfb19db484f6d5ef915e616364b307133bfa01 Mon Sep 17 00:00:00 2001 From: Tianon Gravi Date: Wed, 7 Jun 2023 16:33:10 -0700 Subject: [PATCH] Fix a couple `--invoke` entrypoint interaction bugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When running `--invoke` against images that have `Cmd` set, the interactions with `Entrypoint` start to cause issues like the following: /usr/local/bin/bash: /usr/local/bin/bash: cannot execute binary file Or: sh: can't open 'bash': No such file or directory This patch fixes those by explicitly setting `Cmd` to be empty if it is unspecified and `Entrypoint` is being set, which matches `docker`'s behavior: $ docker image inspect --format '{{ json .Config.Entrypoint }} + {{ json .Config.Cmd }}' bash ["docker-entrypoint.sh"] + ["bash"] $ docker create --name foo --entrypoint bash bash $ docker container inspect --format '{{ json .Config.Entrypoint }} + {{ json .Config.Cmd }}' foo ["bash"] + null $ docker rm foo $ docker create --name foo bash ls $ docker container inspect --format '{{ json .Config.Entrypoint }} + {{ json .Config.Cmd }}' foo ["docker-entrypoint.sh"] + ["ls"] (There are still some weird edge cases in the interaction between the `InvokeConfig` and the original image config, but this fixes the most irritating for me and the rest are going to be deeper changes that are possibly less acceptable. 😅) Signed-off-by: Tianon Gravi --- commands/build.go | 3 +++ monitor/monitor.go | 1 + 2 files changed, 4 insertions(+) diff --git a/commands/build.go b/commands/build.go index 97b863d2..b8348f7b 100644 --- a/commands/build.go +++ b/commands/build.go @@ -726,6 +726,9 @@ func parseInvokeConfig(invoke string) (cfg invokeConfig, err error) { cfg.Cmd = append(cfg.Cmd, value) // TODO: support JSON case "entrypoint": cfg.Entrypoint = append(cfg.Entrypoint, value) // TODO: support JSON + if cfg.Cmd == nil { + cfg.Cmd = []string{} + } case "env": cfg.Env = append(cfg.Env, value) case "user": diff --git a/monitor/monitor.go b/monitor/monitor.go index 0763bfb6..9652d779 100644 --- a/monitor/monitor.go +++ b/monitor/monitor.go @@ -282,6 +282,7 @@ func (m *monitor) startInvoke(ctx context.Context, pid string, cfg controllerapi } if len(cfg.Entrypoint) == 0 && len(cfg.Cmd) == 0 { cfg.Entrypoint = []string{"sh"} // launch shell by default + cfg.Cmd = []string{} } go func() { // Start a new invoke