From 5982f1ef07439eec86b450184e13caafdeb5a78f Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 28 Jan 2024 23:05:08 +0100 Subject: [PATCH] fix: directly write dump to file without buffering in memory Resolves https://kolaente.dev/konrad/docker-db-backup/issues/5 --- save.go | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/save.go b/save.go index eb6309e..012cb55 100644 --- a/save.go +++ b/save.go @@ -1,14 +1,13 @@ package main import ( - "bytes" "context" "fmt" - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" - "github.com/docker/docker/pkg/stdcopy" "io" "os" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/client" ) func runAndSaveCommandInContainer(filename string, c *client.Client, container *types.ContainerJSON, command string, args ...string) error { @@ -31,33 +30,20 @@ func runAndSaveCommandInContainer(filename string, c *client.Client, container * } defer resp.Close() - // read the output - var outBuf, errBuf bytes.Buffer - outputDone := make(chan error) - - go func() { - // StdCopy demultiplexes the stream into two buffers - _, err = stdcopy.StdCopy(&outBuf, &errBuf, resp.Reader) - outputDone <- err - }() - - err = <-outputDone - if err != nil { - fmt.Printf(errBuf.String()) - return err - } - - _, err = c.ContainerExecInspect(ctx, r.ID) - if err != nil { - return err - } - f, err := os.Create(filename) if err != nil { return err } defer f.Close() - _, err = io.Copy(f, &outBuf) + _, err = io.Copy(f, resp.Reader) + if err != nil { + return err + } + + execInspect, err := c.ContainerExecInspect(ctx, r.ID) + if execInspect.ExitCode != 0 { + return fmt.Errorf("backup from container %s failed with exit code %d", container.Name, execInspect.ExitCode) + } return err }