diff --git a/builder/builder.go b/builder/builder.go index fb344e97e3..a8c8d58d14 100644 --- a/builder/builder.go +++ b/builder/builder.go @@ -70,6 +70,9 @@ type buildFile struct { // Deprecated, original writer used for ImagePull. To be removed. outOld io.Writer sf *utils.StreamFormatter + + // cmdSet indicates is CMD was setted in current Dockerfile + cmdSet bool } func (b *buildFile) clearTmp(containers map[string]struct{}) { @@ -306,12 +309,17 @@ func (b *buildFile) CmdCmd(args string) error { if err := b.commit("", b.config.Cmd, fmt.Sprintf("CMD %v", cmd)); err != nil { return err } + b.cmdSet = true return nil } func (b *buildFile) CmdEntrypoint(args string) error { entrypoint := b.buildCmdFromJson(args) b.config.Entrypoint = entrypoint + // if there is no cmd in current Dockerfile - cleanup cmd + if !b.cmdSet { + b.config.Cmd = nil + } if err := b.commit("", b.config.Cmd, fmt.Sprintf("ENTRYPOINT %v", entrypoint)); err != nil { return err } diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 57d004ea80..05ad5476f2 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -1310,8 +1310,8 @@ func TestBuildEntrypointRunCleanup(t *testing.T) { if err != nil { t.Fatal(err) } - // Cmd inherited from busybox, maybe will be fixed in #5147 - if expected := "[/bin/sh]"; res != expected { + // Cmd must be cleaned up + if expected := ""; res != expected { t.Fatalf("Cmd %s, expected %s", res, expected) } logDone("build - cleanup cmd after RUN") @@ -1875,3 +1875,36 @@ func TestBuildFromGIT(t *testing.T) { } logDone("build - build from GIT") } + +func TestBuildCleanupCmdOnEntrypoint(t *testing.T) { + name := "testbuildcmdcleanuponentrypoint" + defer deleteImages(name) + if _, err := buildImage(name, + `FROM scratch + CMD ["test"] + ENTRYPOINT ["echo"]`, + true); err != nil { + t.Fatal(err) + } + if _, err := buildImage(name, + fmt.Sprintf(`FROM %s + ENTRYPOINT ["cat"]`, name), + true); err != nil { + t.Fatal(err) + } + res, err := inspectField(name, "Config.Cmd") + if err != nil { + t.Fatal(err) + } + if expected := ""; res != expected { + t.Fatalf("Cmd %s, expected %s", res, expected) + } + res, err = inspectField(name, "Config.Entrypoint") + if err != nil { + t.Fatal(err) + } + if expected := "[cat]"; res != expected { + t.Fatalf("Entrypoint %s, expected %s", res, expected) + } + logDone("build - cleanup cmd on ENTRYPOINT") +}