Parcourir la source

Handle error from GetDevice early

Also more verbose error.

Fixes panic from #7701

Signed-off-by: Alexandr Morozov <lk4d4math@gmail.com>
Alexandr Morozov il y a 11 ans
Parent
commit
17b95ecb08
2 fichiers modifiés avec 16 ajouts et 2 suppressions
  1. 2 2
      daemon/container.go
  2. 14 0
      integration-cli/docker_cli_run_test.go

+ 2 - 2
daemon/container.go

@@ -230,10 +230,10 @@ func populateCommand(c *Container, env []string) error {
 	userSpecifiedDevices := make([]*devices.Device, len(c.hostConfig.Devices))
 	for i, deviceMapping := range c.hostConfig.Devices {
 		device, err := devices.GetDevice(deviceMapping.PathOnHost, deviceMapping.CgroupPermissions)
-		device.Path = deviceMapping.PathInContainer
 		if err != nil {
-			return fmt.Errorf("error gathering device information while adding custom device %s", err)
+			return fmt.Errorf("error gathering device information while adding custom device %q: %s", deviceMapping.PathOnHost, err)
 		}
+		device.Path = deviceMapping.PathInContainer
 		userSpecifiedDevices[i] = device
 	}
 	allowedDevices := append(devices.DefaultAllowedDevices, userSpecifiedDevices...)

+ 14 - 0
integration-cli/docker_cli_run_test.go

@@ -1630,3 +1630,17 @@ func TestWriteResolvFileAndNotCommit(t *testing.T) {
 
 	logDone("run - write to /etc/resolv.conf and not commited")
 }
+
+func TestRunWithBadDevice(t *testing.T) {
+	name := "baddevice"
+	cmd := exec.Command(dockerBinary, "run", "--name", name, "--device", "/etc", "busybox", "true")
+	out, _, err := runCommandWithOutput(cmd)
+	if err == nil {
+		t.Fatal("Run should fail with bad device")
+	}
+	expected := `"/etc": not a device node`
+	if !strings.Contains(out, expected) {
+		t.Fatalf("Output should contain %q, actual out: %q", expected, out)
+	}
+	logDone("run - error with bad device")
+}