From 3258d565cfff73dc9eea8e03f05e691b2937d30a Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Mon, 29 Jun 2020 13:28:14 +0200 Subject: [PATCH] Fix status code for missing --volumes-from container If the container specified in `--volumes-from` did not exist, the API returned a 404 status, which was interpreted by the CLI as the specified _image_ to be missing (even if that was not the case). This patch changes these error to return a 400 (bad request); Before this change: # make sure the image is present docker pull busybox docker create --volumes-from=nosuchcontainer busybox # Unable to find image 'busybox:latest' locally # latest: Pulling from library/busybox # Digest: sha256:95cf004f559831017cdf4628aaf1bb30133677be8702a8c5f2994629f637a209 # Status: Image is up to date for busybox:latest # Error response from daemon: No such container: nosuchcontainer After this change: # make sure the image is present docker pull busybox docker create --volumes-from=nosuchcontainer busybox # Error response from daemon: No such container: nosuchcontainer Signed-off-by: Sebastiaan van Stijn --- daemon/volumes.go | 4 ++-- integration/container/create_test.go | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/daemon/volumes.go b/daemon/volumes.go index ad3c96a945..c396843831 100644 --- a/daemon/volumes.go +++ b/daemon/volumes.go @@ -95,12 +95,12 @@ func (daemon *Daemon) registerMountPoints(container *container.Container, hostCo for _, v := range hostConfig.VolumesFrom { containerID, mode, err := parser.ParseVolumesFrom(v) if err != nil { - return err + return errdefs.InvalidParameter(err) } c, err := daemon.GetContainer(containerID) if err != nil { - return err + return errdefs.InvalidParameter(err) } for _, m := range c.MountPoints { diff --git a/integration/container/create_test.go b/integration/container/create_test.go index f3e1e348b0..0d7b75465b 100644 --- a/integration/container/create_test.go +++ b/integration/container/create_test.go @@ -621,3 +621,18 @@ func TestCreateDifferentPlatform(t *testing.T) { assert.Assert(t, client.IsErrNotFound(err), err) }) } + +func TestCreateVolumesFromNonExistingContainer(t *testing.T) { + defer setupTest(t)() + cli := testEnv.APIClient() + + _, err := cli.ContainerCreate( + context.Background(), + &container.Config{Image: "busybox"}, + &container.HostConfig{VolumesFrom: []string{"nosuchcontainer"}}, + nil, + nil, + "", + ) + assert.Check(t, errdefs.IsInvalidParameter(err)) +}