зеркало из https://github.com/microsoft/docker.git
'docker commit' can optionally tag the new image into a repository
This commit is contained in:
Родитель
49a78929c6
Коммит
8396798eba
27
commands.go
27
commands.go
|
@ -531,33 +531,22 @@ func (srv *Server) CmdPs(stdin io.ReadCloser, stdout io.Writer, args ...string)
|
||||||
|
|
||||||
func (srv *Server) CmdCommit(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
|
func (srv *Server) CmdCommit(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
|
||||||
cmd := rcli.Subcmd(stdout,
|
cmd := rcli.Subcmd(stdout,
|
||||||
"commit", "[OPTIONS] CONTAINER [DEST]",
|
"commit", "[OPTIONS] CONTAINER [REPOSITORY [TAG]]",
|
||||||
"Create a new image from a container's changes")
|
"Create a new image from a container's changes")
|
||||||
if err := cmd.Parse(args); err != nil {
|
if err := cmd.Parse(args); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
containerName, imgName := cmd.Arg(0), cmd.Arg(1)
|
containerName, repository, tag := cmd.Arg(0), cmd.Arg(1), cmd.Arg(2)
|
||||||
if containerName == "" || imgName == "" {
|
if containerName == "" {
|
||||||
cmd.Usage()
|
cmd.Usage()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if container := srv.runtime.Get(containerName); container != nil {
|
img, err := srv.runtime.Commit(containerName, repository, tag)
|
||||||
// FIXME: freeze the container before copying it to avoid data corruption?
|
if err != nil {
|
||||||
// FIXME: this shouldn't be in commands.
|
return err
|
||||||
rwTar, err := container.ExportRw()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Create a new image from the container's base layers + a new layer from container changes
|
|
||||||
img, err := srv.runtime.graph.Create(rwTar, container.Image, "")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprintln(stdout, img.Id)
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
return errors.New("No such container: " + containerName)
|
fmt.Fprintln(stdout, img.Id)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (srv *Server) CmdExport(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
|
func (srv *Server) CmdExport(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
|
||||||
|
|
27
runtime.go
27
runtime.go
|
@ -200,6 +200,33 @@ func (runtime *Runtime) Destroy(container *Container) error {
|
||||||
return nil
|
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 (runtime *Runtime) Commit(id, repository, tag string) (*Image, error) {
|
||||||
|
container := runtime.Get(id)
|
||||||
|
if container == nil {
|
||||||
|
return nil, fmt.Errorf("No such container: %s", id)
|
||||||
|
}
|
||||||
|
// FIXME: freeze the container before copying it to avoid data corruption?
|
||||||
|
// FIXME: this shouldn't be in commands.
|
||||||
|
rwTar, err := container.ExportRw()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// Create a new image from the container's base layers + a new layer from container changes
|
||||||
|
img, err := runtime.graph.Create(rwTar, container.Image, "")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// Register the image if needed
|
||||||
|
if repository != "" {
|
||||||
|
if err := runtime.repositories.Set(repository, tag, img.Id); err != nil {
|
||||||
|
return img, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return img, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (runtime *Runtime) restore() error {
|
func (runtime *Runtime) restore() error {
|
||||||
dir, err := ioutil.ReadDir(runtime.repository)
|
dir, err := ioutil.ReadDir(runtime.repository)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче