github.com/containers/podman/v4@v4.9.4/test/e2e/start_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "os" 6 "strconv" 7 "strings" 8 9 . "github.com/containers/podman/v4/test/utils" 10 . "github.com/onsi/ginkgo/v2" 11 . "github.com/onsi/gomega" 12 . "github.com/onsi/gomega/gexec" 13 ) 14 15 var _ = Describe("Podman start", func() { 16 17 It("podman start bogus container", func() { 18 session := podmanTest.Podman([]string{"start", "123"}) 19 session.WaitWithDefaultTimeout() 20 Expect(session).Should(Exit(125)) 21 }) 22 23 It("podman start single container by id", func() { 24 session := podmanTest.Podman([]string{"create", ALPINE, "ls"}) 25 session.WaitWithDefaultTimeout() 26 Expect(session).Should(ExitCleanly()) 27 cid := session.OutputToString() 28 session = podmanTest.Podman([]string{"start", cid}) 29 session.WaitWithDefaultTimeout() 30 Expect(session).Should(ExitCleanly()) 31 }) 32 33 It("podman start --rm removed on failure", func() { 34 session := podmanTest.Podman([]string{"create", "--name=test", "--rm", ALPINE, "foo"}) 35 session.WaitWithDefaultTimeout() 36 Expect(session).Should(ExitCleanly()) 37 session = podmanTest.Podman([]string{"start", "test"}) 38 session.WaitWithDefaultTimeout() 39 Expect(session).Should(Exit(125)) 40 session = podmanTest.Podman([]string{"container", "exists", "test"}) 41 session.WaitWithDefaultTimeout() 42 Expect(session).To(ExitWithError()) 43 }) 44 45 It("podman start --rm --attach removed on failure", func() { 46 session := podmanTest.Podman([]string{"create", "--rm", ALPINE, "foo"}) 47 session.WaitWithDefaultTimeout() 48 Expect(session).Should(ExitCleanly()) 49 cid := session.OutputToString() 50 session = podmanTest.Podman([]string{"start", "--attach", cid}) 51 session.WaitWithDefaultTimeout() 52 Expect(session).Should(Exit(125)) 53 session = podmanTest.Podman([]string{"container", "exists", cid}) 54 session.WaitWithDefaultTimeout() 55 Expect(session).To(ExitWithError()) 56 }) 57 58 It("podman container start single container by id", func() { 59 session := podmanTest.Podman([]string{"container", "create", ALPINE, "ls"}) 60 session.WaitWithDefaultTimeout() 61 Expect(session).Should(ExitCleanly()) 62 cid := session.OutputToString() 63 session = podmanTest.Podman([]string{"container", "start", cid}) 64 session.WaitWithDefaultTimeout() 65 Expect(session).Should(ExitCleanly()) 66 Expect(session.OutputToString()).To(Equal(cid)) 67 }) 68 69 It("podman container start single container by short id", func() { 70 session := podmanTest.Podman([]string{"container", "create", ALPINE, "ls"}) 71 session.WaitWithDefaultTimeout() 72 Expect(session).Should(ExitCleanly()) 73 cid := session.OutputToString() 74 shortID := cid[0:10] 75 session = podmanTest.Podman([]string{"container", "start", shortID}) 76 session.WaitWithDefaultTimeout() 77 Expect(session).Should(ExitCleanly()) 78 Expect(session.OutputToString()).To(Equal(shortID)) 79 }) 80 81 It("podman start single container by name", func() { 82 name := "foobar99" 83 session := podmanTest.Podman([]string{"create", "--name", name, ALPINE, "ls"}) 84 session.WaitWithDefaultTimeout() 85 Expect(session).Should(ExitCleanly()) 86 session = podmanTest.Podman([]string{"start", name}) 87 session.WaitWithDefaultTimeout() 88 Expect(session).Should(ExitCleanly()) 89 Expect(session.OutputToString()).To(Equal(name)) 90 }) 91 92 It("podman start single container with attach and test the signal", func() { 93 session := podmanTest.Podman([]string{"create", "--entrypoint", "sh", ALPINE, "-c", "exit 1"}) 94 session.WaitWithDefaultTimeout() 95 Expect(session).Should(ExitCleanly()) 96 cid := session.OutputToString() 97 session = podmanTest.Podman([]string{"start", "--attach", cid}) 98 session.WaitWithDefaultTimeout() 99 // It should forward the signal 100 Expect(session).Should(Exit(1)) 101 }) 102 103 It("podman start multiple containers", func() { 104 session := podmanTest.Podman([]string{"create", "--name", "foobar99", ALPINE, "ls"}) 105 session.WaitWithDefaultTimeout() 106 cid1 := session.OutputToString() 107 session2 := podmanTest.Podman([]string{"create", "--name", "foobar100", ALPINE, "ls"}) 108 session2.WaitWithDefaultTimeout() 109 cid2 := session2.OutputToString() 110 session = podmanTest.Podman([]string{"start", cid1, cid2}) 111 session.WaitWithDefaultTimeout() 112 Expect(session).Should(ExitCleanly()) 113 }) 114 115 It("podman start multiple containers with bogus", func() { 116 session := podmanTest.Podman([]string{"create", "--name", "foobar99", ALPINE, "ls"}) 117 session.WaitWithDefaultTimeout() 118 cid1 := session.OutputToString() 119 session = podmanTest.Podman([]string{"start", cid1, "doesnotexist"}) 120 session.WaitWithDefaultTimeout() 121 Expect(session).Should(Exit(125)) 122 }) 123 124 It("podman multiple containers -- attach should fail", func() { 125 session := podmanTest.Podman([]string{"create", "--name", "foobar1", ALPINE, "ls"}) 126 session.WaitWithDefaultTimeout() 127 Expect(session).Should(ExitCleanly()) 128 session = podmanTest.Podman([]string{"create", "--name", "foobar2", ALPINE, "ls"}) 129 session.WaitWithDefaultTimeout() 130 Expect(session).Should(ExitCleanly()) 131 session = podmanTest.Podman([]string{"start", "-a", "foobar1", "foobar2"}) 132 session.WaitWithDefaultTimeout() 133 Expect(session).Should(Exit(125)) 134 }) 135 136 It("podman failed to start with --rm should delete the container", func() { 137 session := podmanTest.Podman([]string{"create", "--name", "test1", "--rm", ALPINE, "foo"}) 138 session.WaitWithDefaultTimeout() 139 Expect(session).Should(ExitCleanly()) 140 141 start := podmanTest.Podman([]string{"start", "test1"}) 142 start.WaitWithDefaultTimeout() 143 144 wait := podmanTest.Podman([]string{"wait", "test1"}) 145 wait.WaitWithDefaultTimeout() 146 Expect(wait).To(ExitWithError()) 147 148 Eventually(podmanTest.NumberOfContainers, defaultWaitTimeout, 3.0).Should(BeZero()) 149 }) 150 151 It("podman failed to start without --rm should NOT delete the container", func() { 152 session := podmanTest.Podman([]string{"create", ALPINE, "foo"}) 153 session.WaitWithDefaultTimeout() 154 Expect(session).Should(ExitCleanly()) 155 156 start := podmanTest.Podman([]string{"start", session.OutputToString()}) 157 start.WaitWithDefaultTimeout() 158 Expect(start).To(ExitWithError()) 159 160 Eventually(podmanTest.NumberOfContainers, defaultWaitTimeout, 3.0).Should(Equal(1)) 161 }) 162 163 It("podman start --sig-proxy should not work without --attach", func() { 164 session := podmanTest.Podman([]string{"create", ALPINE, "ls"}) 165 session.WaitWithDefaultTimeout() 166 Expect(session).Should(ExitCleanly()) 167 168 session = podmanTest.Podman([]string{"start", "-l", "--sig-proxy"}) 169 session.WaitWithDefaultTimeout() 170 Expect(session).Should(Exit(125)) 171 }) 172 173 It("podman start container with special pidfile", func() { 174 SkipIfRemote("pidfile not handled by remote") 175 pidfile := tempdir + "pidfile" 176 session := podmanTest.Podman([]string{"create", "--pidfile", pidfile, ALPINE, "ls"}) 177 session.WaitWithDefaultTimeout() 178 Expect(session).Should(ExitCleanly()) 179 cid := session.OutputToString() 180 181 session = podmanTest.Podman([]string{"start", cid}) 182 session.WaitWithDefaultTimeout() 183 Expect(session).Should(ExitCleanly()) 184 readFirstLine := func(path string) string { 185 content, err := os.ReadFile(path) 186 Expect(err).ToNot(HaveOccurred()) 187 return strings.Split(string(content), "\n")[0] 188 } 189 containerPID := readFirstLine(pidfile) 190 _, err = strconv.Atoi(containerPID) // Make sure it's a proper integer 191 Expect(err).ToNot(HaveOccurred()) 192 }) 193 194 It("podman start container --filter", func() { 195 session1 := podmanTest.Podman([]string{"container", "create", ALPINE}) 196 session1.WaitWithDefaultTimeout() 197 Expect(session1).Should(ExitCleanly()) 198 cid1 := session1.OutputToString() 199 200 session1 = podmanTest.Podman([]string{"container", "create", ALPINE}) 201 session1.WaitWithDefaultTimeout() 202 Expect(session1).Should(ExitCleanly()) 203 cid2 := session1.OutputToString() 204 205 session1 = podmanTest.Podman([]string{"container", "create", ALPINE}) 206 session1.WaitWithDefaultTimeout() 207 Expect(session1).Should(ExitCleanly()) 208 cid3 := session1.OutputToString() 209 shortCid3 := cid3[0:5] 210 211 session1 = podmanTest.Podman([]string{"container", "create", "--label", "test=with,comma", ALPINE}) 212 session1.WaitWithDefaultTimeout() 213 Expect(session1).Should(ExitCleanly()) 214 cid4 := session1.OutputToString() 215 216 session1 = podmanTest.Podman([]string{"start", cid1, "-f", "status=running"}) 217 session1.WaitWithDefaultTimeout() 218 Expect(session1).Should(ExitCleanly()) 219 Expect(session1.OutputToString()).To(BeEmpty()) 220 221 session1 = podmanTest.Podman([]string{"start", "--all", "--filter", fmt.Sprintf("id=%swrongid", shortCid3)}) 222 session1.WaitWithDefaultTimeout() 223 Expect(session1).Should(ExitCleanly()) 224 Expect(session1.OutputToString()).To(BeEmpty()) 225 226 session1 = podmanTest.Podman([]string{"start", "--all", "--filter", fmt.Sprintf("id=%s", shortCid3)}) 227 session1.WaitWithDefaultTimeout() 228 Expect(session1).Should(ExitCleanly()) 229 Expect(session1.OutputToString()).To(BeEquivalentTo(cid3)) 230 231 session1 = podmanTest.Podman([]string{"start", "--all", "--filter", "label=test=with,comma"}) 232 session1.WaitWithDefaultTimeout() 233 Expect(session1).Should(ExitCleanly()) 234 Expect(session1.OutputToString()).To(BeEquivalentTo(cid4)) 235 236 session1 = podmanTest.Podman([]string{"start", "-f", fmt.Sprintf("id=%s", cid2)}) 237 session1.WaitWithDefaultTimeout() 238 Expect(session1).Should(ExitCleanly()) 239 Expect(session1.OutputToString()).To(BeEquivalentTo(cid2)) 240 }) 241 242 It("podman start container does not set HOME to home of caller", func() { 243 home, err := os.UserHomeDir() 244 Expect(err).ToNot(HaveOccurred()) 245 session := podmanTest.Podman([]string{"create", "--userns", "keep-id", "--user", "bin:bin", "--volume", fmt.Sprintf("%s:%s:ro", home, home), ALPINE, "ls"}) 246 session.WaitWithDefaultTimeout() 247 Expect(session).Should(ExitCleanly()) 248 cid := session.OutputToString() 249 250 session = podmanTest.Podman([]string{"start", cid}) 251 session.WaitWithDefaultTimeout() 252 Expect(session).Should(ExitCleanly()) 253 254 session = podmanTest.Podman([]string{"inspect", cid, "--format", "{{.Config.Env}}"}) 255 session.WaitWithDefaultTimeout() 256 Expect(session).Should(ExitCleanly()) 257 env := session.OutputToString() 258 Expect(env).To(ContainSubstring("HOME")) 259 Expect(env).ToNot(ContainSubstring(fmt.Sprintf("HOME=%s", home))) 260 261 session = podmanTest.Podman([]string{"restart", "-t", "-1", cid}) 262 session.WaitWithDefaultTimeout() 263 Expect(session).Should(ExitCleanly()) 264 265 session = podmanTest.Podman([]string{"inspect", cid, "--format", "{{.Config.Env}}"}) 266 session.WaitWithDefaultTimeout() 267 Expect(session).Should(ExitCleanly()) 268 env = session.OutputToString() 269 Expect(env).To(ContainSubstring("HOME")) 270 Expect(env).ToNot(ContainSubstring(fmt.Sprintf("HOME=%s", home))) 271 }) 272 273 It("podman start container sets HOME to home of execUser", func() { 274 session := podmanTest.Podman([]string{"create", "--userns", "keep-id", "--user", "bin:bin", ALPINE, "ls"}) 275 session.WaitWithDefaultTimeout() 276 Expect(session).Should(ExitCleanly()) 277 cid := session.OutputToString() 278 279 session = podmanTest.Podman([]string{"start", cid}) 280 session.WaitWithDefaultTimeout() 281 Expect(session).Should(ExitCleanly()) 282 283 session = podmanTest.Podman([]string{"inspect", cid, "--format", "{{.Config.Env}}"}) 284 session.WaitWithDefaultTimeout() 285 Expect(session).Should(ExitCleanly()) 286 env := session.OutputToString() 287 Expect(env).To(ContainSubstring("HOME=/bin")) 288 289 session = podmanTest.Podman([]string{"restart", cid}) 290 session.WaitWithDefaultTimeout() 291 Expect(session).Should(ExitCleanly()) 292 293 session = podmanTest.Podman([]string{"inspect", cid, "--format", "{{.Config.Env}}"}) 294 session.WaitWithDefaultTimeout() 295 Expect(session).Should(ExitCleanly()) 296 env = session.OutputToString() 297 Expect(env).To(ContainSubstring("HOME=/bin")) 298 }) 299 300 It("podman start container retains the HOME env if present", func() { 301 session := podmanTest.Podman([]string{"create", "--userns", "keep-id", "--user", "bin:bin", "--env=HOME=/env/is/respected", ALPINE, "ls"}) 302 session.WaitWithDefaultTimeout() 303 Expect(session).Should(ExitCleanly()) 304 cid := session.OutputToString() 305 306 session = podmanTest.Podman([]string{"start", cid}) 307 session.WaitWithDefaultTimeout() 308 Expect(session).Should(ExitCleanly()) 309 310 session = podmanTest.Podman([]string{"inspect", cid, "--format", "{{.Config.Env}}"}) 311 session.WaitWithDefaultTimeout() 312 Expect(session).Should(ExitCleanly()) 313 env := session.OutputToString() 314 Expect(env).To(ContainSubstring("HOME=/env/is/respected")) 315 316 session = podmanTest.Podman([]string{"restart", cid}) 317 session.WaitWithDefaultTimeout() 318 Expect(session).Should(ExitCleanly()) 319 320 session = podmanTest.Podman([]string{"inspect", cid, "--format", "{{.Config.Env}}"}) 321 session.WaitWithDefaultTimeout() 322 Expect(session).Should(ExitCleanly()) 323 env = session.OutputToString() 324 Expect(env).To(ContainSubstring("HOME=/env/is/respected")) 325 }) 326 })