github.com/dinever/docker@v1.11.1/integration-cli/docker_cli_restart_test.go (about) 1 package main 2 3 import ( 4 "os" 5 "strconv" 6 "strings" 7 "time" 8 9 "github.com/docker/docker/pkg/integration/checker" 10 "github.com/go-check/check" 11 ) 12 13 func (s *DockerSuite) TestRestartStoppedContainer(c *check.C) { 14 dockerCmd(c, "run", "--name=test", "busybox", "echo", "foobar") 15 cleanedContainerID, err := getIDByName("test") 16 c.Assert(err, check.IsNil) 17 18 out, _ := dockerCmd(c, "logs", cleanedContainerID) 19 c.Assert(out, checker.Equals, "foobar\n") 20 21 dockerCmd(c, "restart", cleanedContainerID) 22 23 // Wait until the container has stopped 24 err = waitInspect(cleanedContainerID, "{{.State.Running}}", "false", 20*time.Second) 25 c.Assert(err, checker.IsNil) 26 27 out, _ = dockerCmd(c, "logs", cleanedContainerID) 28 c.Assert(out, checker.Equals, "foobar\nfoobar\n") 29 } 30 31 func (s *DockerSuite) TestRestartRunningContainer(c *check.C) { 32 out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", "echo foobar && sleep 30 && echo 'should not print this'") 33 34 cleanedContainerID := strings.TrimSpace(out) 35 36 c.Assert(waitRun(cleanedContainerID), checker.IsNil) 37 38 out, _ = dockerCmd(c, "logs", cleanedContainerID) 39 c.Assert(out, checker.Equals, "foobar\n") 40 41 dockerCmd(c, "restart", "-t", "1", cleanedContainerID) 42 43 out, _ = dockerCmd(c, "logs", cleanedContainerID) 44 45 c.Assert(waitRun(cleanedContainerID), checker.IsNil) 46 47 c.Assert(out, checker.Equals, "foobar\nfoobar\n") 48 } 49 50 // Test that restarting a container with a volume does not create a new volume on restart. Regression test for #819. 51 func (s *DockerSuite) TestRestartWithVolumes(c *check.C) { 52 prefix, slash := getPrefixAndSlashFromDaemonPlatform() 53 out, _ := runSleepingContainer(c, "-d", "-v", prefix+slash+"test") 54 55 cleanedContainerID := strings.TrimSpace(out) 56 out, err := inspectFilter(cleanedContainerID, "len .Mounts") 57 c.Assert(err, check.IsNil, check.Commentf("failed to inspect %s: %s", cleanedContainerID, out)) 58 out = strings.Trim(out, " \n\r") 59 c.Assert(out, checker.Equals, "1") 60 61 source, err := inspectMountSourceField(cleanedContainerID, prefix+slash+"test") 62 c.Assert(err, checker.IsNil) 63 64 dockerCmd(c, "restart", cleanedContainerID) 65 66 out, err = inspectFilter(cleanedContainerID, "len .Mounts") 67 c.Assert(err, check.IsNil, check.Commentf("failed to inspect %s: %s", cleanedContainerID, out)) 68 out = strings.Trim(out, " \n\r") 69 c.Assert(out, checker.Equals, "1") 70 71 sourceAfterRestart, err := inspectMountSourceField(cleanedContainerID, prefix+slash+"test") 72 c.Assert(err, checker.IsNil) 73 c.Assert(source, checker.Equals, sourceAfterRestart) 74 } 75 76 func (s *DockerSuite) TestRestartPolicyNO(c *check.C) { 77 out, _ := dockerCmd(c, "run", "-d", "--restart=no", "busybox", "false") 78 79 id := strings.TrimSpace(string(out)) 80 name := inspectField(c, id, "HostConfig.RestartPolicy.Name") 81 c.Assert(name, checker.Equals, "no") 82 } 83 84 func (s *DockerSuite) TestRestartPolicyAlways(c *check.C) { 85 out, _ := dockerCmd(c, "run", "-d", "--restart=always", "busybox", "false") 86 87 id := strings.TrimSpace(string(out)) 88 name := inspectField(c, id, "HostConfig.RestartPolicy.Name") 89 c.Assert(name, checker.Equals, "always") 90 91 MaximumRetryCount := inspectField(c, id, "HostConfig.RestartPolicy.MaximumRetryCount") 92 93 // MaximumRetryCount=0 if the restart policy is always 94 c.Assert(MaximumRetryCount, checker.Equals, "0") 95 } 96 97 func (s *DockerSuite) TestRestartPolicyOnFailure(c *check.C) { 98 out, _ := dockerCmd(c, "run", "-d", "--restart=on-failure:1", "busybox", "false") 99 100 id := strings.TrimSpace(string(out)) 101 name := inspectField(c, id, "HostConfig.RestartPolicy.Name") 102 c.Assert(name, checker.Equals, "on-failure") 103 104 } 105 106 // a good container with --restart=on-failure:3 107 // MaximumRetryCount!=0; RestartCount=0 108 func (s *DockerSuite) TestRestartContainerwithGoodContainer(c *check.C) { 109 out, _ := dockerCmd(c, "run", "-d", "--restart=on-failure:3", "busybox", "true") 110 111 id := strings.TrimSpace(string(out)) 112 err := waitInspect(id, "{{ .State.Restarting }} {{ .State.Running }}", "false false", 30*time.Second) 113 c.Assert(err, checker.IsNil) 114 115 count := inspectField(c, id, "RestartCount") 116 c.Assert(count, checker.Equals, "0") 117 118 MaximumRetryCount := inspectField(c, id, "HostConfig.RestartPolicy.MaximumRetryCount") 119 c.Assert(MaximumRetryCount, checker.Equals, "3") 120 121 } 122 123 func (s *DockerSuite) TestRestartContainerSuccess(c *check.C) { 124 testRequires(c, SameHostDaemon) 125 126 out, _ := runSleepingContainer(c, "-d", "--restart=always") 127 id := strings.TrimSpace(out) 128 c.Assert(waitRun(id), check.IsNil) 129 130 pidStr := inspectField(c, id, "State.Pid") 131 132 pid, err := strconv.Atoi(pidStr) 133 c.Assert(err, check.IsNil) 134 135 p, err := os.FindProcess(pid) 136 c.Assert(err, check.IsNil) 137 c.Assert(p, check.NotNil) 138 139 err = p.Kill() 140 c.Assert(err, check.IsNil) 141 142 err = waitInspect(id, "{{.RestartCount}}", "1", 30*time.Second) 143 c.Assert(err, check.IsNil) 144 145 err = waitInspect(id, "{{.State.Status}}", "running", 30*time.Second) 146 c.Assert(err, check.IsNil) 147 } 148 149 func (s *DockerSuite) TestRestartWithPolicyUserDefinedNetwork(c *check.C) { 150 // TODO Windows. This may be portable following HNS integration post TP5. 151 testRequires(c, DaemonIsLinux, SameHostDaemon, NotUserNamespace, NotArm) 152 dockerCmd(c, "network", "create", "-d", "bridge", "udNet") 153 154 dockerCmd(c, "run", "-d", "--net=udNet", "--name=first", "busybox", "top") 155 c.Assert(waitRun("first"), check.IsNil) 156 157 dockerCmd(c, "run", "-d", "--restart=always", "--net=udNet", "--name=second", 158 "--link=first:foo", "busybox", "top") 159 c.Assert(waitRun("second"), check.IsNil) 160 161 // ping to first and its alias foo must succeed 162 _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") 163 c.Assert(err, check.IsNil) 164 _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo") 165 c.Assert(err, check.IsNil) 166 167 // Now kill the second container and let the restart policy kick in 168 pidStr := inspectField(c, "second", "State.Pid") 169 170 pid, err := strconv.Atoi(pidStr) 171 c.Assert(err, check.IsNil) 172 173 p, err := os.FindProcess(pid) 174 c.Assert(err, check.IsNil) 175 c.Assert(p, check.NotNil) 176 177 err = p.Kill() 178 c.Assert(err, check.IsNil) 179 180 err = waitInspect("second", "{{.RestartCount}}", "1", 5*time.Second) 181 c.Assert(err, check.IsNil) 182 183 err = waitInspect("second", "{{.State.Status}}", "running", 5*time.Second) 184 185 // ping to first and its alias foo must still succeed 186 _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") 187 c.Assert(err, check.IsNil) 188 _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo") 189 c.Assert(err, check.IsNil) 190 } 191 192 func (s *DockerSuite) TestRestartPolicyAfterRestart(c *check.C) { 193 testRequires(c, SameHostDaemon) 194 195 out, _ := runSleepingContainer(c, "-d", "--restart=always") 196 id := strings.TrimSpace(out) 197 c.Assert(waitRun(id), check.IsNil) 198 199 dockerCmd(c, "restart", id) 200 201 c.Assert(waitRun(id), check.IsNil) 202 203 pidStr := inspectField(c, id, "State.Pid") 204 205 pid, err := strconv.Atoi(pidStr) 206 c.Assert(err, check.IsNil) 207 208 p, err := os.FindProcess(pid) 209 c.Assert(err, check.IsNil) 210 c.Assert(p, check.NotNil) 211 212 err = p.Kill() 213 c.Assert(err, check.IsNil) 214 215 err = waitInspect(id, "{{.RestartCount}}", "1", 30*time.Second) 216 c.Assert(err, check.IsNil) 217 218 err = waitInspect(id, "{{.State.Status}}", "running", 30*time.Second) 219 c.Assert(err, check.IsNil) 220 } 221 222 func (s *DockerSuite) TestRestartContainerwithRestartPolicy(c *check.C) { 223 out1, _ := dockerCmd(c, "run", "-d", "--restart=on-failure:3", "busybox", "false") 224 out2, _ := dockerCmd(c, "run", "-d", "--restart=always", "busybox", "false") 225 226 id1 := strings.TrimSpace(string(out1)) 227 id2 := strings.TrimSpace(string(out2)) 228 err := waitInspect(id1, "{{ .State.Restarting }} {{ .State.Running }}", "false false", 30*time.Second) 229 c.Assert(err, checker.IsNil) 230 231 // TODO: fix racey problem during restart: 232 // https://jenkins.dockerproject.org/job/Docker-PRs-Win2Lin/24665/console 233 // Error response from daemon: Cannot restart container 6655f620d90b390527db23c0a15b3e46d86a58ecec20a5697ab228d860174251: remove /var/run/docker/libcontainerd/6655f620d90b390527db23c0a15b3e46d86a58ecec20a5697ab228d860174251/rootfs: device or resource busy 234 if _, _, err := dockerCmdWithError("restart", id1); err != nil { 235 // if restart met racey problem, try again 236 time.Sleep(500 * time.Millisecond) 237 dockerCmd(c, "restart", id1) 238 } 239 if _, _, err := dockerCmdWithError("restart", id2); err != nil { 240 // if restart met racey problem, try again 241 time.Sleep(500 * time.Millisecond) 242 dockerCmd(c, "restart", id2) 243 } 244 245 dockerCmd(c, "stop", id1) 246 dockerCmd(c, "stop", id2) 247 dockerCmd(c, "start", id1) 248 dockerCmd(c, "start", id2) 249 }