diff --git a/cli/command/container/opts.go b/cli/command/container/opts.go index a68bbe4833..fa8f1c9d08 100644 --- a/cli/command/container/opts.go +++ b/cli/command/container/opts.go @@ -354,7 +354,10 @@ func parse(flags *pflag.FlagSet, copts *containerOptions, serverOS string) (*con volumes := copts.volumes.GetMap() // add any bind targets to the list of container volumes for bind := range copts.volumes.GetMap() { - parsed, _ := loader.ParseVolume(bind) + parsed, err := loader.ParseVolume(bind) + if err != nil { + return nil, err + } if parsed.Source != "" { toBind := bind diff --git a/cli/compose/loader/volume_test.go b/cli/compose/loader/volume_test.go index b42be1fc52..54dc200fe8 100644 --- a/cli/compose/loader/volume_test.go +++ b/cli/compose/loader/volume_test.go @@ -223,3 +223,8 @@ func TestParseVolumeInvalidSections(t *testing.T) { _, err := ParseVolume("/foo::rw") assert.ErrorContains(t, err, "invalid spec") } + +func TestParseVolumeWithEmptySource(t *testing.T) { + _, err := ParseVolume(":/vol") + assert.ErrorContains(t, err, "empty section between colons") +} diff --git a/e2e/container/create_test.go b/e2e/container/create_test.go index 3c519df12e..daf8e092f6 100644 --- a/e2e/container/create_test.go +++ b/e2e/container/create_test.go @@ -101,3 +101,19 @@ func TestTrustedCreateFromBadTrustServer(t *testing.T) { Err: "could not rotate trust to a new trusted root", }) } + +func TestCreateWithEmptySourceVolume(t *testing.T) { + icmd.RunCmd(icmd.Command("docker", "create", "-v", ":/volume", fixtures.AlpineImage)). + Assert(t, icmd.Expected{ + ExitCode: 125, + Err: "empty section between colons", + }) +} + +func TestCreateWithEmptyVolumeSpec(t *testing.T) { + icmd.RunCmd(icmd.Command("docker", "create", "-v", "", fixtures.AlpineImage)). + Assert(t, icmd.Expected{ + ExitCode: 125, + Err: "invalid empty volume spec", + }) +}