mirror of
https://github.com/containers/podman.git
synced 2025-06-25 03:52:15 +08:00
Merge pull request #14301 from rhatdan/volume
Support setting image_volume_mode in containers.conf
This commit is contained in:
@ -255,9 +255,8 @@ func DefineCreateFlags(cmd *cobra.Command, cf *entities.ContainerCreateOptions,
|
||||
_ = cmd.RegisterFlagCompletionFunc(hostUserFlagName, completion.AutocompleteNone)
|
||||
|
||||
imageVolumeFlagName := "image-volume"
|
||||
createFlags.StringVar(
|
||||
&cf.ImageVolume,
|
||||
imageVolumeFlagName, DefaultImageVolume,
|
||||
createFlags.String(
|
||||
imageVolumeFlagName, containerConfig.Engine.ImageVolumeMode,
|
||||
`Tells podman how to handle the builtin image volumes ("bind"|"tmpfs"|"ignore")`,
|
||||
)
|
||||
_ = cmd.RegisterFlagCompletionFunc(imageVolumeFlagName, AutocompleteImageVolume)
|
||||
|
@ -5,9 +5,6 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
// DefaultImageVolume default value
|
||||
DefaultImageVolume = "bind"
|
||||
// Pull in configured json library
|
||||
json = registry.JSONLibrary()
|
||||
)
|
||||
|
@ -102,16 +102,25 @@ func init() {
|
||||
createFlags(containerCreateCommand)
|
||||
}
|
||||
|
||||
func create(cmd *cobra.Command, args []string) error {
|
||||
var (
|
||||
err error
|
||||
)
|
||||
func commonFlags(cmd *cobra.Command) error {
|
||||
var err error
|
||||
flags := cmd.Flags()
|
||||
cliVals.Net, err = common.NetFlagsToNetOptions(nil, *flags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if cmd.Flags().Changed("image-volume") {
|
||||
cliVals.ImageVolume = cmd.Flag("image-volume").Value.String()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func create(cmd *cobra.Command, args []string) error {
|
||||
if err := commonFlags(cmd); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Check if initctr is used with --pod and the value is correct
|
||||
if initctr := InitContainerType; cmd.Flags().Changed("init-ctr") {
|
||||
if !cmd.Flags().Changed("pod") {
|
||||
@ -123,7 +132,7 @@ func create(cmd *cobra.Command, args []string) error {
|
||||
cliVals.InitContainerType = initctr
|
||||
}
|
||||
|
||||
cliVals, err = CreateInit(cmd, cliVals, false)
|
||||
cliVals, err := CreateInit(cmd, cliVals, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -109,7 +109,9 @@ func init() {
|
||||
}
|
||||
|
||||
func run(cmd *cobra.Command, args []string) error {
|
||||
var err error
|
||||
if err := commonFlags(cmd); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO: Breaking change should be made fatal in next major Release
|
||||
if cliVals.TTY && cliVals.Interactive && !term.IsTerminal(int(os.Stdin.Fd())) {
|
||||
@ -122,14 +124,10 @@ func run(cmd *cobra.Command, args []string) error {
|
||||
}
|
||||
}
|
||||
|
||||
flags := cmd.Flags()
|
||||
cliVals.Net, err = common.NetFlagsToNetOptions(nil, *flags)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
runOpts.CIDFile = cliVals.CIDFile
|
||||
runOpts.Rm = cliVals.Rm
|
||||
if cliVals, err = CreateInit(cmd, cliVals, false); err != nil {
|
||||
cliVals, err := CreateInit(cmd, cliVals, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -18,20 +18,5 @@ func validate(c *entities.ContainerCreateOptions) error {
|
||||
return err
|
||||
}
|
||||
|
||||
var imageVolType = map[string]string{
|
||||
"bind": "",
|
||||
"tmpfs": "",
|
||||
"ignore": "",
|
||||
}
|
||||
if _, ok := imageVolType[c.ImageVolume]; !ok {
|
||||
switch {
|
||||
case c.IsInfra:
|
||||
c.ImageVolume = "bind"
|
||||
case c.IsClone: // the image volume type will be deduced later from the container we are cloning
|
||||
return nil
|
||||
default:
|
||||
return errors.Errorf("invalid image-volume type %q. Pick one of bind, tmpfs, or ignore", c.ImageVolume)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
return config.ValidateImageVolumeMode(c.ImageVolume)
|
||||
}
|
||||
|
@ -229,9 +229,11 @@ func setNamespaces(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions)
|
||||
}
|
||||
|
||||
func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions, args []string) error {
|
||||
var (
|
||||
err error
|
||||
)
|
||||
rtc, err := config.Default()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// validate flags as needed
|
||||
if err := validate(c); err != nil {
|
||||
return err
|
||||
@ -479,8 +481,13 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions
|
||||
if len(s.HostUsers) == 0 || len(c.HostUsers) != 0 {
|
||||
s.HostUsers = c.HostUsers
|
||||
}
|
||||
if len(s.ImageVolumeMode) == 0 || len(c.ImageVolume) != 0 {
|
||||
s.ImageVolumeMode = c.ImageVolume
|
||||
if len(c.ImageVolume) != 0 {
|
||||
if len(s.ImageVolumeMode) == 0 {
|
||||
s.ImageVolumeMode = c.ImageVolume
|
||||
}
|
||||
}
|
||||
if len(s.ImageVolumeMode) == 0 {
|
||||
s.ImageVolumeMode = rtc.Engine.ImageVolumeMode
|
||||
}
|
||||
if s.ImageVolumeMode == "bind" {
|
||||
s.ImageVolumeMode = "anonymous"
|
||||
@ -550,11 +557,6 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions
|
||||
s.CgroupsMode = c.CgroupsMode
|
||||
}
|
||||
if s.CgroupsMode == "" {
|
||||
rtc, err := config.Default()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s.CgroupsMode = rtc.Cgroups()
|
||||
}
|
||||
|
||||
|
@ -411,4 +411,43 @@ NeedsChown | true
|
||||
fi
|
||||
}
|
||||
|
||||
@test "podman --image-volume" {
|
||||
tmpdir=$PODMAN_TMPDIR/volume-test
|
||||
mkdir -p $tmpdir
|
||||
containerfile=$tmpdir/Containerfile
|
||||
cat >$containerfile <<EOF
|
||||
FROM $IMAGE
|
||||
VOLUME /data
|
||||
EOF
|
||||
fs=$(stat -f -c %T .)
|
||||
run_podman build -t volume_image $tmpdir
|
||||
|
||||
containersconf=$tmpdir/containers.conf
|
||||
cat >$containersconf <<EOF
|
||||
[engine]
|
||||
image_volume_mode="tmpfs"
|
||||
EOF
|
||||
|
||||
run_podman run --image-volume tmpfs --rm volume_image stat -f -c %T /data
|
||||
is "$output" "tmpfs" "Should be tmpfs"
|
||||
|
||||
run_podman 1 run --image-volume ignore --rm volume_image stat -f -c %T /data
|
||||
is "$output" "stat: can't read file system information for '/data': No such file or directory" "Should fail with /data does not exists"
|
||||
|
||||
CONTAINERS_CONF="$containersconf" run_podman run --rm volume_image stat -f -c %T /data
|
||||
is "$output" "tmpfs" "Should be tmpfs"
|
||||
|
||||
CONTAINERS_CONF="$containersconf" run_podman run --image-volume bind --rm volume_image stat -f -c %T /data
|
||||
assert "$output" != "tmpfs" "Should match hosts $fs"
|
||||
|
||||
CONTAINERS_CONF="$containersconf" run_podman run --image-volume tmpfs --rm volume_image stat -f -c %T /data
|
||||
is "$output" "tmpfs" "Should be tmpfs"
|
||||
|
||||
CONTAINERS_CONF="$containersconf" run_podman 1 run --image-volume ignore --rm volume_image stat -f -c %T /data
|
||||
is "$output" "stat: can't read file system information for '/data': No such file or directory" "Should fail with /data does not exists"
|
||||
|
||||
run_podman rm --all --force -t 0
|
||||
run_podman image rm --force localhost/volume_image
|
||||
}
|
||||
|
||||
# vim: filetype=sh
|
||||
|
Reference in New Issue
Block a user