diff options
author | Giuseppe Scrivano <gscrivan@redhat.com> | 2019-02-22 11:14:10 +0100 |
---|---|---|
committer | Giuseppe Scrivano <gscrivan@redhat.com> | 2019-02-22 21:36:46 +0100 |
commit | d47a9a6c4d0fac435abb35c9c38b777d12e653fc (patch) | |
tree | 8d42b5fd1a00b7fb1e5c880f01eb68ee6cecd2f7 /cmd/podman/cp.go | |
parent | c757cb23ca15634077a8b9fa33aba7abd1c8249b (diff) | |
download | podman-d47a9a6c4d0fac435abb35c9c38b777d12e653fc.tar.gz podman-d47a9a6c4d0fac435abb35c9c38b777d12e653fc.tar.bz2 podman-d47a9a6c4d0fac435abb35c9c38b777d12e653fc.zip |
cmd: support rootless mode for cp command
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
Diffstat (limited to 'cmd/podman/cp.go')
-rw-r--r-- | cmd/podman/cp.go | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/cmd/podman/cp.go b/cmd/podman/cp.go index 89114fda1..d9f230b67 100644 --- a/cmd/podman/cp.go +++ b/cmd/podman/cp.go @@ -1,8 +1,10 @@ package main import ( + "io/ioutil" "os" "path/filepath" + "strconv" "strings" "github.com/containers/buildah/util" @@ -10,6 +12,7 @@ import ( "github.com/containers/libpod/cmd/podman/libpodruntime" "github.com/containers/libpod/libpod" "github.com/containers/libpod/pkg/chrootuser" + "github.com/containers/libpod/pkg/rootless" "github.com/containers/storage" "github.com/containers/storage/pkg/archive" "github.com/containers/storage/pkg/chrootarchive" @@ -48,6 +51,9 @@ func cpCmd(c *cliconfig.CpValues) error { if len(args) != 2 { return errors.Errorf("you must provide a source path and a destination path") } + if os.Geteuid() != 0 { + rootless.SetSkipStorageSetup(true) + } runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand) if err != nil { @@ -76,6 +82,34 @@ func copyBetweenHostAndContainer(runtime *libpod.Runtime, src string, dest strin ctr = destCtr } + if os.Geteuid() != 0 { + s, err := ctr.State() + if err != nil { + return err + } + var became bool + var ret int + if s == libpod.ContainerStateRunning || s == libpod.ContainerStatePaused { + data, err := ioutil.ReadFile(ctr.Config().ConmonPidFile) + if err != nil { + return errors.Wrapf(err, "cannot read conmon PID file %q", ctr.Config().ConmonPidFile) + } + conmonPid, err := strconv.Atoi(string(data)) + if err != nil { + return errors.Wrapf(err, "cannot parse PID %q", data) + } + became, ret, err = rootless.JoinDirectUserAndMountNS(uint(conmonPid)) + } else { + became, ret, err = rootless.BecomeRootInUserNS() + } + if err != nil { + return err + } + if became { + os.Exit(ret) + } + } + mountPoint, err := ctr.Mount() if err != nil { return err |