Skip to content

Commit

Permalink
storage: support --mount type=bind,bind-nonrecursive
Browse files Browse the repository at this point in the history
add support for not recursive bind mounts.

Closes: containers#3314

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
  • Loading branch information
giuseppe committed Jun 13, 2019
1 parent 97f4818 commit 23efe4c
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 4 deletions.
1 change: 1 addition & 0 deletions docs/podman-create.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,7 @@ Current supported mount TYPES are bind, and tmpfs.
Options specific to bind:

· bind-propagation: shared, slave, private, rshared, rslave, or rprivate(default). See also mount(2).
. bind-nonrecursive: do not setup a recursive bind mount. By default it is recursive.

Options specific to tmpfs:

Expand Down
1 change: 1 addition & 0 deletions docs/podman-run.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,7 @@ Current supported mount TYPES are bind, and tmpfs.
Options specific to bind:

· bind-propagation: Z, z, shared, slave, private, rshared, rslave, or rprivate(default). See also mount(2).
. bind-nonrecursive: do not setup a recursive bind mount. By default it is recursive.

Options specific to tmpfs:

Expand Down
9 changes: 8 additions & 1 deletion pkg/spec/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,8 @@ func getBindMount(args []string) (spec.Mount, error) {
for _, val := range args {
kv := strings.Split(val, "=")
switch kv[0] {
case "bind-nonrecursive":
newMount.Options = append(newMount.Options, "bind")
case "ro", "nosuid", "nodev", "noexec":
// TODO: detect duplication of these options.
// (Is this necessary?)
Expand Down Expand Up @@ -574,7 +576,7 @@ func ValidateVolumeCtrDir(ctrDir string) error {

// ValidateVolumeOpts validates a volume's options
func ValidateVolumeOpts(options []string) error {
var foundRootPropagation, foundRWRO, foundLabelChange int
var foundRootPropagation, foundRWRO, foundLabelChange, bindType int
for _, opt := range options {
switch opt {
case "rw", "ro":
Expand All @@ -592,6 +594,11 @@ func ValidateVolumeOpts(options []string) error {
if foundRootPropagation > 1 {
return errors.Errorf("invalid options %q, can only specify 1 '[r]shared', '[r]private' or '[r]slave' option", strings.Join(options, ", "))
}
case "bind", "rbind":
bindType++
if bindType > 1 {
return errors.Errorf("invalid options %q, can only specify 1 '[r]bind' option", strings.Join(options, ", "))
}
default:
return errors.Errorf("invalid option type %q", opt)
}
Expand Down
15 changes: 12 additions & 3 deletions pkg/util/mountOpts.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,19 @@ var (
// sensible and follow convention.
func ProcessOptions(options []string) []string {
var (
foundrw, foundro bool
rootProp string
foundbind, foundrw, foundro bool
rootProp string
)
options = append(options, "rbind")
for _, opt := range options {
switch opt {
case "bind", "rbind":
foundbind = true
break
}
}
if !foundbind {
options = append(options, "rbind")
}
for _, opt := range options {
switch opt {
case "rw":
Expand Down
8 changes: 8 additions & 0 deletions test/e2e/run_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -659,6 +659,14 @@ USER mail`
Expect(isSharedOnly).Should(BeTrue())
})

It("podman run --mount type=bind,bind-nonrecursive", func() {
SkipIfRootless()
session := podmanTest.Podman([]string{"run", "--mount", "type=bind,bind-nonrecursive,slave,src=/,target=/host", fedoraMinimal, "findmnt", "-nR", "/host"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
Expect(len(session.OutputToStringArray())).To(Equal(1))
})

It("podman run --pod automatically", func() {
session := podmanTest.Podman([]string{"run", "--pod", "new:foobar", ALPINE, "ls"})
session.WaitWithDefaultTimeout()
Expand Down

0 comments on commit 23efe4c

Please sign in to comment.