summaryrefslogtreecommitdiff
path: root/cmd/podman/images/save.go
diff options
context:
space:
mode:
authorQi Wang <qiwan@redhat.com>2020-07-23 15:54:12 -0400
committerQi Wang <qiwan@redhat.com>2020-08-12 10:03:41 -0400
commit49dea06037e1254a1dbe0064942e7329079388ec (patch)
tree25dd0ddb22f219e2ed6fc6e777e7d083ec27c5bb /cmd/podman/images/save.go
parent8eaacec150df782c291e9c6046bb0db010dd2f08 (diff)
downloadpodman-49dea06037e1254a1dbe0064942e7329079388ec.tar.gz
podman-49dea06037e1254a1dbe0064942e7329079388ec.tar.bz2
podman-49dea06037e1254a1dbe0064942e7329079388ec.zip
podman save use named pipe
podman save uses named pipe as output path, not directly using /dev/stdout. fix #7017 Signed-off-by: Qi Wang <qiwan@redhat.com>
Diffstat (limited to 'cmd/podman/images/save.go')
-rw-r--r--cmd/podman/images/save.go31
1 files changed, 25 insertions, 6 deletions
diff --git a/cmd/podman/images/save.go b/cmd/podman/images/save.go
index 024045b9d..82a3513f5 100644
--- a/cmd/podman/images/save.go
+++ b/cmd/podman/images/save.go
@@ -5,10 +5,9 @@ import (
"os"
"strings"
- "github.com/containers/podman/v2/libpod/define"
-
"github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry"
+ "github.com/containers/podman/v2/libpod/define"
"github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/util"
"github.com/pkg/errors"
@@ -83,9 +82,10 @@ func saveFlags(flags *pflag.FlagSet) {
}
-func save(cmd *cobra.Command, args []string) error {
+func save(cmd *cobra.Command, args []string) (finalErr error) {
var (
- tags []string
+ tags []string
+ succeeded = false
)
if cmd.Flag("compress").Changed && (saveOpts.Format != define.OCIManifestDir && saveOpts.Format != define.V2s2ManifestDir && saveOpts.Format == "") {
return errors.Errorf("--compress can only be set when --format is either 'oci-dir' or 'docker-dir'")
@@ -95,7 +95,22 @@ func save(cmd *cobra.Command, args []string) error {
if terminal.IsTerminal(int(fi.Fd())) {
return errors.Errorf("refusing to save to terminal. Use -o flag or redirect")
}
- saveOpts.Output = "/dev/stdout"
+ pipePath, cleanup, err := setupPipe()
+ if err != nil {
+ return err
+ }
+ if cleanup != nil {
+ defer func() {
+ errc := cleanup()
+ if succeeded {
+ writeErr := <-errc
+ if writeErr != nil && finalErr == nil {
+ finalErr = writeErr
+ }
+ }
+ }()
+ }
+ saveOpts.Output = pipePath
}
if err := parse.ValidateFileName(saveOpts.Output); err != nil {
return err
@@ -103,5 +118,9 @@ func save(cmd *cobra.Command, args []string) error {
if len(args) > 1 {
tags = args[1:]
}
- return registry.ImageEngine().Save(context.Background(), args[0], tags, saveOpts)
+ err := registry.ImageEngine().Save(context.Background(), args[0], tags, saveOpts)
+ if err == nil {
+ succeeded = true
+ }
+ return err
}