github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/test/e2e/exec_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "os" 6 "strings" 7 8 . "github.com/containers/podman/v2/test/utils" 9 . "github.com/onsi/ginkgo" 10 . "github.com/onsi/gomega" 11 ) 12 13 var _ = Describe("Podman exec", func() { 14 var ( 15 tempdir string 16 err error 17 podmanTest *PodmanTestIntegration 18 ) 19 20 BeforeEach(func() { 21 tempdir, err = CreateTempDirInTempDir() 22 if err != nil { 23 os.Exit(1) 24 } 25 podmanTest = PodmanTestCreate(tempdir) 26 podmanTest.Setup() 27 podmanTest.SeedImages() 28 }) 29 30 AfterEach(func() { 31 podmanTest.Cleanup() 32 f := CurrentGinkgoTestDescription() 33 processTestResult(f) 34 35 }) 36 37 It("podman exec into bogus container", func() { 38 session := podmanTest.Podman([]string{"exec", "foobar", "ls"}) 39 session.WaitWithDefaultTimeout() 40 Expect(session.ExitCode()).To(Equal(125)) 41 }) 42 43 It("podman exec without command", func() { 44 session := podmanTest.Podman([]string{"exec", "foobar"}) 45 session.WaitWithDefaultTimeout() 46 Expect(session.ExitCode()).To(Equal(125)) 47 }) 48 49 It("podman exec simple command", func() { 50 setup := podmanTest.RunTopContainer("test1") 51 setup.WaitWithDefaultTimeout() 52 Expect(setup.ExitCode()).To(Equal(0)) 53 54 session := podmanTest.Podman([]string{"exec", "test1", "ls"}) 55 session.WaitWithDefaultTimeout() 56 Expect(session.ExitCode()).To(Equal(0)) 57 }) 58 59 It("podman container exec simple command", func() { 60 setup := podmanTest.RunTopContainer("test1") 61 setup.WaitWithDefaultTimeout() 62 Expect(setup.ExitCode()).To(Equal(0)) 63 64 session := podmanTest.Podman([]string{"container", "exec", "test1", "ls"}) 65 session.WaitWithDefaultTimeout() 66 Expect(session.ExitCode()).To(Equal(0)) 67 }) 68 69 It("podman exec simple command using latest", func() { 70 setup := podmanTest.RunTopContainer("test1") 71 setup.WaitWithDefaultTimeout() 72 Expect(setup.ExitCode()).To(Equal(0)) 73 cid := "-l" 74 if IsRemote() { 75 cid = "test1" 76 } 77 session := podmanTest.Podman([]string{"exec", cid, "ls"}) 78 session.WaitWithDefaultTimeout() 79 Expect(session.ExitCode()).To(Equal(0)) 80 }) 81 82 It("podman exec environment test", func() { 83 setup := podmanTest.RunTopContainer("test1") 84 setup.WaitWithDefaultTimeout() 85 Expect(setup.ExitCode()).To(Equal(0)) 86 87 session := podmanTest.Podman([]string{"exec", "--env", "FOO=BAR", "test1", "printenv", "FOO"}) 88 session.WaitWithDefaultTimeout() 89 Expect(session.ExitCode()).To(Equal(0)) 90 Expect(session.OutputToString()).To(Equal("BAR")) 91 92 session = podmanTest.Podman([]string{"exec", "--env", "PATH=/bin", "test1", "printenv", "PATH"}) 93 session.WaitWithDefaultTimeout() 94 Expect(session.ExitCode()).To(Equal(0)) 95 Expect(session.OutputToString()).To(Equal("/bin")) 96 }) 97 98 It("podman exec os.Setenv env", func() { 99 // remote doesn't properly interpret os.Setenv 100 setup := podmanTest.RunTopContainer("test1") 101 setup.WaitWithDefaultTimeout() 102 Expect(setup.ExitCode()).To(Equal(0)) 103 104 os.Setenv("FOO", "BAR") 105 session := podmanTest.Podman([]string{"exec", "--env", "FOO", "test1", "printenv", "FOO"}) 106 session.WaitWithDefaultTimeout() 107 Expect(session.ExitCode()).To(Equal(0)) 108 Expect(session.OutputToString()).To(Equal("BAR")) 109 os.Unsetenv("FOO") 110 }) 111 112 It("podman exec exit code", func() { 113 setup := podmanTest.RunTopContainer("test1") 114 setup.WaitWithDefaultTimeout() 115 Expect(setup.ExitCode()).To(Equal(0)) 116 117 session := podmanTest.Podman([]string{"exec", "test1", "sh", "-c", "exit 100"}) 118 session.WaitWithDefaultTimeout() 119 Expect(session.ExitCode()).To(Equal(100)) 120 }) 121 122 It("podman exec terminal doesn't hang", func() { 123 setup := podmanTest.Podman([]string{"run", "-dti", "--name", "test1", fedoraMinimal, "sleep", "+Inf"}) 124 setup.WaitWithDefaultTimeout() 125 Expect(setup.ExitCode()).To(Equal(0)) 126 127 for i := 0; i < 5; i++ { 128 session := podmanTest.Podman([]string{"exec", "-ti", "test1", "true"}) 129 session.WaitWithDefaultTimeout() 130 Expect(session.ExitCode()).To(Equal(0)) 131 } 132 }) 133 134 It("podman exec pseudo-terminal sanity check", func() { 135 setup := podmanTest.Podman([]string{"run", "--detach", "--name", "test1", fedoraMinimal, "sleep", "+Inf"}) 136 setup.WaitWithDefaultTimeout() 137 Expect(setup.ExitCode()).To(Equal(0)) 138 139 session := podmanTest.Podman([]string{"exec", "--interactive", "--tty", "test1", "/usr/bin/stty", "--all"}) 140 session.WaitWithDefaultTimeout() 141 Expect(session.ExitCode()).To(Equal(0)) 142 Expect(session.OutputToString()).To(ContainSubstring(" onlcr")) 143 }) 144 145 It("podman exec simple command with user", func() { 146 setup := podmanTest.RunTopContainer("test1") 147 setup.WaitWithDefaultTimeout() 148 Expect(setup.ExitCode()).To(Equal(0)) 149 150 session := podmanTest.Podman([]string{"exec", "--user", "root", "test1", "ls"}) 151 session.WaitWithDefaultTimeout() 152 Expect(session.ExitCode()).To(Equal(0)) 153 }) 154 155 It("podman exec with user only in container", func() { 156 testUser := "test123" 157 setup := podmanTest.Podman([]string{"run", "--name", "test1", "-d", fedoraMinimal, "sleep", "60"}) 158 setup.WaitWithDefaultTimeout() 159 Expect(setup.ExitCode()).To(Equal(0)) 160 161 session := podmanTest.Podman([]string{"exec", "test1", "useradd", testUser}) 162 session.WaitWithDefaultTimeout() 163 Expect(session.ExitCode()).To(Equal(0)) 164 165 session2 := podmanTest.Podman([]string{"exec", "--user", testUser, "test1", "whoami"}) 166 session2.WaitWithDefaultTimeout() 167 Expect(session2.ExitCode()).To(Equal(0)) 168 Expect(session2.OutputToString()).To(Equal(testUser)) 169 }) 170 171 It("podman exec with user from run", func() { 172 testUser := "guest" 173 setup := podmanTest.Podman([]string{"run", "--user", testUser, "-d", ALPINE, "top"}) 174 setup.WaitWithDefaultTimeout() 175 Expect(setup.ExitCode()).To(Equal(0)) 176 ctrID := setup.OutputToString() 177 178 session := podmanTest.Podman([]string{"exec", ctrID, "whoami"}) 179 session.WaitWithDefaultTimeout() 180 Expect(session.ExitCode()).To(Equal(0)) 181 Expect(session.OutputToString()).To(ContainSubstring(testUser)) 182 183 overrideUser := "root" 184 session = podmanTest.Podman([]string{"exec", "--user", overrideUser, ctrID, "whoami"}) 185 session.WaitWithDefaultTimeout() 186 Expect(session.ExitCode()).To(Equal(0)) 187 Expect(session.OutputToString()).To(ContainSubstring(overrideUser)) 188 }) 189 190 It("podman exec simple working directory test", func() { 191 setup := podmanTest.RunTopContainer("test1") 192 setup.WaitWithDefaultTimeout() 193 Expect(setup.ExitCode()).To(Equal(0)) 194 195 session := podmanTest.Podman([]string{"exec", "--workdir", "/tmp", "test1", "pwd"}) 196 session.WaitWithDefaultTimeout() 197 Expect(session.ExitCode()).To(Equal(0)) 198 Expect(session.OutputToString()).To(Equal("/tmp")) 199 200 session = podmanTest.Podman([]string{"exec", "-w", "/tmp", "test1", "pwd"}) 201 session.WaitWithDefaultTimeout() 202 Expect(session.ExitCode()).To(Equal(0)) 203 Expect(session.OutputToString()).To(Equal("/tmp")) 204 }) 205 206 It("podman exec missing working directory test", func() { 207 setup := podmanTest.RunTopContainer("test1") 208 setup.WaitWithDefaultTimeout() 209 Expect(setup.ExitCode()).To(Equal(0)) 210 211 session := podmanTest.Podman([]string{"exec", "--workdir", "/missing", "test1", "pwd"}) 212 session.WaitWithDefaultTimeout() 213 Expect(session).To(ExitWithError()) 214 215 session = podmanTest.Podman([]string{"exec", "-w", "/missing", "test1", "pwd"}) 216 session.WaitWithDefaultTimeout() 217 Expect(session).To(ExitWithError()) 218 }) 219 220 It("podman exec cannot be invoked", func() { 221 setup := podmanTest.RunTopContainer("test1") 222 setup.WaitWithDefaultTimeout() 223 Expect(setup.ExitCode()).To(Equal(0)) 224 225 session := podmanTest.Podman([]string{"exec", "test1", "/etc"}) 226 session.WaitWithDefaultTimeout() 227 Expect(session.ExitCode()).To(Equal(126)) 228 }) 229 230 It("podman exec command not found", func() { 231 setup := podmanTest.RunTopContainer("test1") 232 setup.WaitWithDefaultTimeout() 233 Expect(setup.ExitCode()).To(Equal(0)) 234 235 session := podmanTest.Podman([]string{"exec", "test1", "notthere"}) 236 session.WaitWithDefaultTimeout() 237 Expect(session.ExitCode()).To(Equal(127)) 238 }) 239 240 It("podman exec preserve fds sanity check", func() { 241 setup := podmanTest.RunTopContainer("test1") 242 setup.WaitWithDefaultTimeout() 243 Expect(setup.ExitCode()).To(Equal(0)) 244 245 devNull, err := os.Open("/dev/null") 246 Expect(err).To(BeNil()) 247 defer devNull.Close() 248 files := []*os.File{ 249 devNull, 250 } 251 session := podmanTest.PodmanExtraFiles([]string{"exec", "--preserve-fds", "1", "test1", "ls"}, files) 252 session.WaitWithDefaultTimeout() 253 Expect(session.ExitCode()).To(Equal(0)) 254 }) 255 256 It("podman exec preserves --group-add groups", func() { 257 groupName := "group1" 258 gid := "4444" 259 ctrName1 := "ctr1" 260 ctr1 := podmanTest.Podman([]string{"run", "-ti", "--name", ctrName1, fedoraMinimal, "groupadd", "-g", gid, groupName}) 261 ctr1.WaitWithDefaultTimeout() 262 Expect(ctr1.ExitCode()).To(Equal(0)) 263 264 imgName := "img1" 265 commit := podmanTest.Podman([]string{"commit", ctrName1, imgName}) 266 commit.WaitWithDefaultTimeout() 267 Expect(commit.ExitCode()).To(Equal(0)) 268 269 ctrName2 := "ctr2" 270 ctr2 := podmanTest.Podman([]string{"run", "-d", "--name", ctrName2, "--group-add", groupName, imgName, "sleep", "300"}) 271 ctr2.WaitWithDefaultTimeout() 272 Expect(ctr2.ExitCode()).To(Equal(0)) 273 274 exec := podmanTest.Podman([]string{"exec", "-ti", ctrName2, "id"}) 275 exec.WaitWithDefaultTimeout() 276 Expect(exec.ExitCode()).To(Equal(0)) 277 Expect(exec.OutputToString()).To(ContainSubstring(fmt.Sprintf("%s(%s)", gid, groupName))) 278 }) 279 280 It("podman exec preserves container groups with --user and --group-add", func() { 281 dockerfile := `FROM registry.fedoraproject.org/fedora-minimal 282 RUN groupadd -g 4000 first 283 RUN groupadd -g 4001 second 284 RUN useradd -u 1000 auser` 285 imgName := "testimg" 286 podmanTest.BuildImage(dockerfile, imgName, "false") 287 288 ctrName := "testctr" 289 ctr := podmanTest.Podman([]string{"run", "-t", "-i", "-d", "--name", ctrName, "--user", "auser:first", "--group-add", "second", imgName, "sleep", "300"}) 290 ctr.WaitWithDefaultTimeout() 291 Expect(ctr.ExitCode()).To(Equal(0)) 292 293 exec := podmanTest.Podman([]string{"exec", "-t", ctrName, "id"}) 294 exec.WaitWithDefaultTimeout() 295 Expect(exec.ExitCode()).To(Equal(0)) 296 output := exec.OutputToString() 297 Expect(output).To(ContainSubstring("4000(first)")) 298 Expect(output).To(ContainSubstring("4001(second)")) 299 Expect(output).To(ContainSubstring("1000(auser)")) 300 301 // Kill the container just so the test does not take 15 seconds to stop. 302 kill := podmanTest.Podman([]string{"kill", ctrName}) 303 kill.WaitWithDefaultTimeout() 304 Expect(kill.ExitCode()).To(Equal(0)) 305 }) 306 307 It("podman exec --detach", func() { 308 ctrName := "testctr" 309 ctr := podmanTest.Podman([]string{"run", "-t", "-i", "-d", "--name", ctrName, ALPINE, "top"}) 310 ctr.WaitWithDefaultTimeout() 311 Expect(ctr.ExitCode()).To(Equal(0)) 312 313 exec1 := podmanTest.Podman([]string{"exec", "-t", "-i", "-d", ctrName, "top"}) 314 exec1.WaitWithDefaultTimeout() 315 Expect(ctr.ExitCode()).To(Equal(0)) 316 317 data := podmanTest.InspectContainer(ctrName) 318 Expect(len(data)).To(Equal(1)) 319 Expect(len(data[0].ExecIDs)).To(Equal(1)) 320 Expect(exec1.OutputToString()).To(ContainSubstring(data[0].ExecIDs[0])) 321 322 exec2 := podmanTest.Podman([]string{"exec", "-t", "-i", ctrName, "ps", "-a"}) 323 exec2.WaitWithDefaultTimeout() 324 Expect(ctr.ExitCode()).To(Equal(0)) 325 Expect(strings.Count(exec2.OutputToString(), "top")).To(Equal(2)) 326 327 // Ensure that stop with a running detached exec session is 328 // clean. 329 stop := podmanTest.Podman([]string{"stop", ctrName}) 330 stop.WaitWithDefaultTimeout() 331 Expect(stop.ExitCode()).To(Equal(0)) 332 }) 333 })