From 2d930bc8e50449c35a128e9cc49ba4293ebd7ee8 Mon Sep 17 00:00:00 2001 From: Justin Cormack Date: Wed, 2 Aug 2017 13:36:29 +0100 Subject: [PATCH] Use new style ISO BIOS mkimage from Linuxkit which unpacks filesystem Rather than using an initrd, unpack full filesystem for ISO BIOS. Stream docker output direct to file rather than via a buffer, to save memory. Signed-off-by: Justin Cormack --- src/moby/docker.go | 40 +++++++++------------------------------- src/moby/output.go | 41 ++++++++++++++++++++--------------------- 2 files changed, 29 insertions(+), 52 deletions(-) diff --git a/src/moby/docker.go b/src/moby/docker.go index 5056da17d..81e24fc9c 100644 --- a/src/moby/docker.go +++ b/src/moby/docker.go @@ -21,48 +21,26 @@ import ( "golang.org/x/net/context" ) -func dockerRun(input io.Reader, args ...string) ([]byte, error) { +func dockerRun(input io.Reader, output io.Writer, args ...string) error { log.Debugf("docker run (input): %s", strings.Join(args, " ")) docker, err := exec.LookPath("docker") if err != nil { - return []byte{}, errors.New("Docker does not seem to be installed") + return errors.New("Docker does not seem to be installed") } args = append([]string{"run", "--rm", "-i"}, args...) cmd := exec.Command(docker, args...) cmd.Stdin = input + cmd.Stdout = output - stderrPipe, err := cmd.StderrPipe() - if err != nil { - return []byte{}, err - } - - stdoutPipe, err := cmd.StdoutPipe() - if err != nil { - return []byte{}, err - } - - err = cmd.Start() - if err != nil { - return []byte{}, err - } - - stdout, err := ioutil.ReadAll(stdoutPipe) - if err != nil { - return []byte{}, err - } - - stderr, err := ioutil.ReadAll(stderrPipe) - if err != nil { - return []byte{}, err - } - - err = cmd.Wait() - if err != nil { - return []byte{}, fmt.Errorf("%v: %s", err, stderr) + if err := cmd.Run(); err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + return fmt.Errorf("docker run failed: %v output:\n%s", err, exitError.Stderr) + } + return err } log.Debugf("docker run (input): %s...Done", strings.Join(args, " ")) - return stdout, nil + return nil } func dockerCreate(image string) (string, error) { diff --git a/src/moby/output.go b/src/moby/output.go index 15496d690..f30a5af3c 100644 --- a/src/moby/output.go +++ b/src/moby/output.go @@ -12,7 +12,7 @@ import ( ) const ( - bios = "linuxkit/mkimage-iso-bios:db791abed6f2b5320feb6cec255a635aee3756f6@sha256:e57483075307bcea4a7257f87eee733d3e24e7a964ba15dcc01111df6729ab3b" + bios = "linuxkit/mkimage-iso-bios:1140a4f96b04d6744160f6e3ae485bf7f7a945a8@sha256:878c7d7162120be1c388fded863eef28908b3ebf1c0751b78193103c10d4f6d1" efi = "linuxkit/mkimage-iso-efi:5c2fc616bde288476a14f4f6dd0d273a66832822@sha256:876ef47ec2b30af40e70f1e98f496206eb430915867c4f9f400e1af47fd58d7c" gcp = "linuxkit/mkimage-gcp:46716b3d3f7aa1a7607a3426fe0ccebc554b14ee@sha256:18d8e0482f65a2481f5b6ba1e7ce77723b246bf13bdb612be5e64df90297940c" vhd = "linuxkit/mkimage-vhd:a04c8480d41ca9cef6b7710bd45a592220c3acb2@sha256:ba373dc8ae5dc72685dbe4b872d8f588bc68b2114abd8bdc6a74d82a2b62cce3" @@ -33,11 +33,7 @@ var outFuns = map[string]func(string, []byte, int, bool) error{ return nil }, "iso-bios": func(base string, image []byte, size int, hyperkit bool) error { - kernel, initrd, cmdline, err := tarToInitrd(image) - if err != nil { - return fmt.Errorf("Error converting to initrd: %v", err) - } - err = outputImg(bios, base+".iso", kernel, initrd, cmdline) + err := outputIso(bios, base+".iso", image) if err != nil { return fmt.Errorf("Error writing iso-bios output: %v", err) } @@ -246,15 +242,12 @@ func outputImg(image, filename string, kernel []byte, initrd []byte, cmdline str if err != nil { return err } - img, err := dockerRun(buf, image, cmdline) + output, err := os.Create(filename) if err != nil { return err } - err = ioutil.WriteFile(filename, img, os.FileMode(0644)) - if err != nil { - return err - } - return nil + defer output.Close() + return dockerRun(buf, output, image, cmdline) } // this should replace the other version for types that can specify a size @@ -265,20 +258,26 @@ func outputImgSize(image, filename string, kernel []byte, initrd []byte, cmdline if err != nil { return err } - var img []byte + output, err := os.Create(filename) + if err != nil { + return err + } + defer output.Close() if size == 0 { - img, err = dockerRun(buf, image) - } else { - img, err = dockerRun(buf, image, fmt.Sprintf("%dM", size)) + return dockerRun(buf, output, image) } + return dockerRun(buf, output, image, fmt.Sprintf("%dM", size)) +} + +func outputIso(image, filename string, filesystem []byte) error { + log.Debugf("output ISO: %s %s", image, filename) + log.Infof(" %s", filename) + output, err := os.Create(filename) if err != nil { return err } - err = ioutil.WriteFile(filename, img, os.FileMode(0644)) - if err != nil { - return err - } - return nil + defer output.Close() + return dockerRun(bytes.NewBuffer(filesystem), output, image) } func outputKernelInitrd(base string, kernel []byte, initrd []byte, cmdline string) error {