From 02579b22e53289773b1a65a84499a6b3e9f40f22 Mon Sep 17 00:00:00 2001 From: Rolf Neugebauer Date: Sat, 22 Dec 2018 16:52:48 +0000 Subject: [PATCH] build: Fix the ModTime for files created during build When creating files for the "intermediate" tar ball, fix the ModTime. This reduces the difference between LinuxKit images build from identical inputs. Signed-off-by: Rolf Neugebauer --- src/cmd/linuxkit/moby/build.go | 50 +++++++++++++++----------- src/cmd/linuxkit/moby/image.go | 24 ++++++++----- src/cmd/linuxkit/moby/output.go | 63 ++++++++++++++++++--------------- src/cmd/linuxkit/moby/util.go | 3 ++ 4 files changed, 83 insertions(+), 57 deletions(-) diff --git a/src/cmd/linuxkit/moby/build.go b/src/cmd/linuxkit/moby/build.go index 484aa89d3..93d83336c 100644 --- a/src/cmd/linuxkit/moby/build.go +++ b/src/cmd/linuxkit/moby/build.go @@ -51,10 +51,11 @@ var additions = map[string]addFun{ "docker": func(tw *tar.Writer) error { log.Infof(" Adding Dockerfile") hdr := &tar.Header{ - Name: "Dockerfile", - Mode: 0644, - Size: int64(len(dockerfile)), - Format: tar.FormatPAX, + Name: "Dockerfile", + Mode: 0644, + Size: int64(len(dockerfile)), + ModTime: defaultModTime, + Format: tar.FormatPAX, } if err := tw.WriteHeader(hdr); err != nil { return err @@ -368,6 +369,7 @@ func (k *kernelFilter) WriteHeader(hdr *tar.Header) error { Name: "boot", Mode: 0755, Typeflag: tar.TypeDir, + ModTime: defaultModTime, Format: tar.FormatPAX, } if err := tw.WriteHeader(whdr); err != nil { @@ -376,10 +378,11 @@ func (k *kernelFilter) WriteHeader(hdr *tar.Header) error { } // add the cmdline in /boot/cmdline whdr := &tar.Header{ - Name: "boot/cmdline", - Mode: 0644, - Size: int64(len(k.cmdline)), - Format: tar.FormatPAX, + Name: "boot/cmdline", + Mode: 0644, + Size: int64(len(k.cmdline)), + ModTime: defaultModTime, + Format: tar.FormatPAX, } if err := tw.WriteHeader(whdr); err != nil { return err @@ -391,10 +394,11 @@ func (k *kernelFilter) WriteHeader(hdr *tar.Header) error { } // Stash the kernel header and prime the buffer for the kernel k.hdr = &tar.Header{ - Name: "boot/kernel", - Mode: hdr.Mode, - Size: hdr.Size, - Format: tar.FormatPAX, + Name: "boot/kernel", + Mode: hdr.Mode, + Size: hdr.Size, + ModTime: defaultModTime, + Format: tar.FormatPAX, } k.buffer = new(bytes.Buffer) case k.tar: @@ -410,6 +414,7 @@ func (k *kernelFilter) WriteHeader(hdr *tar.Header) error { Name: "boot", Mode: 0755, Typeflag: tar.TypeDir, + ModTime: defaultModTime, Format: tar.FormatPAX, } if err := tw.WriteHeader(whdr); err != nil { @@ -417,10 +422,11 @@ func (k *kernelFilter) WriteHeader(hdr *tar.Header) error { } } whdr := &tar.Header{ - Name: "boot/ucode.cpio", - Mode: hdr.Mode, - Size: hdr.Size, - Format: tar.FormatPAX, + Name: "boot/ucode.cpio", + Mode: hdr.Mode, + Size: hdr.Size, + ModTime: defaultModTime, + Format: tar.FormatPAX, } if err := tw.WriteHeader(whdr); err != nil { return err @@ -653,6 +659,7 @@ func filesystem(m Moby, tw *tar.Writer, idMap map[string]uint32) error { Name: root, Typeflag: tar.TypeDir, Mode: dirMode, + ModTime: defaultModTime, Uid: int(uid), Gid: int(gid), Format: tar.FormatPAX, @@ -666,11 +673,12 @@ func filesystem(m Moby, tw *tar.Writer, idMap map[string]uint32) error { } addedFiles[f.Path] = true hdr := &tar.Header{ - Name: f.Path, - Mode: mode, - Uid: int(uid), - Gid: int(gid), - Format: tar.FormatPAX, + Name: f.Path, + Mode: mode, + ModTime: defaultModTime, + Uid: int(uid), + Gid: int(gid), + Format: tar.FormatPAX, } if f.Directory { if f.Contents != nil { diff --git a/src/cmd/linuxkit/moby/image.go b/src/cmd/linuxkit/moby/image.go index ef16416a1..7d7207278 100644 --- a/src/cmd/linuxkit/moby/image.go +++ b/src/cmd/linuxkit/moby/image.go @@ -71,6 +71,7 @@ func tarPrefix(path string, tw tarWriter) error { hdr := &tar.Header{ Name: mkdir, Mode: 0755, + ModTime: defaultModTime, Typeflag: tar.TypeDir, Format: tar.FormatPAX, } @@ -154,6 +155,7 @@ func ImageTar(ref *reference.Spec, prefix string, tw tarWriter, trust bool, pull contents := replace[hdr.Name] hdr.Size = int64(len(contents)) hdr.Name = prefix + hdr.Name + hdr.ModTime = defaultModTime log.Debugf("image tar: %s %s add %s", ref, prefix, hdr.Name) if err := tw.WriteHeader(hdr); err != nil { return err @@ -169,6 +171,7 @@ func ImageTar(ref *reference.Spec, prefix string, tw tarWriter, trust bool, pull hdr.Size = 0 hdr.Typeflag = tar.TypeSymlink hdr.Linkname = resolv + hdr.ModTime = defaultModTime log.Debugf("image tar: %s %s add resolv symlink /etc/resolv.conf -> %s", ref, prefix, resolv) if err := tw.WriteHeader(hdr); err != nil { return err @@ -221,10 +224,11 @@ func ImageBundle(prefix string, ref *reference.Spec, config []byte, runtime Runt } hdr := &tar.Header{ - Name: path.Join(prefix, "config.json"), - Mode: 0644, - Size: int64(len(config)), - Format: tar.FormatPAX, + Name: path.Join(prefix, "config.json"), + Mode: 0644, + Size: int64(len(config)), + ModTime: defaultModTime, + Format: tar.FormatPAX, } if err := tw.WriteHeader(hdr); err != nil { return err @@ -242,6 +246,7 @@ func ImageBundle(prefix string, ref *reference.Spec, config []byte, runtime Runt Name: tmp, Mode: 0755, Typeflag: tar.TypeDir, + ModTime: defaultModTime, Format: tar.FormatPAX, } if err := tw.WriteHeader(hdr); err != nil { @@ -252,6 +257,7 @@ func ImageBundle(prefix string, ref *reference.Spec, config []byte, runtime Runt Name: path.Join(prefix, "rootfs"), Mode: 0755, Typeflag: tar.TypeDir, + ModTime: defaultModTime, Format: tar.FormatPAX, } if err := tw.WriteHeader(hdr); err != nil { @@ -271,6 +277,7 @@ func ImageBundle(prefix string, ref *reference.Spec, config []byte, runtime Runt Name: path.Join(prefix, "rootfs"), Mode: 0755, Typeflag: tar.TypeDir, + ModTime: defaultModTime, Format: tar.FormatPAX, } if err := tw.WriteHeader(hdr); err != nil { @@ -294,10 +301,11 @@ func ImageBundle(prefix string, ref *reference.Spec, config []byte, runtime Runt } hdr = &tar.Header{ - Name: path.Join(prefix, "runtime.json"), - Mode: 0644, - Size: int64(len(runtimeConfig)), - Format: tar.FormatPAX, + Name: path.Join(prefix, "runtime.json"), + Mode: 0644, + Size: int64(len(runtimeConfig)), + ModTime: defaultModTime, + Format: tar.FormatPAX, } if err := tw.WriteHeader(hdr); err != nil { return err diff --git a/src/cmd/linuxkit/moby/output.go b/src/cmd/linuxkit/moby/output.go index 4b51e3ab1..dc8f90e01 100644 --- a/src/cmd/linuxkit/moby/output.go +++ b/src/cmd/linuxkit/moby/output.go @@ -281,10 +281,11 @@ func tarInitrdKernel(kernel, initrd []byte, cmdline string) (*bytes.Buffer, erro buf := new(bytes.Buffer) tw := tar.NewWriter(buf) hdr := &tar.Header{ - Name: "kernel", - Mode: 0600, - Size: int64(len(kernel)), - Format: tar.FormatPAX, + Name: "kernel", + Mode: 0600, + Size: int64(len(kernel)), + ModTime: defaultModTime, + Format: tar.FormatPAX, } err := tw.WriteHeader(hdr) if err != nil { @@ -295,10 +296,11 @@ func tarInitrdKernel(kernel, initrd []byte, cmdline string) (*bytes.Buffer, erro return buf, err } hdr = &tar.Header{ - Name: "initrd.img", - Mode: 0600, - Size: int64(len(initrd)), - Format: tar.FormatPAX, + Name: "initrd.img", + Mode: 0600, + Size: int64(len(initrd)), + ModTime: defaultModTime, + Format: tar.FormatPAX, } err = tw.WriteHeader(hdr) if err != nil { @@ -309,10 +311,11 @@ func tarInitrdKernel(kernel, initrd []byte, cmdline string) (*bytes.Buffer, erro return buf, err } hdr = &tar.Header{ - Name: "cmdline", - Mode: 0600, - Size: int64(len(cmdline)), - Format: tar.FormatPAX, + Name: "cmdline", + Mode: 0600, + Size: int64(len(cmdline)), + ModTime: defaultModTime, + Format: tar.FormatPAX, } err = tw.WriteHeader(hdr) if err != nil { @@ -410,10 +413,11 @@ func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdlin tw := tar.NewWriter(f) if len(kernel) != 0 { hdr := &tar.Header{ - Name: "kernel", - Mode: 0644, - Size: int64(len(kernel)), - Format: tar.FormatPAX, + Name: "kernel", + Mode: 0644, + Size: int64(len(kernel)), + ModTime: defaultModTime, + Format: tar.FormatPAX, } if err := tw.WriteHeader(hdr); err != nil { return err @@ -424,10 +428,11 @@ func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdlin } if len(initrd) != 0 { hdr := &tar.Header{ - Name: "initrd.img", - Mode: 0644, - Size: int64(len(initrd)), - Format: tar.FormatPAX, + Name: "initrd.img", + Mode: 0644, + Size: int64(len(initrd)), + ModTime: defaultModTime, + Format: tar.FormatPAX, } if err := tw.WriteHeader(hdr); err != nil { return err @@ -438,10 +443,11 @@ func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdlin } if len(cmdline) != 0 { hdr := &tar.Header{ - Name: "cmdline", - Mode: 0644, - Size: int64(len(cmdline)), - Format: tar.FormatPAX, + Name: "cmdline", + Mode: 0644, + Size: int64(len(cmdline)), + ModTime: defaultModTime, + Format: tar.FormatPAX, } if err := tw.WriteHeader(hdr); err != nil { return err @@ -452,10 +458,11 @@ func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdlin } if len(ucode) != 0 { hdr := &tar.Header{ - Name: "ucode.cpio", - Mode: 0644, - Size: int64(len(ucode)), - Format: tar.FormatPAX, + Name: "ucode.cpio", + Mode: 0644, + Size: int64(len(ucode)), + ModTime: defaultModTime, + Format: tar.FormatPAX, } if err := tw.WriteHeader(hdr); err != nil { return err diff --git a/src/cmd/linuxkit/moby/util.go b/src/cmd/linuxkit/moby/util.go index 56afefb88..8765f87f6 100644 --- a/src/cmd/linuxkit/moby/util.go +++ b/src/cmd/linuxkit/moby/util.go @@ -2,11 +2,14 @@ package moby import ( "path/filepath" + "time" ) var ( // MobyDir is the location of the cache directory, defaults to ~/.moby MobyDir string + // Default ModTime for files created during build. Roughly the time LinuxKit got open sourced. + defaultModTime = time.Date(2017, time.April, 18, 16, 30, 0, 0, time.UTC) ) func defaultMobyConfigDir() string {