diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2020-08-12 23:26:03 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-12 23:26:03 +0200 |
commit | d777a7bd5c920ce3cf06c4eba25068747dbc6b8f (patch) | |
tree | 7dd494a3abbc7c35b9a93720b5219ab072f269ad /cmd/podman/images/utils_linux.go | |
parent | acae04aaaf1235ee2e2475d97155783dc4aefc9f (diff) | |
parent | 49dea06037e1254a1dbe0064942e7329079388ec (diff) | |
download | podman-d777a7bd5c920ce3cf06c4eba25068747dbc6b8f.tar.gz podman-d777a7bd5c920ce3cf06c4eba25068747dbc6b8f.tar.bz2 podman-d777a7bd5c920ce3cf06c4eba25068747dbc6b8f.zip |
Merge pull request #7073 from QiWang19/save-stdout
podman save use named pipe
Diffstat (limited to 'cmd/podman/images/utils_linux.go')
-rw-r--r-- | cmd/podman/images/utils_linux.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/cmd/podman/images/utils_linux.go b/cmd/podman/images/utils_linux.go new file mode 100644 index 000000000..5521abab4 --- /dev/null +++ b/cmd/podman/images/utils_linux.go @@ -0,0 +1,47 @@ +package images + +import ( + "io" + "io/ioutil" + "os" + "path/filepath" + + "github.com/pkg/errors" + "github.com/sirupsen/logrus" + "golang.org/x/sys/unix" +) + +// setupPipe for fixing https://github.com/containers/podman/issues/7017 +// uses named pipe since containers/image EvalSymlinks fails with /dev/stdout +// the caller should use the returned function to clean up the pipeDir +func setupPipe() (string, func() <-chan error, error) { + errc := make(chan error) + pipeDir, err := ioutil.TempDir(os.TempDir(), "pipeDir") + if err != nil { + return "", nil, err + } + pipePath := filepath.Join(pipeDir, "saveio") + err = unix.Mkfifo(pipePath, 0600) + if err != nil { + if e := os.RemoveAll(pipeDir); e != nil { + logrus.Errorf("error removing named pipe: %q", e) + } + return "", nil, errors.Wrapf(err, "error creating named pipe") + } + go func() { + fpipe, err := os.Open(pipePath) + if err != nil { + errc <- err + return + } + _, err = io.Copy(os.Stdout, fpipe) + fpipe.Close() + errc <- err + }() + return pipePath, func() <-chan error { + if e := os.RemoveAll(pipeDir); e != nil { + logrus.Errorf("error removing named pipe: %q", e) + } + return errc + }, nil +} |