Browse Source

Merge pull request #874 from fsouza/fix-build-newline

- Builder: don't ignore last line in Dockerfile when it doesn't end with \n
Guillaume J. Charmes 12 năm trước cách đây
mục cha
commit
0e6ec57996
2 tập tin đã thay đổi với 59 bổ sung47 xóa
  1. 3 2
      buildfile.go
  2. 56 45
      buildfile_test.go

+ 3 - 2
buildfile.go

@@ -313,10 +313,11 @@ func (b *buildFile) Build(dockerfile, context io.Reader) (string, error) {
 	for {
 		line, err := file.ReadString('\n')
 		if err != nil {
-			if err == io.EOF {
+			if err == io.EOF && line == "" {
 				break
+			} else if err != io.EOF {
+				return "", err
 			}
-			return "", err
 		}
 		line = strings.Replace(strings.TrimSpace(line), "	", " ", 1)
 		// Skip comments and empty line

+ 56 - 45
buildfile_test.go

@@ -15,58 +15,69 @@ run    sh -c 'echo root:testpass > /tmp/passwd'
 run    mkdir -p /var/run/sshd
 `
 
+const DockerfileNoNewLine = `
+# VERSION		0.1
+# DOCKER-VERSION	0.2
+
+from   ` + unitTestImageName + `
+run    sh -c 'echo root:testpass > /tmp/passwd'
+run    mkdir -p /var/run/sshd`
+
 func TestBuild(t *testing.T) {
-	runtime, err := newTestRuntime()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer nuke(runtime)
+	dockerfiles := []string{Dockerfile, DockerfileNoNewLine}
+	for _, Dockerfile := range dockerfiles {
+		runtime, err := newTestRuntime()
+		if err != nil {
+			t.Fatal(err)
+		}
+		defer nuke(runtime)
 
-	srv := &Server{runtime: runtime}
+		srv := &Server{runtime: runtime}
 
-	buildfile := NewBuildFile(srv, &utils.NopWriter{})
+		buildfile := NewBuildFile(srv, &utils.NopWriter{})
 
-	imgID, err := buildfile.Build(strings.NewReader(Dockerfile), nil)
-	if err != nil {
-		t.Fatal(err)
-	}
+		imgID, err := buildfile.Build(strings.NewReader(Dockerfile), nil)
+		if err != nil {
+			t.Fatal(err)
+		}
 
-	builder := NewBuilder(runtime)
-	container, err := builder.Create(
-		&Config{
-			Image: imgID,
-			Cmd:   []string{"cat", "/tmp/passwd"},
-		},
-	)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer runtime.Destroy(container)
+		builder := NewBuilder(runtime)
+		container, err := builder.Create(
+			&Config{
+				Image: imgID,
+				Cmd:   []string{"cat", "/tmp/passwd"},
+			},
+		)
+		if err != nil {
+			t.Fatal(err)
+		}
+		defer runtime.Destroy(container)
 
-	output, err := container.Output()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(output) != "root:testpass\n" {
-		t.Fatalf("Unexpected output. Read '%s', expected '%s'", output, "root:testpass\n")
-	}
+		output, err := container.Output()
+		if err != nil {
+			t.Fatal(err)
+		}
+		if string(output) != "root:testpass\n" {
+			t.Fatalf("Unexpected output. Read '%s', expected '%s'", output, "root:testpass\n")
+		}
 
-	container2, err := builder.Create(
-		&Config{
-			Image: imgID,
-			Cmd:   []string{"ls", "-d", "/var/run/sshd"},
-		},
-	)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer runtime.Destroy(container2)
+		container2, err := builder.Create(
+			&Config{
+				Image: imgID,
+				Cmd:   []string{"ls", "-d", "/var/run/sshd"},
+			},
+		)
+		if err != nil {
+			t.Fatal(err)
+		}
+		defer runtime.Destroy(container2)
 
-	output, err = container2.Output()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(output) != "/var/run/sshd\n" {
-		t.Fatal("/var/run/sshd has not been created")
+		output, err = container2.Output()
+		if err != nil {
+			t.Fatal(err)
+		}
+		if string(output) != "/var/run/sshd\n" {
+			t.Fatal("/var/run/sshd has not been created")
+		}
 	}
 }