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