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 <justin.cormack@docker.com>
This commit is contained in:
Justin Cormack 2017-08-02 13:36:29 +01:00
parent 305ad031e8
commit 2d930bc8e5
2 changed files with 29 additions and 52 deletions

View File

@ -21,48 +21,26 @@ import (
"golang.org/x/net/context" "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, " ")) log.Debugf("docker run (input): %s", strings.Join(args, " "))
docker, err := exec.LookPath("docker") docker, err := exec.LookPath("docker")
if err != nil { 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...) args = append([]string{"run", "--rm", "-i"}, args...)
cmd := exec.Command(docker, args...) cmd := exec.Command(docker, args...)
cmd.Stdin = input cmd.Stdin = input
cmd.Stdout = output
stderrPipe, err := cmd.StderrPipe() if err := cmd.Run(); err != nil {
if err != nil { if exitError, ok := err.(*exec.ExitError); ok {
return []byte{}, err return fmt.Errorf("docker run failed: %v output:\n%s", err, exitError.Stderr)
} }
return 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)
} }
log.Debugf("docker run (input): %s...Done", strings.Join(args, " ")) log.Debugf("docker run (input): %s...Done", strings.Join(args, " "))
return stdout, nil return nil
} }
func dockerCreate(image string) (string, error) { func dockerCreate(image string) (string, error) {

View File

@ -12,7 +12,7 @@ import (
) )
const ( 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" efi = "linuxkit/mkimage-iso-efi:5c2fc616bde288476a14f4f6dd0d273a66832822@sha256:876ef47ec2b30af40e70f1e98f496206eb430915867c4f9f400e1af47fd58d7c"
gcp = "linuxkit/mkimage-gcp:46716b3d3f7aa1a7607a3426fe0ccebc554b14ee@sha256:18d8e0482f65a2481f5b6ba1e7ce77723b246bf13bdb612be5e64df90297940c" gcp = "linuxkit/mkimage-gcp:46716b3d3f7aa1a7607a3426fe0ccebc554b14ee@sha256:18d8e0482f65a2481f5b6ba1e7ce77723b246bf13bdb612be5e64df90297940c"
vhd = "linuxkit/mkimage-vhd:a04c8480d41ca9cef6b7710bd45a592220c3acb2@sha256:ba373dc8ae5dc72685dbe4b872d8f588bc68b2114abd8bdc6a74d82a2b62cce3" vhd = "linuxkit/mkimage-vhd:a04c8480d41ca9cef6b7710bd45a592220c3acb2@sha256:ba373dc8ae5dc72685dbe4b872d8f588bc68b2114abd8bdc6a74d82a2b62cce3"
@ -33,11 +33,7 @@ var outFuns = map[string]func(string, []byte, int, bool) error{
return nil return nil
}, },
"iso-bios": func(base string, image []byte, size int, hyperkit bool) error { "iso-bios": func(base string, image []byte, size int, hyperkit bool) error {
kernel, initrd, cmdline, err := tarToInitrd(image) err := outputIso(bios, base+".iso", image)
if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err)
}
err = outputImg(bios, base+".iso", kernel, initrd, cmdline)
if err != nil { if err != nil {
return fmt.Errorf("Error writing iso-bios output: %v", err) 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 { if err != nil {
return err return err
} }
img, err := dockerRun(buf, image, cmdline) output, err := os.Create(filename)
if err != nil { if err != nil {
return err return err
} }
err = ioutil.WriteFile(filename, img, os.FileMode(0644)) defer output.Close()
if err != nil { return dockerRun(buf, output, image, cmdline)
return err
}
return nil
} }
// this should replace the other version for types that can specify a size // 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 { if err != nil {
return err return err
} }
var img []byte output, err := os.Create(filename)
if err != nil {
return err
}
defer output.Close()
if size == 0 { if size == 0 {
img, err = dockerRun(buf, image) return dockerRun(buf, output, image)
} else {
img, err = dockerRun(buf, image, fmt.Sprintf("%dM", size))
} }
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 { if err != nil {
return err return err
} }
err = ioutil.WriteFile(filename, img, os.FileMode(0644)) defer output.Close()
if err != nil { return dockerRun(bytes.NewBuffer(filesystem), output, image)
return err
}
return nil
} }
func outputKernelInitrd(base string, kernel []byte, initrd []byte, cmdline string) error { func outputKernelInitrd(base string, kernel []byte, initrd []byte, cmdline string) error {