mirror of
https://github.com/containers/podman.git
synced 2025-09-23 13:13:42 +08:00

We attempted to share all logic for parsing labels and environment variables, which on the surface makes lots of sense (both are formatted key=value so parsing logic should be identical) but has begun to fall apart now that we have added additional logic to environment variable handling. Environment variables that are unset, for example, are looked up against environment variables set for the process. We don't want this for labels, so we have to split parsing logic. Fixes #3854 Signed-off-by: Matthew Heon <matthew.heon@pm.me>
70 lines
2.2 KiB
Go
70 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
|
"github.com/containers/libpod/cmd/podman/shared/parse"
|
|
"github.com/containers/libpod/pkg/adapter"
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
volumeCreateCommand cliconfig.VolumeCreateValues
|
|
volumeCreateDescription = `If using the default driver, "local", the volume will be created on the host in the volumes directory under container storage.`
|
|
|
|
_volumeCreateCommand = &cobra.Command{
|
|
Use: "create [flags] [NAME]",
|
|
Short: "Create a new volume",
|
|
Long: volumeCreateDescription,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
volumeCreateCommand.InputArgs = args
|
|
volumeCreateCommand.GlobalFlags = MainGlobalOpts
|
|
volumeCreateCommand.Remote = remoteclient
|
|
return volumeCreateCmd(&volumeCreateCommand)
|
|
},
|
|
Example: `podman volume create myvol
|
|
podman volume create
|
|
podman volume create --label foo=bar myvol`,
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
volumeCreateCommand.Command = _volumeCreateCommand
|
|
volumeCommand.SetHelpTemplate(HelpTemplate())
|
|
volumeCreateCommand.SetUsageTemplate(UsageTemplate())
|
|
flags := volumeCreateCommand.Flags()
|
|
flags.StringVar(&volumeCreateCommand.Driver, "driver", "", "Specify volume driver name (default local)")
|
|
flags.StringSliceVarP(&volumeCreateCommand.Label, "label", "l", []string{}, "Set metadata for a volume (default [])")
|
|
flags.StringArrayVarP(&volumeCreateCommand.Opt, "opt", "o", []string{}, "Set driver specific options (default [])")
|
|
}
|
|
|
|
func volumeCreateCmd(c *cliconfig.VolumeCreateValues) error {
|
|
runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "error creating libpod runtime")
|
|
}
|
|
defer runtime.DeferredShutdown(false)
|
|
|
|
if len(c.InputArgs) > 1 {
|
|
return errors.Errorf("too many arguments, create takes at most 1 argument")
|
|
}
|
|
|
|
labels, err := parse.GetAllLabels([]string{}, c.Label)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "unable to process labels")
|
|
}
|
|
|
|
opts, err := parse.GetAllLabels([]string{}, c.Opt)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "unable to process options")
|
|
}
|
|
|
|
volumeName, err := runtime.CreateVolume(getContext(), c, labels, opts)
|
|
if err == nil {
|
|
fmt.Println(volumeName)
|
|
}
|
|
return err
|
|
}
|