umount: add all option to umount all mounted containers
Umount all of the currently mounted containers. After change: ``` ➜ buildah git:(umount-all) sudo ./buildah umount --all 43e674866c4cb46dfc64988b95a8247d6ae5fd17f0b15a46f16a81cb62a55353 14d5fbebf8eadf8056f72271cff1e86147fe40990331c5bf76e251f3cdd25b81 07d02e23e58503a33ec1886c1bfd6e9831fe05c5ac2ea8c6d9e2a939cb40b9fc ``` Signed-off-by: Zhou Hao <zhouhao@cn.fujitsu.com> Closes: #825 Approved by: rhatdan
This commit is contained in:
parent
b965fc4cdb
commit
7d4b593eb9
|
|
@ -5,11 +5,16 @@ import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/projectatomic/buildah/util"
|
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
umountFlags = []cli.Flag{
|
||||||
|
cli.BoolFlag{
|
||||||
|
Name: "all, a",
|
||||||
|
Usage: "umount all of the currently mounted containers",
|
||||||
|
},
|
||||||
|
}
|
||||||
umountCommand = cli.Command{
|
umountCommand = cli.Command{
|
||||||
Name: "umount",
|
Name: "umount",
|
||||||
Aliases: []string{"unmount"},
|
Aliases: []string{"unmount"},
|
||||||
|
|
@ -17,16 +22,21 @@ var (
|
||||||
Description: "Unmounts the root file system on the specified working containers",
|
Description: "Unmounts the root file system on the specified working containers",
|
||||||
Action: umountCmd,
|
Action: umountCmd,
|
||||||
ArgsUsage: "CONTAINER-NAME-OR-ID [...]",
|
ArgsUsage: "CONTAINER-NAME-OR-ID [...]",
|
||||||
|
Flags: umountFlags,
|
||||||
SkipArgReorder: true,
|
SkipArgReorder: true,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func umountCmd(c *cli.Context) error {
|
func umountCmd(c *cli.Context) error {
|
||||||
|
umountAll := c.Bool("all")
|
||||||
umountContainerErrStr := "error unmounting container"
|
umountContainerErrStr := "error unmounting container"
|
||||||
args := c.Args()
|
args := c.Args()
|
||||||
if len(args) == 0 {
|
if len(args) == 0 && !umountAll {
|
||||||
return errors.Errorf("at least one container ID must be specified")
|
return errors.Errorf("at least one container ID must be specified")
|
||||||
}
|
}
|
||||||
|
if len(args) > 0 && umountAll {
|
||||||
|
return errors.Errorf("when using the --all switch, you may not pass any container IDs")
|
||||||
|
}
|
||||||
|
|
||||||
store, err := getStore(c)
|
store, err := getStore(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -34,20 +44,50 @@ func umountCmd(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastError error
|
var lastError error
|
||||||
for _, name := range args {
|
if len(args) > 0 {
|
||||||
|
for _, name := range args {
|
||||||
|
builder, err := openBuilder(getContext(), store, name)
|
||||||
|
if err != nil {
|
||||||
|
if lastError != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, lastError)
|
||||||
|
}
|
||||||
|
lastError = errors.Wrapf(err, "%s %s", umountContainerErrStr, name)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if builder.MountPoint == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
builder, err := openBuilder(getContext(), store, name)
|
id := builder.ContainerID
|
||||||
|
if err = builder.Unmount(); err != nil {
|
||||||
|
if lastError != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, lastError)
|
||||||
|
}
|
||||||
|
lastError = errors.Wrapf(err, "%s %q", umountContainerErrStr, builder.Container)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fmt.Printf("%s\n", id)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
builders, err := openBuilders(store)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lastError = util.WriteError(os.Stderr, errors.Wrapf(err, "%s %s", umountContainerErrStr, name), lastError)
|
return errors.Wrapf(err, "error reading build Containers")
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
for _, builder := range builders {
|
||||||
|
if builder.MountPoint == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
id := builder.ContainerID
|
id := builder.ContainerID
|
||||||
if err = builder.Unmount(); err != nil {
|
if err = builder.Unmount(); err != nil {
|
||||||
lastError = util.WriteError(os.Stderr, errors.Wrapf(err, "%s %q", umountContainerErrStr, builder.Container), lastError)
|
if lastError != nil {
|
||||||
continue
|
fmt.Fprintln(os.Stderr, lastError)
|
||||||
|
}
|
||||||
|
lastError = errors.Wrapf(err, "%s %q", umountContainerErrStr, builder.Container)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fmt.Printf("%s\n", id)
|
||||||
}
|
}
|
||||||
fmt.Printf("%s\n", id)
|
|
||||||
}
|
}
|
||||||
return lastError
|
return lastError
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -522,6 +522,8 @@ return 1
|
||||||
|
|
||||||
_buildah_umount() {
|
_buildah_umount() {
|
||||||
local boolean_options="
|
local boolean_options="
|
||||||
|
--all
|
||||||
|
-a
|
||||||
--help
|
--help
|
||||||
-h
|
-h
|
||||||
"
|
"
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,18 @@ buildah\-umount - Unmount the root file system on the specified working containe
|
||||||
## DESCRIPTION
|
## DESCRIPTION
|
||||||
Unmounts the root file system on the specified working containers.
|
Unmounts the root file system on the specified working containers.
|
||||||
|
|
||||||
|
## OPTIONS
|
||||||
|
**--all, -a**
|
||||||
|
|
||||||
|
All of the currently mounted containers will be unmounted.
|
||||||
|
|
||||||
## EXAMPLE
|
## EXAMPLE
|
||||||
|
|
||||||
buildah umount containerID
|
buildah umount containerID
|
||||||
|
|
||||||
buildah umount containerID1 containerID2 containerID3
|
buildah umount containerID1 containerID2 containerID3
|
||||||
|
|
||||||
|
buildah umount --all
|
||||||
|
|
||||||
## SEE ALSO
|
## SEE ALSO
|
||||||
buildah(1)
|
buildah(1)
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,18 @@ load helpers
|
||||||
buildah rm --all
|
buildah rm --all
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "umount all images" {
|
||||||
|
cid1=$(buildah from --pull --signature-policy ${TESTSDIR}/policy.json alpine)
|
||||||
|
buildah mount "$cid1"
|
||||||
|
cid2=$(buildah from --pull --signature-policy ${TESTSDIR}/policy.json alpine)
|
||||||
|
buildah mount "$cid2"
|
||||||
|
cid3=$(buildah from --pull --signature-policy ${TESTSDIR}/policy.json alpine)
|
||||||
|
buildah mount "$cid3"
|
||||||
|
run buildah umount --all
|
||||||
|
[ "${status}" -eq 0 ]
|
||||||
|
buildah rm --all
|
||||||
|
}
|
||||||
|
|
||||||
@test "umount multi images one bad" {
|
@test "umount multi images one bad" {
|
||||||
cid1=$(buildah from --pull --signature-policy ${TESTSDIR}/policy.json alpine)
|
cid1=$(buildah from --pull --signature-policy ${TESTSDIR}/policy.json alpine)
|
||||||
buildah mount "$cid1"
|
buildah mount "$cid1"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue