package daemon import ( "github.com/docker/docker/image" "github.com/docker/docker/runconfig" ) // ContainerCommitConfig contains build configs for commit operation, // and is used when making a commit with the current state of the container. type ContainerCommitConfig struct { Pause bool Repo string Tag string Author string Comment string Config *runconfig.Config } // 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, c *ContainerCommitConfig) (*image.Image, error) { if c.Pause && !container.isPaused() { container.pause() defer container.unpause() } rwTar, err := container.exportRw() if err != nil { return nil, err } defer func() { if rwTar != nil { rwTar.Close() } }() // Create a new image from the container's base layers + a new layer from container changes img, err := daemon.graph.Create(rwTar, container.ID, container.ImageID, c.Comment, c.Author, container.Config, c.Config) if err != nil { return nil, err } // Register the image if needed if c.Repo != "" { if err := daemon.repositories.Tag(c.Repo, c.Tag, img.ID, true); err != nil { return img, err } } container.logEvent("commit") return img, nil }