diff options
-rw-r--r-- | cmd/podman/mount.go | 47 | ||||
-rw-r--r-- | docs/podman-mount.1.md | 18 | ||||
-rw-r--r-- | test/e2e/mount_test.go | 25 |
3 files changed, 70 insertions, 20 deletions
diff --git a/cmd/podman/mount.go b/cmd/podman/mount.go index e913afb75..b053ef1e8 100644 --- a/cmd/podman/mount.go +++ b/cmd/podman/mount.go @@ -7,6 +7,7 @@ import ( "github.com/pkg/errors" of "github.com/projectatomic/libpod/cmd/podman/formats" "github.com/projectatomic/libpod/cmd/podman/libpodruntime" + "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -34,7 +35,7 @@ var ( Usage: "Mount a working container's root filesystem", Description: mountDescription, Action: mountCmd, - ArgsUsage: "[CONTAINER-NAME-OR-ID]", + ArgsUsage: "[CONTAINER-NAME-OR-ID [...]]", Flags: mountFlags, } ) @@ -68,23 +69,35 @@ func mountCmd(c *cli.Context) error { return errors.Errorf("%q is not a supported format", c.String("format")) } - if len(args) > 1 { - return errors.Errorf("too many arguments specified") - } - - if len(args) == 1 { - if json { - return errors.Wrapf(err, "json option can not be used with a container id") - } - ctr, err := runtime.LookupContainer(args[0]) - if err != nil { - return errors.Wrapf(err, "error looking up container %q", args[0]) - } - mountPoint, err := ctr.Mount() - if err != nil { - return errors.Wrapf(err, "error mounting container %q", ctr.ID()) + var lastError error + if len(args) > 0 { + for _, name := range args { + if json { + if lastError != nil { + logrus.Error(lastError) + } + lastError = errors.Wrapf(err, "json option cannot be used with a container id") + continue + } + ctr, err := runtime.LookupContainer(name) + if err != nil { + if lastError != nil { + logrus.Error(lastError) + } + lastError = errors.Wrapf(err, "error looking up container %q", name) + continue + } + mountPoint, err := ctr.Mount() + if err != nil { + if lastError != nil { + logrus.Error(lastError) + } + lastError = errors.Wrapf(err, "error mounting container %q", ctr.ID()) + continue + } + fmt.Printf("%s\n", mountPoint) } - fmt.Printf("%s\n", mountPoint) + return lastError } else { jsonMountPoints := []jsonMountPoint{} containers, err2 := runtime.GetContainers() diff --git a/docs/podman-mount.1.md b/docs/podman-mount.1.md index c73caf011..04210f087 100644 --- a/docs/podman-mount.1.md +++ b/docs/podman-mount.1.md @@ -1,15 +1,15 @@ % podman-mount "1" ## NAME -podman\-mount - Mount a working container's root filesystem +podman\-mount - Mount the specifed working containers' root filesystem ## SYNOPSIS **podman** **mount** -**podman** **mount** **containerID** +**podman** **mount** **containerID [...]** ## DESCRIPTION -Mounts the specified container's root file system in a location which can be +Mounts the specified containers' root file system in a location which can be accessed from the host, and returns its location. If you execute the command without any arguments, the tool will list all of the @@ -41,7 +41,19 @@ podman mount c831414b10a3 podman mount c831414b10a3 /var/lib/containers/storage/overlay/f3ac502d97b5681989dff84dfedc8354239bcecbdc2692f9a639f4e080a02364/merged +a7060253093b /var/lib/containers/storage/overlay/0ff7d7ca68bed1ace424f9df154d2dd7b5a125c19d887f17653cbcd5b6e30ba1/merged +``` +``` +podman mount c831414b10a3 a7060253093b + +/var/lib/containers/storage/overlay/f3ac502d97b5681989dff84dfedc8354239bcecbdc2692f9a639f4e080a02364/merged +/var/lib/containers/storage/overlay/0ff7d7ca68bed1ace424f9df154d2dd7b5a125c19d887f17653cbcd5b6e30ba1/merged +``` +``` +podman mount + +c831414b10a3 /var/lib/containers/storage/overlay/f3ac502d97b5681989dff84dfedc8354239bcecbdc2692f9a639f4e080a02364/merged a7060253093b /var/lib/containers/storage/overlay/0ff7d7ca68bed1ace424f9df154d2dd7b5a125c19d887f17653cbcd5b6e30ba1/merged ``` diff --git a/test/e2e/mount_test.go b/test/e2e/mount_test.go index 26eb5a7d2..1c206c597 100644 --- a/test/e2e/mount_test.go +++ b/test/e2e/mount_test.go @@ -62,6 +62,31 @@ var _ = Describe("Podman mount", func() { Expect(umount.ExitCode()).To(Equal(0)) }) + It("podman mount many", func() { + setup1 := podmanTest.Podman([]string{"create", ALPINE, "ls"}) + setup1.WaitWithDefaultTimeout() + Expect(setup1.ExitCode()).To(Equal(0)) + cid1 := setup1.OutputToString() + + setup2 := podmanTest.Podman([]string{"create", ALPINE, "ls"}) + setup2.WaitWithDefaultTimeout() + Expect(setup2.ExitCode()).To(Equal(0)) + cid2 := setup2.OutputToString() + + setup3 := podmanTest.Podman([]string{"create", ALPINE, "ls"}) + setup3.WaitWithDefaultTimeout() + Expect(setup3.ExitCode()).To(Equal(0)) + cid3 := setup3.OutputToString() + + mount1 := podmanTest.Podman([]string{"mount", cid1, cid2, cid3}) + mount1.WaitWithDefaultTimeout() + Expect(mount1.ExitCode()).To(Equal(0)) + + umount := podmanTest.Podman([]string{"umount", cid1, cid2, cid3}) + umount.WaitWithDefaultTimeout() + Expect(umount.ExitCode()).To(Equal(0)) + }) + It("podman umount many", func() { setup1 := podmanTest.Podman([]string{"create", ALPINE, "ls"}) setup1.WaitWithDefaultTimeout() |