|
@@ -4,6 +4,8 @@ import (
|
|
"io"
|
|
"io"
|
|
|
|
|
|
derr "github.com/docker/docker/errors"
|
|
derr "github.com/docker/docker/errors"
|
|
|
|
+ "github.com/docker/docker/pkg/archive"
|
|
|
|
+ "github.com/docker/docker/pkg/ioutils"
|
|
)
|
|
)
|
|
|
|
|
|
// ContainerExport writes the contents of the container to the given
|
|
// ContainerExport writes the contents of the container to the given
|
|
@@ -14,7 +16,7 @@ func (daemon *Daemon) ContainerExport(name string, out io.Writer) error {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
- data, err := container.export()
|
|
|
|
|
|
+ data, err := daemon.containerExport(container)
|
|
if err != nil {
|
|
if err != nil {
|
|
return derr.ErrorCodeExportFailed.WithArgs(name, err)
|
|
return derr.ErrorCodeExportFailed.WithArgs(name, err)
|
|
}
|
|
}
|
|
@@ -26,3 +28,27 @@ func (daemon *Daemon) ContainerExport(name string, out io.Writer) error {
|
|
}
|
|
}
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+func (daemon *Daemon) containerExport(container *Container) (archive.Archive, error) {
|
|
|
|
+ if err := daemon.Mount(container); err != nil {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ uidMaps, gidMaps := daemon.GetUIDGIDMaps()
|
|
|
|
+ archive, err := archive.TarWithOptions(container.basefs, &archive.TarOptions{
|
|
|
|
+ Compression: archive.Uncompressed,
|
|
|
|
+ UIDMaps: uidMaps,
|
|
|
|
+ GIDMaps: gidMaps,
|
|
|
|
+ })
|
|
|
|
+ if err != nil {
|
|
|
|
+ daemon.unmount(container)
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+ arch := ioutils.NewReadCloserWrapper(archive, func() error {
|
|
|
|
+ err := archive.Close()
|
|
|
|
+ container.Unmount()
|
|
|
|
+ return err
|
|
|
|
+ })
|
|
|
|
+ daemon.logContainerEvent(container, "export")
|
|
|
|
+ return arch, err
|
|
|
|
+}
|