mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Remove job from commit
Signed-off-by: Antonio Murdaca <me@runcom.ninja>
This commit is contained in:
parent
96313f7ce0
commit
c8529fde5f
4 changed files with 46 additions and 125 deletions
|
@ -618,39 +618,37 @@ func postCommit(eng *engine.Engine, version version.Version, w http.ResponseWrit
|
|||
if err := parseForm(r); err != nil {
|
||||
return err
|
||||
}
|
||||
var (
|
||||
config engine.Env
|
||||
job = eng.Job("commit", r.Form.Get("container"))
|
||||
stdoutBuffer = bytes.NewBuffer(nil)
|
||||
)
|
||||
|
||||
if err := checkForJson(r); err != nil {
|
||||
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") {
|
||||
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 writeJSON(w, http.StatusCreated, &types.ContainerCommitResponse{
|
||||
ID: engine.Tail(stdoutBuffer, 1),
|
||||
ID: imgID,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -3,53 +3,64 @@ package daemon
|
|||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
"github.com/Sirupsen/logrus"
|
||||
"github.com/docker/docker/engine"
|
||||
"github.com/docker/docker/image"
|
||||
"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)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
|
||||
var (
|
||||
subenv engine.Env
|
||||
config = container.Config
|
||||
stdoutBuffer = bytes.NewBuffer(nil)
|
||||
newConfig runconfig.Config
|
||||
)
|
||||
|
||||
if err := subenv.Decode(c.Config); err != nil {
|
||||
logrus.Errorf("%s", err)
|
||||
}
|
||||
|
||||
buildConfigJob := daemon.eng.Job("build_config")
|
||||
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
|
||||
buildConfigJob.Setenv("config", job.Getenv("config"))
|
||||
buildConfigJob.SetenvSubEnv("config", &subenv)
|
||||
|
||||
if err := buildConfigJob.Run(); err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
if err := json.NewDecoder(stdoutBuffer).Decode(&newConfig); err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
|
||||
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 {
|
||||
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.
|
||||
|
|
|
@ -117,7 +117,6 @@ type Daemon struct {
|
|||
// Install installs daemon capabilities to eng.
|
||||
func (daemon *Daemon) Install(eng *engine.Engine) error {
|
||||
for name, method := range map[string]engine.Handler{
|
||||
"commit": daemon.ContainerCommit,
|
||||
"container_inspect": daemon.ContainerInspect,
|
||||
"container_stats": daemon.ContainerStats,
|
||||
"create": daemon.ContainerCreate,
|
||||
|
|
|
@ -1,12 +1,6 @@
|
|||
package docker
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
|
||||
"github.com/docker/docker/builder"
|
||||
"github.com/docker/docker/engine"
|
||||
)
|
||||
import "testing"
|
||||
|
||||
func TestCreateNumberHostname(t *testing.T) {
|
||||
eng := NewTestEngine(t)
|
||||
|
@ -20,87 +14,6 @@ func TestCreateNumberHostname(t *testing.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) {
|
||||
eng := NewTestEngine(t)
|
||||
defer mkDaemonFromEngine(eng, t).Nuke()
|
||||
|
|
Loading…
Add table
Reference in a new issue