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 {
|
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 {
|
cont := r.Form.Get("container")
|
||||||
logrus.Errorf("%s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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")
|
pause = true
|
||||||
} else {
|
|
||||||
job.Setenv("pause", r.FormValue("pause"))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
job.Setenv("repo", r.Form.Get("repo"))
|
containerCommitConfig := &daemon.ContainerCommitConfig{
|
||||||
job.Setenv("tag", r.Form.Get("tag"))
|
Pause: pause,
|
||||||
job.Setenv("author", r.Form.Get("author"))
|
Repo: r.Form.Get("repo"),
|
||||||
job.Setenv("comment", r.Form.Get("comment"))
|
Tag: r.Form.Get("tag"),
|
||||||
job.SetenvList("changes", r.Form["changes"])
|
Author: r.Form.Get("author"),
|
||||||
job.SetenvSubEnv("config", &config)
|
Comment: r.Form.Get("comment"),
|
||||||
|
Changes: r.Form["changes"],
|
||||||
|
Config: r.Body,
|
||||||
|
}
|
||||||
|
|
||||||
job.Stdout.Add(stdoutBuffer)
|
d := getDaemon(eng)
|
||||||
if err := job.Run(); err != nil {
|
|
||||||
|
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,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
type ContainerCommitConfig struct {
|
||||||
if len(job.Args) != 1 {
|
Pause bool
|
||||||
return fmt.Errorf("Not enough arguments. Usage: %s CONTAINER\n", job.Name)
|
Repo string
|
||||||
}
|
Tag string
|
||||||
name := job.Args[0]
|
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.
|
||||||
|
|
|
@ -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,12 +1,6 @@
|
||||||
package docker
|
package docker
|
||||||
|
|
||||||
import (
|
import "testing"
|
||||||
"bytes"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/docker/docker/builder"
|
|
||||||
"github.com/docker/docker/engine"
|
|
||||||
)
|
|
||||||
|
|
||||||
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()
|
||||||
|
|
Loading…
Add table
Reference in a new issue