From fdad41f5b921dfa06eec613b86147a22aeea5835 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Thu, 31 Jul 2014 20:57:21 +0000 Subject: [PATCH] Move "commit" to daemon/commit.go This is part of an effort to break apart the deprecated server/ package Docker-DCO-1.1-Signed-off-by: Solomon Hykes (github: shykes) --- daemon/commit.go | 84 +++++++++++++++++++++++++++++++++++++++++++++ daemon/daemon.go | 48 ++------------------------ server/container.go | 33 ------------------ server/init.go | 1 - 4 files changed, 87 insertions(+), 79 deletions(-) create mode 100644 daemon/commit.go diff --git a/daemon/commit.go b/daemon/commit.go new file mode 100644 index 0000000000..950925ade3 --- /dev/null +++ b/daemon/commit.go @@ -0,0 +1,84 @@ +package daemon + +import ( + "github.com/docker/docker/engine" + "github.com/docker/docker/image" + "github.com/docker/docker/runconfig" +) + +func (daemon *Daemon) ContainerCommit(job *engine.Job) engine.Status { + if len(job.Args) != 1 { + return job.Errorf("Not enough arguments. Usage: %s CONTAINER\n", job.Name) + } + name := job.Args[0] + + container := daemon.Get(name) + if container == nil { + return job.Errorf("No such container: %s", name) + } + + var ( + config = container.Config + newConfig runconfig.Config + ) + + if err := job.GetenvJson("config", &newConfig); err != nil { + return job.Error(err) + } + + if err := runconfig.Merge(&newConfig, config); err != nil { + return job.Error(err) + } + + img, err := daemon.Commit(container, job.Getenv("repo"), job.Getenv("tag"), job.Getenv("comment"), job.Getenv("author"), job.GetenvBool("pause"), &newConfig) + if err != nil { + return job.Error(err) + } + job.Printf("%s\n", img.ID) + return engine.StatusOK +} + +// Commit creates a new filesystem image from the current state of a container. +// The image can optionally be tagged into a repository +func (daemon *Daemon) Commit(container *Container, repository, tag, comment, author string, pause bool, config *runconfig.Config) (*image.Image, error) { + if pause { + container.Pause() + defer container.Unpause() + } + + if err := container.Mount(); err != nil { + return nil, err + } + defer container.Unmount() + + rwTar, err := container.ExportRw() + if err != nil { + return nil, err + } + defer rwTar.Close() + + // Create a new image from the container's base layers + a new layer from container changes + var ( + containerID, containerImage string + containerConfig *runconfig.Config + ) + + if container != nil { + containerID = container.ID + containerImage = container.Image + containerConfig = container.Config + } + + img, err := daemon.graph.Create(rwTar, containerID, containerImage, comment, author, containerConfig, config) + if err != nil { + return nil, err + } + + // Register the image if needed + if repository != "" { + if err := daemon.repositories.Set(repository, tag, img.ID, true); err != nil { + return img, err + } + } + return img, nil +} diff --git a/daemon/daemon.go b/daemon/daemon.go index 87837d8bcb..27c380b1d3 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -141,6 +141,9 @@ func (daemon *Daemon) Install(eng *engine.Engine) error { if err := eng.Register("resize", daemon.ContainerResize); err != nil { return err } + if err := eng.Register("commit", daemon.ContainerCommit); err != nil { + return err + } return nil } @@ -626,51 +629,6 @@ func (daemon *Daemon) createRootfs(container *Container, img *image.Image) error return nil } -// Commit creates a new filesystem image from the current state of a container. -// The image can optionally be tagged into a repository -func (daemon *Daemon) Commit(container *Container, repository, tag, comment, author string, pause bool, config *runconfig.Config) (*image.Image, error) { - if pause { - container.Pause() - defer container.Unpause() - } - - if err := container.Mount(); err != nil { - return nil, err - } - defer container.Unmount() - - rwTar, err := container.ExportRw() - if err != nil { - return nil, err - } - defer rwTar.Close() - - // Create a new image from the container's base layers + a new layer from container changes - var ( - containerID, containerImage string - containerConfig *runconfig.Config - ) - - if container != nil { - containerID = container.ID - containerImage = container.Image - containerConfig = container.Config - } - - img, err := daemon.graph.Create(rwTar, containerID, containerImage, comment, author, containerConfig, config) - if err != nil { - return nil, err - } - - // Register the image if needed - if repository != "" { - if err := daemon.repositories.Set(repository, tag, img.ID, true); err != nil { - return img, err - } - } - return img, nil -} - func GetFullContainerName(name string) (string, error) { if name == "" { return "", fmt.Errorf("Container name cannot be empty") diff --git a/server/container.go b/server/container.go index b71bfbfa15..6ac46ba3b6 100644 --- a/server/container.go +++ b/server/container.go @@ -23,7 +23,6 @@ import ( "github.com/docker/docker/engine" "github.com/docker/docker/pkg/graphdb" "github.com/docker/docker/pkg/tailfile" - "github.com/docker/docker/runconfig" "github.com/docker/docker/utils" ) @@ -229,38 +228,6 @@ func (srv *Server) Containers(job *engine.Job) engine.Status { return engine.StatusOK } -func (srv *Server) ContainerCommit(job *engine.Job) engine.Status { - if len(job.Args) != 1 { - return job.Errorf("Not enough arguments. Usage: %s CONTAINER\n", job.Name) - } - name := job.Args[0] - - container := srv.daemon.Get(name) - if container == nil { - return job.Errorf("No such container: %s", name) - } - - var ( - config = container.Config - newConfig runconfig.Config - ) - - if err := job.GetenvJson("config", &newConfig); err != nil { - return job.Error(err) - } - - if err := runconfig.Merge(&newConfig, config); err != nil { - return job.Error(err) - } - - img, err := srv.daemon.Commit(container, job.Getenv("repo"), job.Getenv("tag"), job.Getenv("comment"), job.Getenv("author"), job.GetenvBool("pause"), &newConfig) - if err != nil { - return job.Error(err) - } - job.Printf("%s\n", img.ID) - return engine.StatusOK -} - func (srv *Server) ContainerDestroy(job *engine.Job) engine.Status { if len(job.Args) != 1 { return job.Errorf("Not enough arguments. Usage: %s CONTAINER\n", job.Name) diff --git a/server/init.go b/server/init.go index 64d6563400..74cd923612 100644 --- a/server/init.go +++ b/server/init.go @@ -87,7 +87,6 @@ func InitServer(job *engine.Job) engine.Status { for name, handler := range map[string]engine.Handler{ "tag": srv.ImageTag, // FIXME merge with "image_tag" - "commit": srv.ContainerCommit, "info": srv.DockerInfo, "container_delete": srv.ContainerDestroy, "image_export": srv.ImageExport,