diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2019-01-11 15:42:21 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-11 15:42:21 -0800 |
commit | 5c86efb28976938ad77fcc0f677e0842d06b65b5 (patch) | |
tree | 16cd8fcf81e9bc355b7b50648713ca09f5fa1bd2 | |
parent | 28c35cab8750f379a418e87ed6bd874a12ec158d (diff) | |
parent | 04a4ba9b7302b807b7a5d9a180d3fcd27560052a (diff) | |
download | podman-5c86efb28976938ad77fcc0f677e0842d06b65b5.tar.gz podman-5c86efb28976938ad77fcc0f677e0842d06b65b5.tar.bz2 podman-5c86efb28976938ad77fcc0f677e0842d06b65b5.zip |
Merge pull request #2138 from giuseppe/rootless-pod-fix
rootless: fix usage of create --pod=new:FOO
-rw-r--r-- | cmd/podman/create.go | 21 | ||||
-rw-r--r-- | libpod/container_internal_linux.go | 2 |
2 files changed, 19 insertions, 4 deletions
diff --git a/cmd/podman/create.go b/cmd/podman/create.go index d98b78bd4..87fa18e47 100644 --- a/cmd/podman/create.go +++ b/cmd/podman/create.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "io/ioutil" "os" "path/filepath" "strconv" @@ -421,6 +422,16 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim } if c.IsSet("pod") { if strings.HasPrefix(originalPodName, "new:") { + if rootless.IsRootless() { + // To create a new pod, we must immediately create the userns. + became, ret, err := rootless.BecomeRootInUserNS() + if err != nil { + return nil, err + } + if became { + os.Exit(ret) + } + } // pod does not exist; lets make it var podOptions []libpod.PodCreateOption podOptions = append(podOptions, libpod.WithPodName(podName), libpod.WithInfraContainer(), libpod.WithPodCgroups()) @@ -785,11 +796,15 @@ func joinOrCreateRootlessUserNamespace(createConfig *cc.CreateConfig, runtime *l if s != libpod.ContainerStateRunning && s != libpod.ContainerStatePaused { continue } - pid, err := prevCtr.PID() + data, err := ioutil.ReadFile(prevCtr.Config().ConmonPidFile) if err != nil { - return false, -1, err + return false, -1, errors.Wrapf(err, "cannot read conmon PID file %q", prevCtr.Config().ConmonPidFile) } - return rootless.JoinNS(uint(pid)) + conmonPid, err := strconv.Atoi(string(data)) + if err != nil { + return false, -1, errors.Wrapf(err, "cannot parse PID %q", data) + } + return rootless.JoinDirectUserAndMountNS(uint(conmonPid)) } } diff --git a/libpod/container_internal_linux.go b/libpod/container_internal_linux.go index 4f490bb88..bcdfdaee3 100644 --- a/libpod/container_internal_linux.go +++ b/libpod/container_internal_linux.go @@ -226,7 +226,7 @@ func (c *Container) generateSpec(ctx context.Context) (*spec.Spec, error) { Options: []string{"bind", "private"}, } if c.IsReadOnly() && dstPath != "/dev/shm" { - newMount.Options = append(newMount.Options, "ro") + newMount.Options = append(newMount.Options, "ro", "nosuid", "noexec", "nodev") } if !MountExists(g.Mounts(), dstPath) { g.AddMount(newMount) |