diff --git a/docs/source/markdown/options/mount.md b/docs/source/markdown/options/mount.md
index 3390e0651c..a44acbf695 100644
--- a/docs/source/markdown/options/mount.md
+++ b/docs/source/markdown/options/mount.md
@@ -6,25 +6,28 @@
Attach a filesystem mount to the container
-Current supported mount TYPEs are **bind**, **devpts**, **glob**, **image**, **tmpfs** and **volume**. [[1]](#Footnote1)
+Current supported mount TYPEs are **bind**, **devpts**, **glob**, **image**, **ramfs**, **tmpfs** and **volume**. [[1]](#Footnote1)
e.g.
-
type=bind,source=/path/on/host,destination=/path/in/container
type=bind,src=/path/on/host,dst=/path/in/container,relabel=shared
type=bind,src=/path/on/host,dst=/path/in/container,relabel=shared,U=true
+ type=devpts,destination=/dev/pts
+
type=glob,src=/usr/lib/libfoo*,destination=/usr/lib,ro=true
- type=volume,source=vol1,destination=/path/in/container,ro=true
-
- type=tmpfs,tmpfs-size=512M,destination=/path/in/container
-
type=image,source=fedora,destination=/fedora-image,rw=true
- type=devpts,destination=/dev/pts
+ type=ramfs,tmpfs-size=512M,destination=/path/in/container
+
+ type=tmpfs,tmpfs-size=512M,destination=/path/in/container
+
+ type=tmpfs,destination=/path/in/container,noswap
+
+ type=volume,source=vol1,destination=/path/in/container,ro=true
Common Options:
@@ -72,17 +75,17 @@ Current supported mount TYPEs are **bind**, **devpts**, **glob**, **image**, **t
. U, chown: true or false (default). Change recursively the owner and group of the source volume based on the UID and GID of the container.
- Options specific to tmpfs:
+ Options specific to tmpfs and ramfs:
· ro, readonly: true or false (default).
- · tmpfs-size: Size of the tmpfs mount in bytes. Unlimited by default in Linux.
+ · tmpfs-size: Size of the tmpfs/ramfs mount in bytes. Unlimited by default in Linux.
- · tmpfs-mode: File mode of the tmpfs in octal. (e.g. 700 or 0700.) Defaults to 1777 in Linux.
+ · tmpfs-mode: File mode of the tmpfs/ramfs in octal. (e.g. 700 or 0700.) Defaults to 1777 in Linux.
- · tmpcopyup: Enable copyup from the image directory at the same location to the tmpfs. Used by default.
+ · tmpcopyup: Enable copyup from the image directory at the same location to the tmpfs/ramfs. Used by default.
- · notmpcopyup: Disable copying files from the image to the tmpfs.
+ · notmpcopyup: Disable copying files from the image to the tmpfs/ramfs.
. U, chown: true or false (default). Change recursively the owner and group of the source volume based on the UID and GID of the container.
diff --git a/libpod/define/mount.go b/libpod/define/mount.go
index db444fd834..83e643f897 100644
--- a/libpod/define/mount.go
+++ b/libpod/define/mount.go
@@ -1,10 +1,12 @@
package define
const (
- // TypeVolume is the type for named volumes
- TypeVolume = "volume"
- // TypeTmpfs is the type for mounting tmpfs
- TypeTmpfs = "tmpfs"
// TypeDevpts is the type for creating a devpts
TypeDevpts = "devpts"
+ // TypeTmpfs is the type for mounting tmpfs
+ TypeTmpfs = "tmpfs"
+ // TypeRamfs is the type for mounting ramfs
+ TypeRamfs = "ramfs"
+ // TypeVolume is the type for named volumes
+ TypeVolume = "volume"
)
diff --git a/pkg/specgenutil/volumes.go b/pkg/specgenutil/volumes.go
index 6dae9d1b66..06ad6b4f17 100644
--- a/pkg/specgenutil/volumes.go
+++ b/pkg/specgenutil/volumes.go
@@ -11,6 +11,7 @@ import (
"github.com/containers/common/pkg/config"
"github.com/containers/common/pkg/parse"
"github.com/containers/podman/v4/libpod/define"
+ "github.com/containers/podman/v4/pkg/rootless"
"github.com/containers/podman/v4/pkg/specgen"
"github.com/containers/podman/v4/pkg/util"
spec "github.com/opencontainers/runtime-spec/specs-go"
@@ -211,8 +212,8 @@ func Mounts(mountFlag []string, configMounts []string) (map[string]spec.Mount, m
}
finalMounts[mount.Destination] = mount
}
- case define.TypeTmpfs:
- mount, err := getTmpfsMount(tokens)
+ case define.TypeTmpfs, define.TypeRamfs:
+ mount, err := parseMemoryMount(tokens, mountType)
if err != nil {
return err
}
@@ -282,7 +283,7 @@ func Mounts(mountFlag []string, configMounts []string) (map[string]spec.Mount, m
}
func parseMountOptions(mountType string, args []string) (*spec.Mount, error) {
- var setTmpcopyup, setRORW, setSuid, setDev, setExec, setRelabel, setOwnership bool
+ var setTmpcopyup, setRORW, setSuid, setDev, setExec, setRelabel, setOwnership, setSwap bool
mnt := spec.Mount{}
for _, val := range args {
@@ -359,6 +360,15 @@ func parseMountOptions(mountType string, args []string) (*spec.Mount, error) {
}
setSuid = true
mnt.Options = append(mnt.Options, kv[0])
+ case "noswap":
+ if setSwap {
+ return nil, fmt.Errorf("cannot pass 'noswap' mnt.Options more than once: %w", errOptionArg)
+ }
+ if rootless.IsRootless() {
+ return nil, fmt.Errorf("the 'noswap' option is only allowed with rootful tmpfs mounts: %w", errOptionArg)
+ }
+ setSwap = true
+ mnt.Options = append(mnt.Options, kv[0])
case "relabel":
if setRelabel {
return nil, fmt.Errorf("cannot pass 'relabel' option more than once: %w", errOptionArg)
@@ -525,11 +535,11 @@ func getBindMount(args []string) (spec.Mount, error) {
return newMount, nil
}
-// Parse a single tmpfs mount entry from the --mount flag
-func getTmpfsMount(args []string) (spec.Mount, error) {
+// Parse a single tmpfs/ramfs mount entry from the --mount flag
+func parseMemoryMount(args []string, mountType string) (spec.Mount, error) {
newMount := spec.Mount{
- Type: define.TypeTmpfs,
- Source: define.TypeTmpfs,
+ Type: mountType,
+ Source: mountType,
}
var err error
diff --git a/pkg/util/mountOpts.go b/pkg/util/mountOpts.go
index f9aeaba26d..a65dcfbba9 100644
--- a/pkg/util/mountOpts.go
+++ b/pkg/util/mountOpts.go
@@ -6,6 +6,7 @@ import (
"strings"
"github.com/containers/podman/v4/libpod/define"
+ "github.com/containers/podman/v4/pkg/rootless"
)
var (
@@ -27,7 +28,7 @@ type defaultMountOptions struct {
// The sourcePath variable, if not empty, contains a bind mount source.
func ProcessOptions(options []string, isTmpfs bool, sourcePath string) ([]string, error) {
var (
- foundWrite, foundSize, foundProp, foundMode, foundExec, foundSuid, foundDev, foundCopyUp, foundBind, foundZ, foundU, foundOverlay, foundIdmap, foundCopy bool
+ foundWrite, foundSize, foundProp, foundMode, foundExec, foundSuid, foundDev, foundCopyUp, foundBind, foundZ, foundU, foundOverlay, foundIdmap, foundCopy, foundNoSwap bool
)
newOptions := make([]string, 0, len(options))
@@ -133,6 +134,20 @@ func ProcessOptions(options []string, isTmpfs bool, sourcePath string) ([]string
foundCopyUp = true
// do not propagate notmpcopyup to the OCI runtime
continue
+ case "noswap":
+
+ if !isTmpfs {
+ return nil, fmt.Errorf("the 'noswap' option is only allowed with tmpfs mounts: %w", ErrBadMntOption)
+ }
+ if rootless.IsRootless() {
+ return nil, fmt.Errorf("the 'noswap' option is only allowed with rootful tmpfs mounts: %w", ErrBadMntOption)
+ }
+ if foundNoSwap {
+ return nil, fmt.Errorf("the 'tmpswap' option can only be set once: %w", ErrDupeMntOption)
+ }
+ foundNoSwap = true
+ newOptions = append(newOptions, opt)
+ continue
case define.TypeBind, "rbind":
if isTmpfs {
return nil, fmt.Errorf("the 'bind' and 'rbind' options are not allowed with tmpfs mounts: %w", ErrBadMntOption)
diff --git a/test/system/060-mount.bats b/test/system/060-mount.bats
index 3a12903349..25587785d0 100644
--- a/test/system/060-mount.bats
+++ b/test/system/060-mount.bats
@@ -294,4 +294,18 @@ EOF
is "$output" "bar1.*bar2.*bar3" "Should match multiple source files on single destination directory"
}
+@test "podman mount noswap memory mounts" {
+ # if volumes source and dest match then pass
+ run_podman run --rm --mount type=ramfs,destination=${PODMAN_TMPDIR} $IMAGE stat -f -c "%T" ${PODMAN_TMPDIR}
+ is "$output" "ramfs" "ramfs mounted"
+
+ if is_rootless; then
+ run_podman 125 run --rm --mount type=tmpfs,destination=${PODMAN_TMPDIR},noswap $IMAGE stat -f -c "%T" ${PODMAN_TMPDIR}
+ is "$output" "Error: the 'noswap' option is only allowed with rootful tmpfs mounts: must provide an argument for option" "noswap not supported in rootless mode"
+ else
+ run_podman run --rm --mount type=tmpfs,destination=${PODMAN_TMPDIR},noswap $IMAGE sh -c "mount| grep ${PODMAN_TMPDIR}"
+ is "$output" ".*noswap" "tmpfs noswap mounted"
+ fi
+}
+
# vim: filetype=sh