From 234f0e4f79c27a4820f75a504fdcd45b2981a68a Mon Sep 17 00:00:00 2001 From: Erik Hollensbe Date: Fri, 29 Aug 2014 12:49:16 -0700 Subject: [PATCH 1/8] builder/parser/dumper: Handle newlines appropriately. Docker-DCO-1.1-Signed-off-by: Erik Hollensbe (github: erikh) --- builder/parser/dumper/main.go | 2 +- builder/parser/testfiles/brimstone-consuldock/result | 2 +- builder/parser/testfiles/brimstone-docker-consul/result | 2 +- builder/parser/testfiles/cpuguy83-nagios/result | 2 +- builder/parser/testfiles/docker/result | 2 +- builder/parser/testfiles/escapes/result | 2 +- builder/parser/testfiles/influxdb/result | 2 +- .../jeztah-invalid-json-json-inside-string-double/result | 2 +- .../testfiles/jeztah-invalid-json-json-inside-string/result | 2 +- .../parser/testfiles/jeztah-invalid-json-single-quotes/result | 2 +- .../testfiles/jeztah-invalid-json-unterminated-bracket/result | 2 +- .../testfiles/jeztah-invalid-json-unterminated-string/result | 2 +- builder/parser/testfiles/kartar-entrypoint-oddities/result | 2 +- builder/parser/testfiles/lk4d4-the-edge-case-generator/result | 2 +- builder/parser/testfiles/mail/result | 2 +- builder/parser/testfiles/mumble/result | 2 +- builder/parser/testfiles/nginx/result | 2 +- builder/parser/testfiles/tf2/result | 2 +- builder/parser/testfiles/weechat/result | 2 +- builder/parser/testfiles/znc/result | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/builder/parser/dumper/main.go b/builder/parser/dumper/main.go index aea7ee74cb..33202b7038 100644 --- a/builder/parser/dumper/main.go +++ b/builder/parser/dumper/main.go @@ -26,7 +26,7 @@ func main() { if err != nil { panic(err) } else { - fmt.Print(ast.Dump()) + fmt.Println(ast.Dump()) } } } diff --git a/builder/parser/testfiles/brimstone-consuldock/result b/builder/parser/testfiles/brimstone-consuldock/result index b6ef4f817b..927f753514 100644 --- a/builder/parser/testfiles/brimstone-consuldock/result +++ b/builder/parser/testfiles/brimstone-consuldock/result @@ -2,4 +2,4 @@ (maintainer "brimstone@the.narro.ws") (env "GOPATH" "/go") (entrypoint "/usr/local/bin/consuldock") -(run "apt-get update && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean && apt-get install -y --no-install-recommends git golang ca-certificates && apt-get clean && rm -rf /var/lib/apt/lists && go get -v github.com/brimstone/consuldock && mv $GOPATH/bin/consuldock /usr/local/bin/consuldock && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty && apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') && rm /tmp/dpkg.* && rm -rf $GOPATH") \ No newline at end of file +(run "apt-get update && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean && apt-get install -y --no-install-recommends git golang ca-certificates && apt-get clean && rm -rf /var/lib/apt/lists && go get -v github.com/brimstone/consuldock && mv $GOPATH/bin/consuldock /usr/local/bin/consuldock && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty && apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') && rm /tmp/dpkg.* && rm -rf $GOPATH") diff --git a/builder/parser/testfiles/brimstone-docker-consul/result b/builder/parser/testfiles/brimstone-docker-consul/result index e7fee03985..86723dde7f 100644 --- a/builder/parser/testfiles/brimstone-docker-consul/result +++ b/builder/parser/testfiles/brimstone-docker-consul/result @@ -6,4 +6,4 @@ (run "cd /tmp && wget https://dl.bintray.com/mitchellh/consul/0.3.1_web_ui.zip -O web_ui.zip && unzip web_ui.zip && mv dist /webui && rm web_ui.zip") (run "apt-get update && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean && apt-get install -y --no-install-recommends unzip wget && apt-get clean && rm -rf /var/lib/apt/lists && cd /tmp && wget https://dl.bintray.com/mitchellh/consul/0.3.1_web_ui.zip -O web_ui.zip && unzip web_ui.zip && mv dist /webui && rm web_ui.zip && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty && apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') && rm /tmp/dpkg.*") (env "GOPATH" "/go") -(run "apt-get update && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean && apt-get install -y --no-install-recommends git golang ca-certificates build-essential && apt-get clean && rm -rf /var/lib/apt/lists && go get -v github.com/hashicorp/consul && mv $GOPATH/bin/consul /usr/bin/consul && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty && apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') && rm /tmp/dpkg.* && rm -rf $GOPATH") \ No newline at end of file +(run "apt-get update && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean && apt-get install -y --no-install-recommends git golang ca-certificates build-essential && apt-get clean && rm -rf /var/lib/apt/lists && go get -v github.com/hashicorp/consul && mv $GOPATH/bin/consul /usr/bin/consul && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty && apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') && rm /tmp/dpkg.* && rm -rf $GOPATH") diff --git a/builder/parser/testfiles/cpuguy83-nagios/result b/builder/parser/testfiles/cpuguy83-nagios/result index b95e96b153..a4c637a09e 100644 --- a/builder/parser/testfiles/cpuguy83-nagios/result +++ b/builder/parser/testfiles/cpuguy83-nagios/result @@ -37,4 +37,4 @@ (env "APACHE_LOG_DIR" "/var/log/apache2") (expose "80") (volume "/opt/nagios/var" "/opt/nagios/etc" "/opt/nagios/libexec" "/var/log/apache2" "/usr/share/snmp/mibs") -(cmd "/usr/local/bin/start_nagios") \ No newline at end of file +(cmd "/usr/local/bin/start_nagios") diff --git a/builder/parser/testfiles/docker/result b/builder/parser/testfiles/docker/result index a7960244b3..48a09c12e3 100644 --- a/builder/parser/testfiles/docker/result +++ b/builder/parser/testfiles/docker/result @@ -22,4 +22,4 @@ (workdir "/go/src/github.com/docker/docker") (env "DOCKER_BUILDTAGS" "apparmor selinux") (entrypoint "hack/dind") -(copy "." "/go/src/github.com/docker/docker") \ No newline at end of file +(copy "." "/go/src/github.com/docker/docker") diff --git a/builder/parser/testfiles/escapes/result b/builder/parser/testfiles/escapes/result index 724c399c21..bc763898d5 100644 --- a/builder/parser/testfiles/escapes/result +++ b/builder/parser/testfiles/escapes/result @@ -2,4 +2,4 @@ (maintainer "Erik \\\\Hollensbe \\\"") (run "apt-get \\update && apt-get \\\"install znc -y") (add "\\conf\\\\\"" "/.znc") -(cmd "/usr\\\"/bin/znc" "-f" "-r") \ No newline at end of file +(cmd "/usr\\\"/bin/znc" "-f" "-r") diff --git a/builder/parser/testfiles/influxdb/result b/builder/parser/testfiles/influxdb/result index f0d45a4e27..0998e87e63 100644 --- a/builder/parser/testfiles/influxdb/result +++ b/builder/parser/testfiles/influxdb/result @@ -8,4 +8,4 @@ (expose "8083") (expose "8086") (expose "8090") -(expose "8099") \ No newline at end of file +(expose "8099") diff --git a/builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result index bfd84ae489..afc220c2a7 100644 --- a/builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result +++ b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result @@ -1 +1 @@ -(cmd "\"[\\\"echo\\\", \\\"Phew, I just managed to escaped those double quotes\\\"]\"") \ No newline at end of file +(cmd "\"[\\\"echo\\\", \\\"Phew, I just managed to escaped those double quotes\\\"]\"") diff --git a/builder/parser/testfiles/jeztah-invalid-json-json-inside-string/result b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string/result index f8f7b5017b..484804e2b2 100644 --- a/builder/parser/testfiles/jeztah-invalid-json-json-inside-string/result +++ b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string/result @@ -1 +1 @@ -(cmd "'[\"echo\", \"Well, JSON in a string is JSON too?\"]'") \ No newline at end of file +(cmd "'[\"echo\", \"Well, JSON in a string is JSON too?\"]'") diff --git a/builder/parser/testfiles/jeztah-invalid-json-single-quotes/result b/builder/parser/testfiles/jeztah-invalid-json-single-quotes/result index 0623f8bf45..6147891207 100644 --- a/builder/parser/testfiles/jeztah-invalid-json-single-quotes/result +++ b/builder/parser/testfiles/jeztah-invalid-json-single-quotes/result @@ -1 +1 @@ -(cmd "['echo','single quotes are invalid JSON']") \ No newline at end of file +(cmd "['echo','single quotes are invalid JSON']") diff --git a/builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result b/builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result index d621ddcff3..1ffbb8ff85 100644 --- a/builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result +++ b/builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result @@ -1 +1 @@ -(cmd "[\"echo\", \"Please, close the brackets when you're done\"") \ No newline at end of file +(cmd "[\"echo\", \"Please, close the brackets when you're done\"") diff --git a/builder/parser/testfiles/jeztah-invalid-json-unterminated-string/result b/builder/parser/testfiles/jeztah-invalid-json-unterminated-string/result index acedd80c45..32048147b5 100644 --- a/builder/parser/testfiles/jeztah-invalid-json-unterminated-string/result +++ b/builder/parser/testfiles/jeztah-invalid-json-unterminated-string/result @@ -1 +1 @@ -(cmd "[\"echo\", \"look ma, no quote!]") \ No newline at end of file +(cmd "[\"echo\", \"look ma, no quote!]") diff --git a/builder/parser/testfiles/kartar-entrypoint-oddities/result b/builder/parser/testfiles/kartar-entrypoint-oddities/result index 375257a49e..b5ac6fe445 100644 --- a/builder/parser/testfiles/kartar-entrypoint-oddities/result +++ b/builder/parser/testfiles/kartar-entrypoint-oddities/result @@ -4,4 +4,4 @@ (run "apt-get update") (run "apt-get -y install redis-server redis-tools") (expose "6379") -(entrypoint "/usr/bin/redis-server") \ No newline at end of file +(entrypoint "/usr/bin/redis-server") diff --git a/builder/parser/testfiles/lk4d4-the-edge-case-generator/result b/builder/parser/testfiles/lk4d4-the-edge-case-generator/result index 920ed544b5..8a249190e9 100644 --- a/builder/parser/testfiles/lk4d4-the-edge-case-generator/result +++ b/builder/parser/testfiles/lk4d4-the-edge-case-generator/result @@ -26,4 +26,4 @@ (volume "/test3") (workdir "/test") (add "." "/") -(copy "." "copy") \ No newline at end of file +(copy "." "copy") diff --git a/builder/parser/testfiles/mail/result b/builder/parser/testfiles/mail/result index 2d9c30db9c..a0efcf04b6 100644 --- a/builder/parser/testfiles/mail/result +++ b/builder/parser/testfiles/mail/result @@ -11,4 +11,4 @@ (run "mkdir /Mail") (run "mkdir /.offlineimap") (run "echo \"export TERM=screen-256color\" >/.zshenv") -(cmd "setsid cron; tmux -2") \ No newline at end of file +(cmd "setsid cron; tmux -2") diff --git a/builder/parser/testfiles/mumble/result b/builder/parser/testfiles/mumble/result index 123e893dc5..a0036a943e 100644 --- a/builder/parser/testfiles/mumble/result +++ b/builder/parser/testfiles/mumble/result @@ -1,4 +1,4 @@ (from "ubuntu:14.04") (run "apt-get update && apt-get install libcap2-bin mumble-server -y") (add "./mumble-server.ini" "/etc/mumble-server.ini") -(cmd "/usr/sbin/murmurd") \ No newline at end of file +(cmd "/usr/sbin/murmurd") diff --git a/builder/parser/testfiles/nginx/result b/builder/parser/testfiles/nginx/result index 5ac8c77c2f..56ddb6f258 100644 --- a/builder/parser/testfiles/nginx/result +++ b/builder/parser/testfiles/nginx/result @@ -8,4 +8,4 @@ (run "mkdir /www") (cmd "/usr/sbin/nginx") (volume "/www") -(expose "80") \ No newline at end of file +(expose "80") diff --git a/builder/parser/testfiles/tf2/result b/builder/parser/testfiles/tf2/result index 5ec173f67f..d4f94cd8be 100644 --- a/builder/parser/testfiles/tf2/result +++ b/builder/parser/testfiles/tf2/result @@ -17,4 +17,4 @@ (add "./configs" "/steam/tf2/tf/addons/sourcemod/configs") (run "mkdir -p /steam/tf2/tf/addons/sourcemod/translations/en") (run "cp /steam/tf2/tf/addons/sourcemod/translations/*.txt /steam/tf2/tf/addons/sourcemod/translations/en") -(cmd "cd /steam/tf2 && ./srcds_run -port 27015 +ip 0.0.0.0 +map ctf_2fort -autoupdate -steam_dir /steam -steamcmd_script /steam/script +tf_bot_quota 12 +tf_bot_quota_mode fill") \ No newline at end of file +(cmd "cd /steam/tf2 && ./srcds_run -port 27015 +ip 0.0.0.0 +map ctf_2fort -autoupdate -steam_dir /steam -steamcmd_script /steam/script +tf_bot_quota 12 +tf_bot_quota_mode fill") diff --git a/builder/parser/testfiles/weechat/result b/builder/parser/testfiles/weechat/result index b358645cde..c3abb4c54f 100644 --- a/builder/parser/testfiles/weechat/result +++ b/builder/parser/testfiles/weechat/result @@ -3,4 +3,4 @@ (add ".weechat" "/.weechat") (add ".tmux.conf" "/") (run "echo \"export TERM=screen-256color\" >/.zshenv") -(cmd "zsh -c weechat") \ No newline at end of file +(cmd "zsh -c weechat") diff --git a/builder/parser/testfiles/znc/result b/builder/parser/testfiles/znc/result index b4ddf3e653..5493b255fd 100644 --- a/builder/parser/testfiles/znc/result +++ b/builder/parser/testfiles/znc/result @@ -2,4 +2,4 @@ (maintainer "Erik Hollensbe ") (run "apt-get update && apt-get install znc -y") (add "conf" "/.znc") -(cmd "/usr/bin/znc" "-f" "-r") \ No newline at end of file +(cmd "/usr/bin/znc" "-f" "-r") From 6b322ad2d32b1525ad01611f0d6ad8d803f5f6f0 Mon Sep 17 00:00:00 2001 From: Erik Hollensbe Date: Fri, 29 Aug 2014 13:04:34 -0700 Subject: [PATCH 2/8] builder/parser: fix handling of empty strings as the only argument. Docker-DCO-1.1-Signed-off-by: Erik Hollensbe (github: erikh) --- builder/parser/parser.go | 6 ++++-- builder/parser/parser_test.go | 5 ++++- builder/parser/testfiles/brimstone-docker-consul/result | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/builder/parser/parser.go b/builder/parser/parser.go index 8315412bd7..ff60f4d825 100644 --- a/builder/parser/parser.go +++ b/builder/parser/parser.go @@ -81,8 +81,10 @@ func parseLine(line string) (string, *Node, error) { return "", nil, err } - node.Next = sexp - node.Attributes = attrs + if sexp.Value != "" || sexp.Next != nil || sexp.Children != nil { + node.Next = sexp + node.Attributes = attrs + } return "", node, nil } diff --git a/builder/parser/parser_test.go b/builder/parser/parser_test.go index 871da477c1..0d56f7e454 100644 --- a/builder/parser/parser_test.go +++ b/builder/parser/parser_test.go @@ -1,6 +1,7 @@ package parser import ( + "fmt" "io/ioutil" "os" "path/filepath" @@ -69,7 +70,9 @@ func TestTestData(t *testing.T) { t.Fatalf("Error reading %s's result file: %s", dir.Name(), err.Error()) } - if ast.Dump() != string(content) { + if ast.Dump()+"\n" != string(content) { + fmt.Fprintln(os.Stderr, ast.Dump()) + fmt.Fprintln(os.Stderr, string(content)) t.Fatalf("%s: AST dump of dockerfile does not match result", dir.Name()) } diff --git a/builder/parser/testfiles/brimstone-docker-consul/result b/builder/parser/testfiles/brimstone-docker-consul/result index 86723dde7f..3f7a6f413e 100644 --- a/builder/parser/testfiles/brimstone-docker-consul/result +++ b/builder/parser/testfiles/brimstone-docker-consul/result @@ -1,5 +1,5 @@ (from "brimstone/ubuntu:14.04") -(cmd "") +(cmd) (entrypoint "/usr/bin/consul" "agent" "-server" "-data-dir=/consul" "-client=0.0.0.0" "-ui-dir=/webui") (expose "8500" "8600" "8400" "8301" "8302") (run "apt-get update && apt-get install -y unzip wget && apt-get clean && rm -rf /var/lib/apt/lists") From 3a6d1228a83ba0f9dd96138ccccfa758c0956a62 Mon Sep 17 00:00:00 2001 From: Erik Hollensbe Date: Fri, 29 Aug 2014 15:21:49 -0700 Subject: [PATCH 3/8] builder: Fix a small bug that could improperly cache. Docker-DCO-1.1-Signed-off-by: Erik Hollensbe (github: erikh) --- builder/dispatchers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builder/dispatchers.go b/builder/dispatchers.go index 8abdb51d8a..b0c303f3e8 100644 --- a/builder/dispatchers.go +++ b/builder/dispatchers.go @@ -223,7 +223,7 @@ func run(b *Builder, args []string, attributes map[string]bool) error { func cmd(b *Builder, args []string, attributes map[string]bool) error { b.Config.Cmd = handleJsonArgs(args, attributes) - if err := b.commit("", b.Config.Cmd, fmt.Sprintf("CMD %v", cmd)); err != nil { + if err := b.commit("", b.Config.Cmd, fmt.Sprintf("CMD %v", b.Config.Cmd)); err != nil { return err } From ac107995ae4a24195f8bb6b70c26393a87d19982 Mon Sep 17 00:00:00 2001 From: Erik Hollensbe Date: Sat, 30 Aug 2014 04:34:09 -0700 Subject: [PATCH 4/8] builder: Fix entrypoint and cmd semantics in evaluator. Test c/o @cnf Docker-DCO-1.1-Signed-off-by: Erik Hollensbe (github: erikh) --- builder/dispatchers.go | 22 +++++++++++++++++++--- builder/evaluator.go | 2 +- builder/internals.go | 5 +++++ builder/support.go | 6 +++++- integration-cli/docker_cli_build_test.go | 23 ++++++++++++++++++++++- 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/builder/dispatchers.go b/builder/dispatchers.go index b0c303f3e8..4d1d2135de 100644 --- a/builder/dispatchers.go +++ b/builder/dispatchers.go @@ -168,11 +168,17 @@ func workdir(b *Builder, args []string, attributes map[string]bool) error { func run(b *Builder, args []string, attributes map[string]bool) error { args = handleJsonArgs(args, attributes) + if len(args) == 1 { + args = append([]string{"/bin/sh", "-c"}, args[0]) + } + + args = append([]string{b.image}, args...) + if b.image == "" { return fmt.Errorf("Please provide a source image with `from` prior to run") } - config, _, _, err := runconfig.Parse(append([]string{b.image}, args...), nil) + config, _, _, err := runconfig.Parse(args, nil) if err != nil { return err } @@ -223,11 +229,18 @@ func run(b *Builder, args []string, attributes map[string]bool) error { func cmd(b *Builder, args []string, attributes map[string]bool) error { b.Config.Cmd = handleJsonArgs(args, attributes) + if !attributes["json"] && len(b.Config.Entrypoint) == 0 { + b.Config.Entrypoint = []string{"/bin/sh", "-c"} + } + if err := b.commit("", b.Config.Cmd, fmt.Sprintf("CMD %v", b.Config.Cmd)); err != nil { return err } - b.cmdSet = true + if len(args) != 0 { + b.cmdSet = true + } + return nil } @@ -242,7 +255,10 @@ func cmd(b *Builder, args []string, attributes map[string]bool) error { func entrypoint(b *Builder, args []string, attributes map[string]bool) error { b.Config.Entrypoint = handleJsonArgs(args, attributes) - // if there is no cmd in current Dockerfile - cleanup cmd + if len(b.Config.Entrypoint) == 0 { + b.Config.Entrypoint = []string{"/bin/sh", "-c"} + } + if !b.cmdSet { b.Config.Cmd = nil } diff --git a/builder/evaluator.go b/builder/evaluator.go index 3ab9b3841e..058e08d185 100644 --- a/builder/evaluator.go +++ b/builder/evaluator.go @@ -144,7 +144,7 @@ func (b *Builder) Run(context io.Reader) (string, error) { b.dockerfile = ast // some initializations that would not have been supplied by the caller. - b.Config = &runconfig.Config{} + b.Config = &runconfig.Config{Entrypoint: []string{}, Cmd: []string{"/bin/sh", "-c"}, Env: []string{"PATH=" + daemon.DefaultPathEnv}} b.TmpContainers = map[string]struct{}{} for i, n := range b.dockerfile.Children { diff --git a/builder/internals.go b/builder/internals.go index ac11bb8b1a..4f68525cfb 100644 --- a/builder/internals.go +++ b/builder/internals.go @@ -89,6 +89,11 @@ func (b *Builder) commit(id string, autoCmd []string, comment string) error { // Note: Actually copy the struct autoConfig := *b.Config autoConfig.Cmd = autoCmd + + if autoConfig.Entrypoint == nil { + autoConfig.Entrypoint = []string{"/bin/sh", "-c"} + } + // Commit the container image, err := b.Daemon.Commit(container, "", "", "", b.maintainer, true, &autoConfig) if err != nil { diff --git a/builder/support.go b/builder/support.go index de5d57b501..16fcea5f19 100644 --- a/builder/support.go +++ b/builder/support.go @@ -28,10 +28,14 @@ func (b *Builder) replaceEnv(str string) string { } func handleJsonArgs(args []string, attributes map[string]bool) []string { + if len(args) == 0 { + return []string{} + } + if attributes != nil && attributes["json"] { return args } // literal string command, not an exec array - return append([]string{"/bin/sh", "-c", strings.Join(args, " ")}) + return []string{strings.Join(args, " ")} } diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 7e1d7291ac..1dc8896952 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -1184,7 +1184,7 @@ func TestContextTarNoCompression(t *testing.T) { testContextTar(t, archive.Uncompressed) } -func TestNoContext(t *testing.T) { +func TestBuildNoContext(t *testing.T) { buildCmd := exec.Command(dockerBinary, "build", "-t", "nocontext", "-") buildCmd.Stdin = strings.NewReader("FROM busybox\nCMD echo ok\n") @@ -1899,3 +1899,24 @@ func TestBuildCleanupCmdOnEntrypoint(t *testing.T) { } logDone("build - cleanup cmd on ENTRYPOINT") } + +func TestBuildClearCmd(t *testing.T) { + name := "testbuildclearcmd" + defer deleteImages(name) + _, err := buildImage(name, + `From scratch + ENTRYPOINT ["/bin/bash"] + CMD []`, + true) + if err != nil { + t.Fatal(err) + } + res, err := inspectFieldJSON(name, "Config.Cmd") + if err != nil { + t.Fatal(err) + } + if res != "[]" { + t.Fatalf("Cmd %s, expected %s", res, "[]") + } + logDone("build - clearcmd") +} From 78a847a47ac777f4090c06a82e875ee30f9a1cbd Mon Sep 17 00:00:00 2001 From: Erik Hollensbe Date: Mon, 1 Sep 2014 13:33:06 -0700 Subject: [PATCH 5/8] evaluator: ensure entrypoint stays blank if set blank while CMD is set. Docker-DCO-1.1-Signed-off-by: Erik Hollensbe (github: erikh) --- builder/dispatchers.go | 6 ++---- integration-cli/docker_cli_build_test.go | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/builder/dispatchers.go b/builder/dispatchers.go index 4d1d2135de..201a76ada4 100644 --- a/builder/dispatchers.go +++ b/builder/dispatchers.go @@ -255,11 +255,9 @@ func cmd(b *Builder, args []string, attributes map[string]bool) error { func entrypoint(b *Builder, args []string, attributes map[string]bool) error { b.Config.Entrypoint = handleJsonArgs(args, attributes) - if len(b.Config.Entrypoint) == 0 { + if len(b.Config.Entrypoint) == 0 && len(b.Config.Cmd) == 0 { b.Config.Entrypoint = []string{"/bin/sh", "-c"} - } - - if !b.cmdSet { + } else if !b.cmdSet { b.Config.Cmd = nil } diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 1dc8896952..6860abf453 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -791,6 +791,25 @@ func TestBuildEntrypoint(t *testing.T) { if res != expected { t.Fatalf("Entrypoint %s, expected %s", res, expected) } + + deleteImages(name) + expected = "[]" + + _, err = buildImage(name, + `FROM busybox + ENTRYPOINT []`, + true) + if err != nil { + t.Fatal(err) + } + res, err = inspectField(name, "Config.Entrypoint") + if err != nil { + t.Fatal(err) + } + if res != expected { + t.Fatalf("Entrypoint %s, expected %s", res, expected) + } + logDone("build - entrypoint") } From 92f885d7bd9d4a8f5d30ec650a7625a8727d952e Mon Sep 17 00:00:00 2001 From: Erik Hollensbe Date: Wed, 3 Sep 2014 05:34:11 -0700 Subject: [PATCH 6/8] Do not populate path to prevent runconfig merge conflict; remove autoConfig seeding of entrypoint. Docker-DCO-1.1-Signed-off-by: Erik Hollensbe (github: erikh) --- builder/evaluator.go | 2 +- builder/internals.go | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/builder/evaluator.go b/builder/evaluator.go index 058e08d185..cf79e045f2 100644 --- a/builder/evaluator.go +++ b/builder/evaluator.go @@ -144,7 +144,7 @@ func (b *Builder) Run(context io.Reader) (string, error) { b.dockerfile = ast // some initializations that would not have been supplied by the caller. - b.Config = &runconfig.Config{Entrypoint: []string{}, Cmd: []string{"/bin/sh", "-c"}, Env: []string{"PATH=" + daemon.DefaultPathEnv}} + b.Config = &runconfig.Config{Entrypoint: []string{}, Cmd: []string{"/bin/sh", "-c"}} b.TmpContainers = map[string]struct{}{} for i, n := range b.dockerfile.Children { diff --git a/builder/internals.go b/builder/internals.go index 4f68525cfb..e38818821e 100644 --- a/builder/internals.go +++ b/builder/internals.go @@ -90,10 +90,6 @@ func (b *Builder) commit(id string, autoCmd []string, comment string) error { autoConfig := *b.Config autoConfig.Cmd = autoCmd - if autoConfig.Entrypoint == nil { - autoConfig.Entrypoint = []string{"/bin/sh", "-c"} - } - // Commit the container image, err := b.Daemon.Commit(container, "", "", "", b.maintainer, true, &autoConfig) if err != nil { From 576416c99a0ae8ad27467f217ec21f598e4f4cc8 Mon Sep 17 00:00:00 2001 From: Erik Hollensbe Date: Wed, 3 Sep 2014 12:17:17 -0700 Subject: [PATCH 7/8] move entrypoint integration-cli test for blank entrypoint to separate function Docker-DCO-1.1-Signed-off-by: Erik Hollensbe (github: erikh) --- integration-cli/docker_cli_build_test.go | 25 ++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 6860abf453..58d99a7d6b 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -773,13 +773,14 @@ func TestBuildExpose(t *testing.T) { logDone("build - expose") } -func TestBuildEntrypoint(t *testing.T) { +func TestBuildEmptyEntrypoint(t *testing.T) { name := "testbuildentrypoint" - expected := "[/bin/echo]" defer deleteImages(name) + expected := "[]" + _, err := buildImage(name, - `FROM scratch - ENTRYPOINT ["/bin/echo"]`, + `FROM busybox + ENTRYPOINT []`, true) if err != nil { t.Fatal(err) @@ -792,17 +793,21 @@ func TestBuildEntrypoint(t *testing.T) { t.Fatalf("Entrypoint %s, expected %s", res, expected) } - deleteImages(name) - expected = "[]" + logDone("build - empty entrypoint") +} - _, err = buildImage(name, - `FROM busybox - ENTRYPOINT []`, +func TestBuildEntrypoint(t *testing.T) { + name := "testbuildentrypoint" + expected := "[/bin/echo]" + defer deleteImages(name) + _, err := buildImage(name, + `FROM scratch + ENTRYPOINT ["/bin/echo"]`, true) if err != nil { t.Fatal(err) } - res, err = inspectField(name, "Config.Entrypoint") + res, err := inspectField(name, "Config.Entrypoint") if err != nil { t.Fatal(err) } From 91bed436215f272c2956abb969425ee0bfd3a998 Mon Sep 17 00:00:00 2001 From: Erik Hollensbe Date: Thu, 11 Sep 2014 05:58:50 -0700 Subject: [PATCH 8/8] builder: Fix an error check being done at the wrong spot in run dispatcher Docker-DCO-1.1-Signed-off-by: Erik Hollensbe (github: erikh) --- builder/dispatchers.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/builder/dispatchers.go b/builder/dispatchers.go index 201a76ada4..a5313fed4e 100644 --- a/builder/dispatchers.go +++ b/builder/dispatchers.go @@ -166,6 +166,10 @@ func workdir(b *Builder, args []string, attributes map[string]bool) error { // RUN [ "echo", "hi" ] # echo hi // func run(b *Builder, args []string, attributes map[string]bool) error { + if b.image == "" { + return fmt.Errorf("Please provide a source image with `from` prior to run") + } + args = handleJsonArgs(args, attributes) if len(args) == 1 { @@ -174,10 +178,6 @@ func run(b *Builder, args []string, attributes map[string]bool) error { args = append([]string{b.image}, args...) - if b.image == "" { - return fmt.Errorf("Please provide a source image with `from` prior to run") - } - config, _, _, err := runconfig.Parse(args, nil) if err != nil { return err