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" | ||||
| 
 | ||||
| 	"github.com/pkg/errors" | ||||
| 	"github.com/projectatomic/buildah/util" | ||||
| 	"github.com/urfave/cli" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	umountFlags = []cli.Flag{ | ||||
| 		cli.BoolFlag{ | ||||
| 			Name:  "all, a", | ||||
| 			Usage: "umount all of the currently mounted containers", | ||||
| 		}, | ||||
| 	} | ||||
| 	umountCommand = cli.Command{ | ||||
| 		Name:           "umount", | ||||
| 		Aliases:        []string{"unmount"}, | ||||
|  | @ -17,16 +22,21 @@ var ( | |||
| 		Description:    "Unmounts the root file system on the specified working containers", | ||||
| 		Action:         umountCmd, | ||||
| 		ArgsUsage:      "CONTAINER-NAME-OR-ID [...]", | ||||
| 		Flags:          umountFlags, | ||||
| 		SkipArgReorder: true, | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| func umountCmd(c *cli.Context) error { | ||||
| 	umountAll := c.Bool("all") | ||||
| 	umountContainerErrStr := "error unmounting container" | ||||
| 	args := c.Args() | ||||
| 	if len(args) == 0 { | ||||
| 	if len(args) == 0 && !umountAll { | ||||
| 		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) | ||||
| 	if err != nil { | ||||
|  | @ -34,20 +44,50 @@ func umountCmd(c *cli.Context) 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 { | ||||
| 			lastError = util.WriteError(os.Stderr, errors.Wrapf(err, "%s %s", umountContainerErrStr, name), lastError) | ||||
| 			continue | ||||
| 			return errors.Wrapf(err, "error reading build Containers") | ||||
| 		} | ||||
| 		for _, builder := range builders { | ||||
| 			if builder.MountPoint == "" { | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 		id := builder.ContainerID | ||||
| 		if err = builder.Unmount(); err != nil { | ||||
| 			lastError = util.WriteError(os.Stderr, errors.Wrapf(err, "%s %q", umountContainerErrStr, builder.Container), lastError) | ||||
| 			continue | ||||
| 			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) | ||||
| 		} | ||||
| 		fmt.Printf("%s\n", id) | ||||
| 	} | ||||
| 	return lastError | ||||
| } | ||||
|  |  | |||
|  | @ -522,6 +522,8 @@ return 1 | |||
| 
 | ||||
|  _buildah_umount() { | ||||
|      local boolean_options=" | ||||
|      --all | ||||
|      -a | ||||
|      --help | ||||
|      -h | ||||
|   " | ||||
|  |  | |||
|  | @ -9,11 +9,18 @@ buildah\-umount - Unmount the root file system on the specified working containe | |||
| ## DESCRIPTION | ||||
| Unmounts the root file system on the specified working containers. | ||||
| 
 | ||||
| ## OPTIONS | ||||
| **--all, -a** | ||||
| 
 | ||||
| All of the currently mounted containers will be unmounted. | ||||
| 
 | ||||
| ## EXAMPLE | ||||
| 
 | ||||
| buildah umount containerID | ||||
| 
 | ||||
| buildah umount containerID1 containerID2 containerID3 | ||||
| 
 | ||||
| buildah umount --all | ||||
| 
 | ||||
| ## SEE ALSO | ||||
| buildah(1) | ||||
|  |  | |||
|  | @ -28,6 +28,18 @@ load helpers | |||
|   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" { | ||||
|   cid1=$(buildah from --pull --signature-policy ${TESTSDIR}/policy.json alpine) | ||||
|   buildah mount "$cid1" | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue