Browse Source

Merge pull request #8990 from duglin/Issue8379a

Make sure that if a container can't start we set the exitcode to non-zero value
Jessie Frazelle 10 years ago
parent
commit
a72f3c568b
3 changed files with 37 additions and 0 deletions
  1. 4 0
      daemon/container.go
  2. 3 0
      daemon/monitor.go
  3. 30 0
      integration-cli/docker_cli_run_test.go

+ 4 - 0
daemon/container.go

@@ -302,6 +302,10 @@ func (container *Container) Start() (err error) {
 	defer func() {
 		if err != nil {
 			container.setError(err)
+			// if no one else has set it, make sure we don't leave it at zero
+			if container.ExitCode == 0 {
+				container.ExitCode = 128
+			}
 			container.toDisk()
 			container.cleanup()
 		}

+ 3 - 0
daemon/monitor.go

@@ -138,6 +138,7 @@ func (m *containerMonitor) Start() error {
 			// if we receive an internal error from the initial start of a container then lets
 			// return it instead of entering the restart loop
 			if m.container.RestartCount == 0 {
+				m.container.ExitCode = exitStatus
 				m.resetContainer(false)
 
 				return err
@@ -163,10 +164,12 @@ func (m *containerMonitor) Start() error {
 			// we need to check this before reentering the loop because the waitForNextRestart could have
 			// been terminated by a request from a user
 			if m.shouldStop {
+				m.container.ExitCode = exitStatus
 				return err
 			}
 			continue
 		}
+		m.container.ExitCode = exitStatus
 		m.container.LogEvent("die")
 		m.resetContainer(true)
 		return err

+ 30 - 0
integration-cli/docker_cli_run_test.go

@@ -2538,3 +2538,33 @@ func TestRunAllowPortRangeThroughExpose(t *testing.T) {
 	}
 	logDone("run - allow port range through --expose flag")
 }
+
+func TestRunUnknownCommand(t *testing.T) {
+	defer deleteAllContainers()
+	runCmd := exec.Command(dockerBinary, "create", "busybox", "/bin/nada")
+	cID, _, _, err := runCommandWithStdoutStderr(runCmd)
+	if err != nil {
+		t.Fatalf("Failed to create container: %v, output: %q", err, cID)
+	}
+	cID = strings.TrimSpace(cID)
+
+	runCmd = exec.Command(dockerBinary, "start", cID)
+	_, _, _, err = runCommandWithStdoutStderr(runCmd)
+	if err == nil {
+		t.Fatalf("Container should not have been able to start!")
+	}
+
+	runCmd = exec.Command(dockerBinary, "inspect", "--format={{.State.ExitCode}}", cID)
+	rc, _, _, err2 := runCommandWithStdoutStderr(runCmd)
+	rc = strings.TrimSpace(rc)
+
+	if err2 != nil {
+		t.Fatalf("Error getting status of container: %v", err2)
+	}
+
+	if rc != "-1" {
+		t.Fatalf("ExitCode(%v) was supposed to be -1", rc)
+	}
+
+	logDone("run - Unknown Command")
+}