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"
)
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
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)
}
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)
return err
}
log.Debugf("docker run (input): %s...Done", strings.Join(args, " "))
return stdout, nil
return nil
}
func dockerCreate(image string) (string, error) {

View File

@ -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 {