Merge pull request #23082 from Luap99/pod-id-file

podman run use pod userns even with --pod-id-file
This commit is contained in:
openshift-merge-bot[bot] authored and GitHub committed 2024-06-25 07:57:29 +00:00
commit d4c4801dcd
4 files changed
+57 -20

No files matched your search

+1 -3
View File
@@ -1,8 +1,6 @@
package common
import (
"os"
"github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
commonFlag "github.com/containers/common/pkg/flag"
@@ -723,7 +721,7 @@ func DefineCreateFlags(cmd *cobra.Command, cf *entities.ContainerCreateOptions,
usernsFlagName := "userns"
createFlags.String(
usernsFlagName, os.Getenv("PODMAN_USERNS"),
usernsFlagName, "",
"User namespace to use",
)
_ = cmd.RegisterFlagCompletionFunc(usernsFlagName, AutocompleteUserNamespace)
+1 -1
View File
@@ -134,7 +134,7 @@ func playFlags(cmd *cobra.Command) {
_ = cmd.RegisterFlagCompletionFunc(logOptFlagName, common.AutocompleteLogOpt)
usernsFlagName := "userns"
flags.StringVar(&playOptions.Userns, usernsFlagName, os.Getenv("PODMAN_USERNS"),
flags.StringVar(&playOptions.Userns, usernsFlagName, "",
"User namespace to use",
)
_ = cmd.RegisterFlagCompletionFunc(usernsFlagName, common.AutocompleteUserNamespace)
+18 -16
View File
@@ -222,7 +222,8 @@ func setNamespaces(rtc *config.Config, s *specgen.SpecGenerator, c *entities.Con
}
}
userns := c.UserNS
if userns == "" && c.Pod == "" {
// caller must make sure s.Pod is set before calling this function.
if userns == "" && s.Pod == "" {
if ns, ok := os.LookupEnv("PODMAN_USERNS"); ok {
userns = ns
} else {
@@ -388,6 +389,22 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions
s.StartupHealthConfig.Successes = int(c.StartupHCSuccesses)
}
if len(s.Pod) == 0 || len(c.Pod) > 0 {
s.Pod = c.Pod
}
if len(c.PodIDFile) > 0 {
if len(s.Pod) > 0 {
return errors.New("cannot specify both --pod and --pod-id-file")
}
podID, err := ReadPodIDFile(c.PodIDFile)
if err != nil {
return err
}
s.Pod = podID
}
// Important s.Pod must be set above here.
if err := setNamespaces(rtc, s, c); err != nil {
return err
}
@@ -408,21 +425,6 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions
s.PublishExposedPorts = &c.PublishAll
}
if len(s.Pod) == 0 || len(c.Pod) > 0 {
s.Pod = c.Pod
}
if len(c.PodIDFile) > 0 {
if len(s.Pod) > 0 {
return errors.New("cannot specify both --pod and --pod-id-file")
}
podID, err := ReadPodIDFile(c.PodIDFile)
if err != nil {
return err
}
s.Pod = podID
}
expose, err := CreateExpose(c.Expose)
if err != nil {
return err
+37
View File
@@ -422,4 +422,41 @@ var _ = Describe("Podman UserNS support", func() {
podmanTest.RestartRemoteService()
}
})
It("podman pod userns inherited for containers", func() {
podName := "testPod"
podIDFile := filepath.Join(podmanTest.TempDir, "podid")
podCreate := podmanTest.Podman([]string{"pod", "create", "--pod-id-file", podIDFile, "--uidmap", "0:0:1000", "--name", podName})
podCreate.WaitWithDefaultTimeout()
Expect(podCreate).Should(ExitCleanly())
// The containers should not use PODMAN_USERNS as they must inherited the userns from the pod.
os.Setenv("PODMAN_USERNS", "keep-id")
defer os.Unsetenv("PODMAN_USERNS")
expectedMapping := ` 0 0 1000
0 0 1000
`
// rootless mapping is split in two ranges
if isRootless() {
expectedMapping = ` 0 0 1
1 1 999
0 0 1
1 1 999
`
}
session := podmanTest.Podman([]string{"run", "--pod", podName, ALPINE, "cat", "/proc/self/uid_map", "/proc/self/gid_map"})
session.WaitWithDefaultTimeout()
Expect(session).Should(ExitCleanly())
output := string(session.Out.Contents())
Expect(output).To(Equal(expectedMapping))
// https://github.com/containers/podman/issues/22931
session = podmanTest.Podman([]string{"run", "--pod-id-file", podIDFile, ALPINE, "cat", "/proc/self/uid_map", "/proc/self/gid_map"})
session.WaitWithDefaultTimeout()
Expect(session).Should(ExitCleanly())
output = string(session.Out.Contents())
Expect(output).To(Equal(expectedMapping))
})
})