From ef017ac223af32674030c8be9da408488567c2dc Mon Sep 17 00:00:00 2001 From: Justin Cormack Date: Fri, 28 Apr 2017 12:48:04 +0100 Subject: [PATCH] Support both kernel and bzImage for now Also do not require `tar` to be in container, use the standard image export code that we already have and find the files we want. Signed-off-by: Justin Cormack --- cmd/moby/build.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/cmd/moby/build.go b/cmd/moby/build.go index 013e91ac9..390d69554 100644 --- a/cmd/moby/build.go +++ b/cmd/moby/build.go @@ -117,18 +117,19 @@ func buildInternal(name string, pull bool, config []byte) { } } // get kernel and initrd tarball from container - // TODO examine contents to see what names they might have log.Infof("Extract kernel image: %s", m.Kernel.Image) const ( - kernelName = "kernel" - ktarName = "kernel.tar" + kernelName = "kernel" + kernelAltName = "bzImage" + ktarName = "kernel.tar" ) - out, err := dockerRun(m.Kernel.Image, "tar", "cf", "-", kernelName, ktarName) + out, err := ImageExtract(m.Kernel.Image, "") if err != nil { log.Fatalf("Failed to extract kernel image and tarball: %v", err) } buf := bytes.NewBuffer(out) - kernel, ktar, err := untarKernel(buf, kernelName, ktarName) + + kernel, ktar, err := untarKernel(buf, kernelName, kernelAltName, ktarName) if err != nil { log.Fatalf("Could not extract kernel image and filesystem from tarball. %v", err) } @@ -218,10 +219,11 @@ func buildInternal(name string, pull bool, config []byte) { } } -func untarKernel(buf *bytes.Buffer, kernelName, ktarName string) (*bytes.Buffer, *bytes.Buffer, error) { +func untarKernel(buf *bytes.Buffer, kernelName, kernelAltName, ktarName string) (*bytes.Buffer, *bytes.Buffer, error) { tr := tar.NewReader(buf) var kernel, ktar *bytes.Buffer + foundKernel := false for { hdr, err := tr.Next() @@ -232,7 +234,11 @@ func untarKernel(buf *bytes.Buffer, kernelName, ktarName string) (*bytes.Buffer, log.Fatalln(err) } switch hdr.Name { - case kernelName: + case kernelName, kernelAltName: + if foundKernel { + return nil, nil, errors.New("found more than one possible kernel image") + } + foundKernel = true kernel = new(bytes.Buffer) _, err := io.Copy(kernel, tr) if err != nil {