diff --git a/src/cmd/linuxkit/build.go b/src/cmd/linuxkit/build.go index 6c991a15e..37a00bbac 100644 --- a/src/cmd/linuxkit/build.go +++ b/src/cmd/linuxkit/build.go @@ -49,6 +49,7 @@ func build(args []string) { buildSize := buildCmd.String("size", "1024M", "Size for output image, if supported and fixed size") buildPull := buildCmd.Bool("pull", false, "Always pull images") buildDisableTrust := buildCmd.Bool("disable-content-trust", false, "Skip image trust verification specified in trust section of config (default false)") + buildDecompressKernel := buildCmd.Bool("decompress-kernel", false, "Decompress the Linux kernel (default false)") buildCmd.Var(&buildFormats, "format", "Formats to create [ "+strings.Join(outputTypes, " ")+" ]") if err := buildCmd.Parse(args); err != nil { @@ -203,7 +204,7 @@ func build(args []string) { if moby.Streamable(buildFormats[0]) { tp = buildFormats[0] } - err = moby.Build(m, w, *buildPull, tp) + err = moby.Build(m, w, *buildPull, tp, *buildDecompressKernel) if err != nil { log.Fatalf("%v", err) } diff --git a/src/cmd/linuxkit/moby/build.go b/src/cmd/linuxkit/moby/build.go index 932e6d8d4..8f307557a 100644 --- a/src/cmd/linuxkit/moby/build.go +++ b/src/cmd/linuxkit/moby/build.go @@ -142,7 +142,7 @@ func outputImage(image *Image, section string, prefix string, m Moby, idMap map[ } // Build performs the actual build process -func Build(m Moby, w io.Writer, pull bool, tp string) error { +func Build(m Moby, w io.Writer, pull bool, tp string, decompressKernel bool) error { if MobyDir == "" { MobyDir = defaultMobyConfigDir() } @@ -179,7 +179,7 @@ func Build(m Moby, w io.Writer, pull bool, tp string) error { if m.Kernel.ref != nil { // get kernel and initrd tarball and ucode cpio archive from container log.Infof("Extract kernel image: %s", m.Kernel.ref) - kf := newKernelFilter(iw, m.Kernel.Cmdline, m.Kernel.Binary, m.Kernel.Tar, m.Kernel.UCode) + kf := newKernelFilter(iw, m.Kernel.Cmdline, m.Kernel.Binary, m.Kernel.Tar, m.Kernel.UCode, decompressKernel) err := ImageTar(m.Kernel.ref, "", kf, enforceContentTrust(m.Kernel.ref.String(), &m.Trust), pull, "") if err != nil { return fmt.Errorf("Failed to extract kernel image and tarball: %v", err) @@ -255,20 +255,21 @@ func Build(m Moby, w io.Writer, pull bool, tp string) error { // kernelFilter is a tar.Writer that transforms a kernel image into the output we want on underlying tar writer type kernelFilter struct { - tw *tar.Writer - buffer *bytes.Buffer - hdr *tar.Header - cmdline string - kernel string - tar string - ucode string - discard bool - foundKernel bool - foundKTar bool - foundUCode bool + tw *tar.Writer + buffer *bytes.Buffer + hdr *tar.Header + cmdline string + kernel string + tar string + ucode string + decompressKernel bool + discard bool + foundKernel bool + foundKTar bool + foundUCode bool } -func newKernelFilter(tw *tar.Writer, cmdline string, kernel string, tar, ucode *string) *kernelFilter { +func newKernelFilter(tw *tar.Writer, cmdline string, kernel string, tar, ucode *string, decompressKernel bool) *kernelFilter { tarName, kernelName, ucodeName := "kernel.tar", "kernel", "" if tar != nil { tarName = *tar @@ -282,7 +283,7 @@ func newKernelFilter(tw *tar.Writer, cmdline string, kernel string, tar, ucode * if ucode != nil { ucodeName = *ucode } - return &kernelFilter{tw: tw, cmdline: cmdline, kernel: kernelName, tar: tarName, ucode: ucodeName} + return &kernelFilter{tw: tw, cmdline: cmdline, kernel: kernelName, tar: tarName, ucode: ucodeName, decompressKernel: decompressKernel} } func (k *kernelFilter) finishTar() error { diff --git a/src/cmd/linuxkit/moby/linuxkit.go b/src/cmd/linuxkit/moby/linuxkit.go index c77764ab9..56cde4619 100644 --- a/src/cmd/linuxkit/moby/linuxkit.go +++ b/src/cmd/linuxkit/moby/linuxkit.go @@ -62,7 +62,7 @@ func ensureLinuxkitImage(name string) error { return err } defer os.Remove(tf.Name()) - Build(m, tf, false, "") + Build(m, tf, false, "", false) if err := tf.Close(); err != nil { return err }