Browse code

Fixed a bug preventing proper reattachment to stdin upon container restart

Andrea Luzzardi authored on 2013/02/14 12:05:57
Showing 2 changed files
... ...
@@ -355,6 +355,11 @@ func (container *Container) monitor() {
355 355
 		log.Printf("%v: Failed to umount filesystem: %v", container.Id, err)
356 356
 	}
357 357
 
358
+	// Re-create a brand new stdin pipe once the container exited
359
+	if container.Config.OpenStdin {
360
+		container.stdin, container.stdinPipe = io.Pipe()
361
+	}
362
+
358 363
 	// Report status back
359 364
 	container.State.setStopped(exitCode)
360 365
 	container.save()
... ...
@@ -221,6 +221,55 @@ func TestRestart(t *testing.T) {
221 221
 	}
222 222
 }
223 223
 
224
+func TestRestartStdin(t *testing.T) {
225
+	docker, err := newTestDocker()
226
+	if err != nil {
227
+		t.Fatal(err)
228
+	}
229
+	container, err := docker.Create(
230
+		"restart_stdin_test",
231
+		"cat",
232
+		[]string{},
233
+		[]string{"/var/lib/docker/images/ubuntu"},
234
+		&Config{
235
+			OpenStdin: true,
236
+		},
237
+	)
238
+	if err != nil {
239
+		t.Fatal(err)
240
+	}
241
+	defer docker.Destroy(container)
242
+
243
+	stdin, err := container.StdinPipe()
244
+	stdout, err := container.StdoutPipe()
245
+	if err := container.Start(); err != nil {
246
+		t.Fatal(err)
247
+	}
248
+	io.WriteString(stdin, "hello world")
249
+	stdin.Close()
250
+	container.Wait()
251
+	output, err := ioutil.ReadAll(stdout)
252
+	stdout.Close()
253
+	if string(output) != "hello world" {
254
+		t.Fatal(string(output))
255
+	}
256
+
257
+	// Restart and try again
258
+	stdin, err = container.StdinPipe()
259
+	stdout, err = container.StdoutPipe()
260
+	if err := container.Start(); err != nil {
261
+		t.Fatal(err)
262
+	}
263
+	io.WriteString(stdin, "hello world #2")
264
+	stdin.Close()
265
+	container.Wait()
266
+	output, err = ioutil.ReadAll(stdout)
267
+	stdout.Close()
268
+	if string(output) != "hello world #2" {
269
+		t.Fatal(string(output))
270
+	}
271
+}
272
+
224 273
 func TestUser(t *testing.T) {
225 274
 	docker, err := newTestDocker()
226 275
 	if err != nil {