mirror of
https://github.com/containers/podman.git
synced 2025-06-25 12:20:42 +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)
|
_ = cmd.RegisterFlagCompletionFunc(hostUserFlagName, completion.AutocompleteNone)
|
||||||
|
|
||||||
imageVolumeFlagName := "image-volume"
|
imageVolumeFlagName := "image-volume"
|
||||||
createFlags.StringVar(
|
createFlags.String(
|
||||||
&cf.ImageVolume,
|
imageVolumeFlagName, containerConfig.Engine.ImageVolumeMode,
|
||||||
imageVolumeFlagName, DefaultImageVolume,
|
|
||||||
`Tells podman how to handle the builtin image volumes ("bind"|"tmpfs"|"ignore")`,
|
`Tells podman how to handle the builtin image volumes ("bind"|"tmpfs"|"ignore")`,
|
||||||
)
|
)
|
||||||
_ = cmd.RegisterFlagCompletionFunc(imageVolumeFlagName, AutocompleteImageVolume)
|
_ = cmd.RegisterFlagCompletionFunc(imageVolumeFlagName, AutocompleteImageVolume)
|
||||||
|
@ -5,9 +5,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
||||||
// DefaultImageVolume default value
|
|
||||||
DefaultImageVolume = "bind"
|
|
||||||
// Pull in configured json library
|
// Pull in configured json library
|
||||||
json = registry.JSONLibrary()
|
json = registry.JSONLibrary()
|
||||||
)
|
)
|
||||||
|
@ -102,16 +102,25 @@ func init() {
|
|||||||
createFlags(containerCreateCommand)
|
createFlags(containerCreateCommand)
|
||||||
}
|
}
|
||||||
|
|
||||||
func create(cmd *cobra.Command, args []string) error {
|
func commonFlags(cmd *cobra.Command) error {
|
||||||
var (
|
var err error
|
||||||
err error
|
|
||||||
)
|
|
||||||
flags := cmd.Flags()
|
flags := cmd.Flags()
|
||||||
cliVals.Net, err = common.NetFlagsToNetOptions(nil, *flags)
|
cliVals.Net, err = common.NetFlagsToNetOptions(nil, *flags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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
|
// Check if initctr is used with --pod and the value is correct
|
||||||
if initctr := InitContainerType; cmd.Flags().Changed("init-ctr") {
|
if initctr := InitContainerType; cmd.Flags().Changed("init-ctr") {
|
||||||
if !cmd.Flags().Changed("pod") {
|
if !cmd.Flags().Changed("pod") {
|
||||||
@ -123,7 +132,7 @@ func create(cmd *cobra.Command, args []string) error {
|
|||||||
cliVals.InitContainerType = initctr
|
cliVals.InitContainerType = initctr
|
||||||
}
|
}
|
||||||
|
|
||||||
cliVals, err = CreateInit(cmd, cliVals, false)
|
cliVals, err := CreateInit(cmd, cliVals, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -109,7 +109,9 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func run(cmd *cobra.Command, args []string) error {
|
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
|
// TODO: Breaking change should be made fatal in next major Release
|
||||||
if cliVals.TTY && cliVals.Interactive && !term.IsTerminal(int(os.Stdin.Fd())) {
|
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.CIDFile = cliVals.CIDFile
|
||||||
runOpts.Rm = cliVals.Rm
|
runOpts.Rm = cliVals.Rm
|
||||||
if cliVals, err = CreateInit(cmd, cliVals, false); err != nil {
|
cliVals, err := CreateInit(cmd, cliVals, false)
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,20 +18,5 @@ func validate(c *entities.ContainerCreateOptions) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var imageVolType = map[string]string{
|
return config.ValidateImageVolumeMode(c.ImageVolume)
|
||||||
"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
|
|
||||||
}
|
}
|
||||||
|
@ -229,9 +229,11 @@ func setNamespaces(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions, args []string) error {
|
func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions, args []string) error {
|
||||||
var (
|
rtc, err := config.Default()
|
||||||
err error
|
if err != nil {
|
||||||
)
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// validate flags as needed
|
// validate flags as needed
|
||||||
if err := validate(c); err != nil {
|
if err := validate(c); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -479,8 +481,13 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions
|
|||||||
if len(s.HostUsers) == 0 || len(c.HostUsers) != 0 {
|
if len(s.HostUsers) == 0 || len(c.HostUsers) != 0 {
|
||||||
s.HostUsers = c.HostUsers
|
s.HostUsers = c.HostUsers
|
||||||
}
|
}
|
||||||
if len(s.ImageVolumeMode) == 0 || len(c.ImageVolume) != 0 {
|
if len(c.ImageVolume) != 0 {
|
||||||
s.ImageVolumeMode = c.ImageVolume
|
if len(s.ImageVolumeMode) == 0 {
|
||||||
|
s.ImageVolumeMode = c.ImageVolume
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(s.ImageVolumeMode) == 0 {
|
||||||
|
s.ImageVolumeMode = rtc.Engine.ImageVolumeMode
|
||||||
}
|
}
|
||||||
if s.ImageVolumeMode == "bind" {
|
if s.ImageVolumeMode == "bind" {
|
||||||
s.ImageVolumeMode = "anonymous"
|
s.ImageVolumeMode = "anonymous"
|
||||||
@ -550,11 +557,6 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions
|
|||||||
s.CgroupsMode = c.CgroupsMode
|
s.CgroupsMode = c.CgroupsMode
|
||||||
}
|
}
|
||||||
if s.CgroupsMode == "" {
|
if s.CgroupsMode == "" {
|
||||||
rtc, err := config.Default()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
s.CgroupsMode = rtc.Cgroups()
|
s.CgroupsMode = rtc.Cgroups()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -411,4 +411,43 @@ NeedsChown | true
|
|||||||
fi
|
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
|
# vim: filetype=sh
|
||||||
|
Reference in New Issue
Block a user