浏览代码

Allow docker build from stdin

Guillaume J. Charmes 12 年之前
父节点
当前提交
33ea1483d5
共有 1 个文件被更改,包括 23 次插入12 次删除
  1. 23 12
      commands.go

+ 23 - 12
commands.go

@@ -131,12 +131,16 @@ func (cli *DockerCli) CmdInsert(args ...string) error {
 }
 }
 
 
 func (cli *DockerCli) CmdBuild(args ...string) error {
 func (cli *DockerCli) CmdBuild(args ...string) error {
-	cmd := Subcmd("build", "[CONTEXT]", "Build an image from a Dockerfile")
+	cmd := Subcmd("build", "[CONTEXT|-]", "Build an image from a Dockerfile")
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
 
 
-	var multipartBody io.Reader
+	var (
+		multipartBody io.Reader
+		file          io.ReadCloser
+		contextPath   string
+	)
 
 
 	// Init the needed component for the Multipart
 	// Init the needed component for the Multipart
 	buff := bytes.NewBuffer([]byte{})
 	buff := bytes.NewBuffer([]byte{})
@@ -146,16 +150,23 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 
 
 	dockerfile := "Dockerfile"
 	dockerfile := "Dockerfile"
 
 
-	if cmd.Arg(0) != "" {
+	if cmd.Arg(0) != "" && cmd.Arg(0) != "-" {
+		contextPath = cmd.Arg(0)
 		dockerfile = path.Join(cmd.Arg(0), dockerfile)
 		dockerfile = path.Join(cmd.Arg(0), dockerfile)
 	}
 	}
+	if cmd.Arg(0) != "-" {
+		f, err := os.Open(dockerfile)
+		if err != nil {
+			return err
+		}
+		defer f.Close()
+		file = f
+	} else {
+		contextPath = cmd.Arg(1)
+		file = os.Stdin
+	}
 
 
 	// Create a FormFile multipart for the Dockerfile
 	// Create a FormFile multipart for the Dockerfile
-	file, err := os.Open(dockerfile)
-	if err != nil {
-		return err
-	}
-	defer file.Close()
 	if wField, err := w.CreateFormFile("Dockerfile", "Dockerfile"); err != nil {
 	if wField, err := w.CreateFormFile("Dockerfile", "Dockerfile"); err != nil {
 		return err
 		return err
 	} else {
 	} else {
@@ -166,14 +177,14 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 	compression := Bzip2
 	compression := Bzip2
 
 
 	// Create a FormFile multipart for the context if needed
 	// Create a FormFile multipart for the context if needed
-	if cmd.Arg(0) != "" {
+	if contextPath != "" {
 		// FIXME: Use NewTempArchive in order to have the size and avoid too much memory usage?
 		// FIXME: Use NewTempArchive in order to have the size and avoid too much memory usage?
-		context, err := Tar(cmd.Arg(0), compression)
+		context, err := Tar(contextPath, compression)
 		if err != nil {
 		if err != nil {
 			return err
 			return err
 		}
 		}
 		// NOTE: Do this in case '.' or '..' is input
 		// NOTE: Do this in case '.' or '..' is input
-		absPath, err := filepath.Abs(cmd.Arg(0))
+		absPath, err := filepath.Abs(contextPath)
 		if err != nil {
 		if err != nil {
 			return err
 			return err
 		}
 		}
@@ -193,7 +204,7 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 		return err
 		return err
 	}
 	}
 	req.Header.Set("Content-Type", w.FormDataContentType())
 	req.Header.Set("Content-Type", w.FormDataContentType())
-	if cmd.Arg(0) != "" {
+	if contextPath != "" {
 		req.Header.Set("X-Docker-Context-Compression", compression.Flag())
 		req.Header.Set("X-Docker-Context-Compression", compression.Flag())
 		fmt.Println("Uploading Context...")
 		fmt.Println("Uploading Context...")
 	}
 	}