浏览代码

Remove job from commit

Signed-off-by: Antonio Murdaca <me@runcom.ninja>
Antonio Murdaca 10 年之前
父节点
当前提交
c8529fde5f
共有 4 个文件被更改,包括 46 次插入125 次删除
  1. 18 20
      api/server/server.go
  2. 27 16
      daemon/commit.go
  3. 0 1
      daemon/daemon.go
  4. 1 88
      integration/server_test.go

+ 18 - 20
api/server/server.go

@@ -618,39 +618,37 @@ func postCommit(eng *engine.Engine, version version.Version, w http.ResponseWrit
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
-	var (
-		config       engine.Env
-		job          = eng.Job("commit", r.Form.Get("container"))
-		stdoutBuffer = bytes.NewBuffer(nil)
-	)
 
 
 	if err := checkForJson(r); err != nil {
 	if err := checkForJson(r); err != nil {
 		return err
 		return err
 	}
 	}
 
 
-	if err := config.Decode(r.Body); err != nil {
-		logrus.Errorf("%s", err)
-	}
+	cont := r.Form.Get("container")
 
 
+	pause := toBool(r.Form.Get("pause"))
 	if r.FormValue("pause") == "" && version.GreaterThanOrEqualTo("1.13") {
 	if r.FormValue("pause") == "" && version.GreaterThanOrEqualTo("1.13") {
-		job.Setenv("pause", "1")
-	} else {
-		job.Setenv("pause", r.FormValue("pause"))
+		pause = true
 	}
 	}
 
 
-	job.Setenv("repo", r.Form.Get("repo"))
-	job.Setenv("tag", r.Form.Get("tag"))
-	job.Setenv("author", r.Form.Get("author"))
-	job.Setenv("comment", r.Form.Get("comment"))
-	job.SetenvList("changes", r.Form["changes"])
-	job.SetenvSubEnv("config", &config)
+	containerCommitConfig := &daemon.ContainerCommitConfig{
+		Pause:   pause,
+		Repo:    r.Form.Get("repo"),
+		Tag:     r.Form.Get("tag"),
+		Author:  r.Form.Get("author"),
+		Comment: r.Form.Get("comment"),
+		Changes: r.Form["changes"],
+		Config:  r.Body,
+	}
 
 
-	job.Stdout.Add(stdoutBuffer)
-	if err := job.Run(); err != nil {
+	d := getDaemon(eng)
+
+	imgID, err := d.ContainerCommit(cont, containerCommitConfig)
+	if err != nil {
 		return err
 		return err
 	}
 	}
+
 	return writeJSON(w, http.StatusCreated, &types.ContainerCommitResponse{
 	return writeJSON(w, http.StatusCreated, &types.ContainerCommitResponse{
-		ID: engine.Tail(stdoutBuffer, 1),
+		ID: imgID,
 	})
 	})
 }
 }
 
 

+ 27 - 16
daemon/commit.go

@@ -3,53 +3,64 @@ package daemon
 import (
 import (
 	"bytes"
 	"bytes"
 	"encoding/json"
 	"encoding/json"
-	"fmt"
+	"io"
 
 
+	"github.com/Sirupsen/logrus"
 	"github.com/docker/docker/engine"
 	"github.com/docker/docker/engine"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/runconfig"
 )
 )
 
 
-func (daemon *Daemon) ContainerCommit(job *engine.Job) error {
-	if len(job.Args) != 1 {
-		return fmt.Errorf("Not enough arguments. Usage: %s CONTAINER\n", job.Name)
-	}
-	name := job.Args[0]
+type ContainerCommitConfig struct {
+	Pause   bool
+	Repo    string
+	Tag     string
+	Author  string
+	Comment string
+	Changes []string
+	Config  io.ReadCloser
+}
 
 
+func (daemon *Daemon) ContainerCommit(name string, c *ContainerCommitConfig) (string, error) {
 	container, err := daemon.Get(name)
 	container, err := daemon.Get(name)
 	if err != nil {
 	if err != nil {
-		return err
+		return "", err
 	}
 	}
 
 
 	var (
 	var (
+		subenv       engine.Env
 		config       = container.Config
 		config       = container.Config
 		stdoutBuffer = bytes.NewBuffer(nil)
 		stdoutBuffer = bytes.NewBuffer(nil)
 		newConfig    runconfig.Config
 		newConfig    runconfig.Config
 	)
 	)
 
 
+	if err := subenv.Decode(c.Config); err != nil {
+		logrus.Errorf("%s", err)
+	}
+
 	buildConfigJob := daemon.eng.Job("build_config")
 	buildConfigJob := daemon.eng.Job("build_config")
 	buildConfigJob.Stdout.Add(stdoutBuffer)
 	buildConfigJob.Stdout.Add(stdoutBuffer)
-	buildConfigJob.Setenv("changes", job.Getenv("changes"))
+	buildConfigJob.SetenvList("changes", c.Changes)
 	// FIXME this should be remove when we remove deprecated config param
 	// FIXME this should be remove when we remove deprecated config param
-	buildConfigJob.Setenv("config", job.Getenv("config"))
+	buildConfigJob.SetenvSubEnv("config", &subenv)
 
 
 	if err := buildConfigJob.Run(); err != nil {
 	if err := buildConfigJob.Run(); err != nil {
-		return err
+		return "", err
 	}
 	}
 	if err := json.NewDecoder(stdoutBuffer).Decode(&newConfig); err != nil {
 	if err := json.NewDecoder(stdoutBuffer).Decode(&newConfig); err != nil {
-		return err
+		return "", err
 	}
 	}
 
 
 	if err := runconfig.Merge(&newConfig, config); err != nil {
 	if err := runconfig.Merge(&newConfig, config); err != nil {
-		return err
+		return "", err
 	}
 	}
 
 
-	img, err := daemon.Commit(container, job.Getenv("repo"), job.Getenv("tag"), job.Getenv("comment"), job.Getenv("author"), job.GetenvBool("pause"), &newConfig)
+	img, err := daemon.Commit(container, c.Repo, c.Tag, c.Comment, c.Author, c.Pause, &newConfig)
 	if err != nil {
 	if err != nil {
-		return err
+		return "", err
 	}
 	}
-	job.Printf("%s\n", img.ID)
-	return nil
+
+	return img.ID, nil
 }
 }
 
 
 // Commit creates a new filesystem image from the current state of a container.
 // Commit creates a new filesystem image from the current state of a container.

+ 0 - 1
daemon/daemon.go

@@ -117,7 +117,6 @@ type Daemon struct {
 // Install installs daemon capabilities to eng.
 // Install installs daemon capabilities to eng.
 func (daemon *Daemon) Install(eng *engine.Engine) error {
 func (daemon *Daemon) Install(eng *engine.Engine) error {
 	for name, method := range map[string]engine.Handler{
 	for name, method := range map[string]engine.Handler{
-		"commit":            daemon.ContainerCommit,
 		"container_inspect": daemon.ContainerInspect,
 		"container_inspect": daemon.ContainerInspect,
 		"container_stats":   daemon.ContainerStats,
 		"container_stats":   daemon.ContainerStats,
 		"create":            daemon.ContainerCreate,
 		"create":            daemon.ContainerCreate,

+ 1 - 88
integration/server_test.go

@@ -1,12 +1,6 @@
 package docker
 package docker
 
 
-import (
-	"bytes"
-	"testing"
-
-	"github.com/docker/docker/builder"
-	"github.com/docker/docker/engine"
-)
+import "testing"
 
 
 func TestCreateNumberHostname(t *testing.T) {
 func TestCreateNumberHostname(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
@@ -20,87 +14,6 @@ func TestCreateNumberHostname(t *testing.T) {
 	createTestContainer(eng, config, t)
 	createTestContainer(eng, config, t)
 }
 }
 
 
-func TestCommit(t *testing.T) {
-	eng := NewTestEngine(t)
-	b := &builder.BuilderJob{Engine: eng}
-	b.Install()
-	defer mkDaemonFromEngine(eng, t).Nuke()
-
-	config, _, _, err := parseRun([]string{unitTestImageID, "/bin/cat"})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	id := createTestContainer(eng, config, t)
-
-	job := eng.Job("commit", id)
-	job.Setenv("repo", "testrepo")
-	job.Setenv("tag", "testtag")
-	job.SetenvJson("config", config)
-	if err := job.Run(); err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestMergeConfigOnCommit(t *testing.T) {
-	eng := NewTestEngine(t)
-	b := &builder.BuilderJob{Engine: eng}
-	b.Install()
-	runtime := mkDaemonFromEngine(eng, t)
-	defer runtime.Nuke()
-
-	container1, _, _ := mkContainer(runtime, []string{"-e", "FOO=bar", unitTestImageID, "echo test > /tmp/foo"}, t)
-	defer runtime.Rm(container1)
-
-	config, _, _, err := parseRun([]string{container1.ID, "cat /tmp/foo"})
-	if err != nil {
-		t.Error(err)
-	}
-
-	job := eng.Job("commit", container1.ID)
-	job.Setenv("repo", "testrepo")
-	job.Setenv("tag", "testtag")
-	job.SetenvJson("config", config)
-	var outputBuffer = bytes.NewBuffer(nil)
-	job.Stdout.Add(outputBuffer)
-	if err := job.Run(); err != nil {
-		t.Error(err)
-	}
-
-	container2, _, _ := mkContainer(runtime, []string{engine.Tail(outputBuffer, 1)}, t)
-	defer runtime.Rm(container2)
-
-	job = eng.Job("container_inspect", container1.Name)
-	baseContainer, _ := job.Stdout.AddEnv()
-	if err := job.Run(); err != nil {
-		t.Error(err)
-	}
-
-	job = eng.Job("container_inspect", container2.Name)
-	commitContainer, _ := job.Stdout.AddEnv()
-	if err := job.Run(); err != nil {
-		t.Error(err)
-	}
-
-	baseConfig := baseContainer.GetSubEnv("Config")
-	commitConfig := commitContainer.GetSubEnv("Config")
-
-	if commitConfig.Get("Env") != baseConfig.Get("Env") {
-		t.Fatalf("Env config in committed container should be %v, was %v",
-			baseConfig.Get("Env"), commitConfig.Get("Env"))
-	}
-
-	if baseConfig.Get("Cmd") != "[\"echo test \\u003e /tmp/foo\"]" {
-		t.Fatalf("Cmd in base container should be [\"echo test \\u003e /tmp/foo\"], was %s",
-			baseConfig.Get("Cmd"))
-	}
-
-	if commitConfig.Get("Cmd") != "[\"cat /tmp/foo\"]" {
-		t.Fatalf("Cmd in committed container should be [\"cat /tmp/foo\"], was %s",
-			commitConfig.Get("Cmd"))
-	}
-}
-
 func TestRunWithTooLowMemoryLimit(t *testing.T) {
 func TestRunWithTooLowMemoryLimit(t *testing.T) {
 	eng := NewTestEngine(t)
 	eng := NewTestEngine(t)
 	defer mkDaemonFromEngine(eng, t).Nuke()
 	defer mkDaemonFromEngine(eng, t).Nuke()