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  })