diff options
author | Brent Baude <bbaude@redhat.com> | 2020-03-31 19:13:19 -0500 |
---|---|---|
committer | Brent Baude <bbaude@redhat.com> | 2020-04-01 16:02:53 -0500 |
commit | bb39051616fbce12b4cb3135a62c7747273ab0aa (patch) | |
tree | 055e000b03084fbd41cd7f9b6cf8c3c407f397c0 /pkg/api/handlers/compat/containers_export.go | |
parent | 0f357be5aeaa5dc651659cf0945a58780641e77d (diff) | |
download | podman-bb39051616fbce12b4cb3135a62c7747273ab0aa.tar.gz podman-bb39051616fbce12b4cb3135a62c7747273ab0aa.tar.bz2 podman-bb39051616fbce12b4cb3135a62c7747273ab0aa.zip |
podmanv2 export
add ability to export a container to a tarball
Signed-off-by: Brent Baude <bbaude@redhat.com>
Diffstat (limited to 'pkg/api/handlers/compat/containers_export.go')
-rw-r--r-- | pkg/api/handlers/compat/containers_export.go | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/pkg/api/handlers/compat/containers_export.go b/pkg/api/handlers/compat/containers_export.go new file mode 100644 index 000000000..37b9fbf2b --- /dev/null +++ b/pkg/api/handlers/compat/containers_export.go @@ -0,0 +1,42 @@ +package compat + +import ( + "io/ioutil" + "net/http" + "os" + + "github.com/containers/libpod/libpod" + "github.com/containers/libpod/pkg/api/handlers/utils" + "github.com/pkg/errors" +) + +func ExportContainer(w http.ResponseWriter, r *http.Request) { + runtime := r.Context().Value("runtime").(*libpod.Runtime) + name := utils.GetName(r) + con, err := runtime.LookupContainer(name) + if err != nil { + utils.ContainerNotFound(w, name, err) + return + } + tmpfile, err := ioutil.TempFile("", "api.tar") + if err != nil { + utils.Error(w, "unable to create tarball tempfile", http.StatusInternalServerError, errors.Wrap(err, "unable to create tempfile")) + return + } + defer os.Remove(tmpfile.Name()) + if err := tmpfile.Close(); err != nil { + utils.Error(w, "unable to close tempfile", http.StatusInternalServerError, errors.Wrap(err, "unable to close tempfile")) + return + } + if err := con.Export(tmpfile.Name()); err != nil { + utils.Error(w, "failed to save the image", http.StatusInternalServerError, errors.Wrap(err, "failed to save image")) + return + } + rdr, err := os.Open(tmpfile.Name()) + if err != nil { + utils.Error(w, "failed to read temp tarball", http.StatusInternalServerError, errors.Wrap(err, "failed to read the exported tarfile")) + return + } + defer rdr.Close() + utils.WriteResponse(w, http.StatusOK, rdr) +} |