github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/test/e2e/create_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 8 . "github.com/containers/libpod/test/utils" 9 . "github.com/onsi/ginkgo" 10 . "github.com/onsi/gomega" 11 ) 12 13 var _ = Describe("Podman create", 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 create container based on a local image", func() { 38 session := podmanTest.Podman([]string{"create", ALPINE, "ls"}) 39 session.WaitWithDefaultTimeout() 40 cid := session.OutputToString() 41 Expect(session.ExitCode()).To(Equal(0)) 42 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 43 44 check := podmanTest.Podman([]string{"inspect", "-l"}) 45 check.WaitWithDefaultTimeout() 46 data := check.InspectContainerToJSON() 47 Expect(data[0].ID).To(ContainSubstring(cid)) 48 }) 49 50 It("podman create container based on a remote image", func() { 51 session := podmanTest.Podman([]string{"create", BB_GLIBC, "ls"}) 52 session.WaitWithDefaultTimeout() 53 Expect(session.ExitCode()).To(Equal(0)) 54 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 55 }) 56 57 It("podman container create container based on a remote image", func() { 58 session := podmanTest.Podman([]string{"container", "create", BB_GLIBC, "ls"}) 59 session.WaitWithDefaultTimeout() 60 Expect(session.ExitCode()).To(Equal(0)) 61 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 62 }) 63 64 It("podman create using short options", func() { 65 session := podmanTest.Podman([]string{"create", ALPINE, "ls"}) 66 session.WaitWithDefaultTimeout() 67 Expect(session.ExitCode()).To(Equal(0)) 68 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 69 }) 70 71 It("podman create using existing name", func() { 72 session := podmanTest.Podman([]string{"create", "--name=foo", ALPINE, "ls"}) 73 session.WaitWithDefaultTimeout() 74 Expect(session.ExitCode()).To(Equal(0)) 75 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 76 77 session = podmanTest.Podman([]string{"create", "--name=foo", ALPINE, "ls"}) 78 session.WaitWithDefaultTimeout() 79 Expect(session.ExitCode()).To(Equal(125)) 80 }) 81 82 It("podman create adds annotation", func() { 83 session := podmanTest.Podman([]string{"create", "--annotation", "HELLO=WORLD", ALPINE, "ls"}) 84 session.WaitWithDefaultTimeout() 85 Expect(session.ExitCode()).To(Equal(0)) 86 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 87 88 check := podmanTest.Podman([]string{"inspect", "-l"}) 89 check.WaitWithDefaultTimeout() 90 data := check.InspectContainerToJSON() 91 value, ok := data[0].Config.Annotations["HELLO"] 92 Expect(ok).To(BeTrue()) 93 Expect(value).To(Equal("WORLD")) 94 }) 95 96 It("podman create --entrypoint command", func() { 97 session := podmanTest.Podman([]string{"create", "--entrypoint", "/bin/foobar", ALPINE}) 98 session.WaitWithDefaultTimeout() 99 Expect(session.ExitCode()).To(Equal(0)) 100 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 101 102 result := podmanTest.Podman([]string{"inspect", "-l", "--format", "{{.Config.Entrypoint}}"}) 103 result.WaitWithDefaultTimeout() 104 Expect(result.ExitCode()).To(Equal(0)) 105 Expect(result.OutputToString()).To(Equal("/bin/foobar")) 106 }) 107 108 It("podman create --entrypoint \"\"", func() { 109 session := podmanTest.Podman([]string{"create", "--entrypoint", "", ALPINE, "ls"}) 110 session.WaitWithDefaultTimeout() 111 Expect(session.ExitCode()).To(Equal(0)) 112 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 113 114 result := podmanTest.Podman([]string{"inspect", "-l", "--format", "{{.Config.Entrypoint}}"}) 115 result.WaitWithDefaultTimeout() 116 Expect(result.ExitCode()).To(Equal(0)) 117 Expect(result.OutputToString()).To(Equal("")) 118 }) 119 120 It("podman create --entrypoint json", func() { 121 jsonString := `[ "/bin/foo", "-c"]` 122 session := podmanTest.Podman([]string{"create", "--entrypoint", jsonString, ALPINE}) 123 session.WaitWithDefaultTimeout() 124 Expect(session.ExitCode()).To(Equal(0)) 125 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 126 127 result := podmanTest.Podman([]string{"inspect", "-l", "--format", "{{.Config.Entrypoint}}"}) 128 result.WaitWithDefaultTimeout() 129 Expect(result.ExitCode()).To(Equal(0)) 130 Expect(result.OutputToString()).To(Equal("/bin/foo -c")) 131 }) 132 133 It("podman create --mount flag with multiple mounts", func() { 134 vol1 := filepath.Join(podmanTest.TempDir, "vol-test1") 135 err := os.MkdirAll(vol1, 0755) 136 Expect(err).To(BeNil()) 137 vol2 := filepath.Join(podmanTest.TempDir, "vol-test2") 138 err = os.MkdirAll(vol2, 0755) 139 Expect(err).To(BeNil()) 140 141 session := podmanTest.Podman([]string{"create", "--name", "test", "--mount", "type=bind,src=" + vol1 + ",target=/myvol1,z", "--mount", "type=bind,src=" + vol2 + ",target=/myvol2,z", ALPINE, "touch", "/myvol2/foo.txt"}) 142 session.WaitWithDefaultTimeout() 143 Expect(session.ExitCode()).To(Equal(0)) 144 145 session = podmanTest.Podman([]string{"start", "test"}) 146 session.WaitWithDefaultTimeout() 147 Expect(session.ExitCode()).To(Equal(0)) 148 149 session = podmanTest.Podman([]string{"logs", "test"}) 150 session.WaitWithDefaultTimeout() 151 Expect(session.ExitCode()).To(Equal(0)) 152 Expect(session.OutputToString()).ToNot(ContainSubstring("cannot touch")) 153 }) 154 155 It("podman create with --mount flag", func() { 156 if podmanTest.Host.Arch == "ppc64le" { 157 Skip("skip failing test on ppc64le") 158 } 159 mountPath := filepath.Join(podmanTest.TempDir, "secrets") 160 os.Mkdir(mountPath, 0755) 161 session := podmanTest.Podman([]string{"create", "--name", "test", "--mount", fmt.Sprintf("type=bind,src=%s,target=/create/test", mountPath), ALPINE, "grep", "/create/test", "/proc/self/mountinfo"}) 162 session.WaitWithDefaultTimeout() 163 Expect(session.ExitCode()).To(Equal(0)) 164 session = podmanTest.Podman([]string{"start", "test"}) 165 session.WaitWithDefaultTimeout() 166 Expect(session.ExitCode()).To(Equal(0)) 167 session = podmanTest.Podman([]string{"logs", "test"}) 168 session.WaitWithDefaultTimeout() 169 Expect(session.ExitCode()).To(Equal(0)) 170 Expect(session.OutputToString()).To(ContainSubstring("/create/test rw")) 171 172 session = podmanTest.Podman([]string{"create", "--name", "test_ro", "--mount", fmt.Sprintf("type=bind,src=%s,target=/create/test,ro", mountPath), ALPINE, "grep", "/create/test", "/proc/self/mountinfo"}) 173 session.WaitWithDefaultTimeout() 174 Expect(session.ExitCode()).To(Equal(0)) 175 session = podmanTest.Podman([]string{"start", "test_ro"}) 176 session.WaitWithDefaultTimeout() 177 Expect(session.ExitCode()).To(Equal(0)) 178 session = podmanTest.Podman([]string{"logs", "test_ro"}) 179 session.WaitWithDefaultTimeout() 180 Expect(session.ExitCode()).To(Equal(0)) 181 Expect(session.OutputToString()).To(ContainSubstring("/create/test ro")) 182 183 session = podmanTest.Podman([]string{"create", "--name", "test_shared", "--mount", fmt.Sprintf("type=bind,src=%s,target=/create/test,shared", mountPath), ALPINE, "grep", "/create/test", "/proc/self/mountinfo"}) 184 session.WaitWithDefaultTimeout() 185 Expect(session.ExitCode()).To(Equal(0)) 186 session = podmanTest.Podman([]string{"start", "test_shared"}) 187 session.WaitWithDefaultTimeout() 188 Expect(session.ExitCode()).To(Equal(0)) 189 session = podmanTest.Podman([]string{"logs", "test_shared"}) 190 session.WaitWithDefaultTimeout() 191 Expect(session.ExitCode()).To(Equal(0)) 192 found, matches := session.GrepString("/create/test") 193 Expect(found).Should(BeTrue()) 194 Expect(matches[0]).To(ContainSubstring("rw")) 195 Expect(matches[0]).To(ContainSubstring("shared")) 196 197 mountPath = filepath.Join(podmanTest.TempDir, "scratchpad") 198 os.Mkdir(mountPath, 0755) 199 session = podmanTest.Podman([]string{"create", "--name", "test_tmpfs", "--mount", "type=tmpfs,target=/create/test", ALPINE, "grep", "/create/test", "/proc/self/mountinfo"}) 200 session.WaitWithDefaultTimeout() 201 Expect(session.ExitCode()).To(Equal(0)) 202 session = podmanTest.Podman([]string{"start", "test_tmpfs"}) 203 session.WaitWithDefaultTimeout() 204 Expect(session.ExitCode()).To(Equal(0)) 205 session = podmanTest.Podman([]string{"logs", "test_tmpfs"}) 206 session.WaitWithDefaultTimeout() 207 Expect(session.ExitCode()).To(Equal(0)) 208 Expect(session.OutputToString()).To(ContainSubstring("/create/test rw,nosuid,nodev,relatime - tmpfs")) 209 }) 210 211 It("podman create --pod automatically", func() { 212 session := podmanTest.Podman([]string{"create", "--pod", "new:foobar", ALPINE, "ls"}) 213 session.WaitWithDefaultTimeout() 214 Expect(session.ExitCode()).To(Equal(0)) 215 216 check := podmanTest.Podman([]string{"pod", "ps", "--no-trunc"}) 217 check.WaitWithDefaultTimeout() 218 match, _ := check.GrepString("foobar") 219 Expect(match).To(BeTrue()) 220 }) 221 222 It("podman run entrypoint and cmd test", func() { 223 name := "test101" 224 create := podmanTest.Podman([]string{"create", "--name", name, redis}) 225 create.WaitWithDefaultTimeout() 226 Expect(create.ExitCode()).To(Equal(0)) 227 228 ctrJSON := podmanTest.InspectContainer(name) 229 Expect(len(ctrJSON)).To(Equal(1)) 230 Expect(len(ctrJSON[0].Config.Cmd)).To(Equal(1)) 231 Expect(ctrJSON[0].Config.Cmd[0]).To(Equal("redis-server")) 232 Expect(ctrJSON[0].Config.Entrypoint).To(Equal("docker-entrypoint.sh")) 233 }) 234 235 It("podman create --pull", func() { 236 session := podmanTest.PodmanNoCache([]string{"create", "--pull", "never", "--name=foo", "nginx"}) 237 session.WaitWithDefaultTimeout() 238 Expect(session).To(ExitWithError()) 239 240 session = podmanTest.PodmanNoCache([]string{"create", "--pull", "always", "--name=foo", "nginx"}) 241 session.WaitWithDefaultTimeout() 242 Expect(session.ExitCode()).To(Equal(0)) 243 }) 244 245 It("podman create using image list by tag", func() { 246 session := podmanTest.PodmanNoCache([]string{"create", "--pull=always", "--override-arch=arm64", "--name=foo", ALPINELISTTAG}) 247 session.WaitWithDefaultTimeout() 248 Expect(session.ExitCode()).To((Equal(0))) 249 session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.Image}}", "foo"}) 250 session.WaitWithDefaultTimeout() 251 Expect(session.ExitCode()).To((Equal(0))) 252 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID)) 253 session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.ImageName}}", "foo"}) 254 session.WaitWithDefaultTimeout() 255 Expect(session.ExitCode()).To((Equal(0))) 256 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINELISTTAG)) 257 }) 258 259 It("podman create using image list by digest", func() { 260 session := podmanTest.PodmanNoCache([]string{"create", "--pull=always", "--override-arch=arm64", "--name=foo", ALPINELISTDIGEST}) 261 session.WaitWithDefaultTimeout() 262 Expect(session.ExitCode()).To((Equal(0))) 263 session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.Image}}", "foo"}) 264 session.WaitWithDefaultTimeout() 265 Expect(session.ExitCode()).To((Equal(0))) 266 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID)) 267 session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.ImageName}}", "foo"}) 268 session.WaitWithDefaultTimeout() 269 Expect(session.ExitCode()).To((Equal(0))) 270 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINELISTDIGEST)) 271 }) 272 273 It("podman create using image list instance by digest", func() { 274 session := podmanTest.PodmanNoCache([]string{"create", "--pull=always", "--override-arch=arm64", "--name=foo", ALPINEARM64DIGEST}) 275 session.WaitWithDefaultTimeout() 276 Expect(session.ExitCode()).To((Equal(0))) 277 session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.Image}}", "foo"}) 278 session.WaitWithDefaultTimeout() 279 Expect(session.ExitCode()).To((Equal(0))) 280 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID)) 281 session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.ImageName}}", "foo"}) 282 session.WaitWithDefaultTimeout() 283 Expect(session.ExitCode()).To((Equal(0))) 284 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64DIGEST)) 285 }) 286 287 It("podman create using cross-arch image list instance by digest", func() { 288 session := podmanTest.PodmanNoCache([]string{"create", "--pull=always", "--override-arch=arm64", "--name=foo", ALPINEARM64DIGEST}) 289 session.WaitWithDefaultTimeout() 290 Expect(session.ExitCode()).To((Equal(0))) 291 session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.Image}}", "foo"}) 292 session.WaitWithDefaultTimeout() 293 Expect(session.ExitCode()).To((Equal(0))) 294 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID)) 295 session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.ImageName}}", "foo"}) 296 session.WaitWithDefaultTimeout() 297 Expect(session.ExitCode()).To((Equal(0))) 298 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64DIGEST)) 299 }) 300 301 It("podman create --authfile with nonexist authfile", func() { 302 SkipIfRemote() 303 session := podmanTest.PodmanNoCache([]string{"create", "--authfile", "/tmp/nonexist", "--name=foo", ALPINE}) 304 session.WaitWithDefaultTimeout() 305 Expect(session).To(Not(Equal(0))) 306 }) 307 308 It("podman create with unset label", func() { 309 // Alpine is assumed to have no labels here, which seems safe 310 ctrName := "testctr" 311 session := podmanTest.Podman([]string{"create", "--label", "TESTKEY1=", "--label", "TESTKEY2", "--name", ctrName, ALPINE, "top"}) 312 session.WaitWithDefaultTimeout() 313 Expect(session.ExitCode()).To(Equal(0)) 314 315 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 316 inspect.WaitWithDefaultTimeout() 317 data := inspect.InspectContainerToJSON() 318 Expect(len(data)).To(Equal(1)) 319 Expect(len(data[0].Config.Labels)).To(Equal(2)) 320 _, ok1 := data[0].Config.Labels["TESTKEY1"] 321 Expect(ok1).To(BeTrue()) 322 _, ok2 := data[0].Config.Labels["TESTKEY2"] 323 Expect(ok2).To(BeTrue()) 324 }) 325 326 It("podman create with set label", func() { 327 // Alpine is assumed to have no labels here, which seems safe 328 ctrName := "testctr" 329 session := podmanTest.Podman([]string{"create", "--label", "TESTKEY1=value1", "--label", "TESTKEY2=bar", "--name", ctrName, ALPINE, "top"}) 330 session.WaitWithDefaultTimeout() 331 Expect(session.ExitCode()).To(Equal(0)) 332 333 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 334 inspect.WaitWithDefaultTimeout() 335 data := inspect.InspectContainerToJSON() 336 Expect(len(data)).To(Equal(1)) 337 Expect(len(data[0].Config.Labels)).To(Equal(2)) 338 val1, ok1 := data[0].Config.Labels["TESTKEY1"] 339 Expect(ok1).To(BeTrue()) 340 Expect(val1).To(Equal("value1")) 341 val2, ok2 := data[0].Config.Labels["TESTKEY2"] 342 Expect(ok2).To(BeTrue()) 343 Expect(val2).To(Equal("bar")) 344 }) 345 })