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 <rn@rneugeba.io>
This commit is contained in:
Rolf Neugebauer 2018-12-22 16:52:48 +00:00
parent 1616b18fb0
commit 02579b22e5
4 changed files with 83 additions and 57 deletions

View File

@ -54,6 +54,7 @@ var additions = map[string]addFun{
Name: "Dockerfile",
Mode: 0644,
Size: int64(len(dockerfile)),
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
if err := tw.WriteHeader(hdr); err != nil {
@ -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 {
@ -379,6 +381,7 @@ func (k *kernelFilter) WriteHeader(hdr *tar.Header) error {
Name: "boot/cmdline",
Mode: 0644,
Size: int64(len(k.cmdline)),
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
if err := tw.WriteHeader(whdr); err != nil {
@ -394,6 +397,7 @@ func (k *kernelFilter) WriteHeader(hdr *tar.Header) error {
Name: "boot/kernel",
Mode: hdr.Mode,
Size: hdr.Size,
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
k.buffer = new(bytes.Buffer)
@ -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 {
@ -420,6 +425,7 @@ func (k *kernelFilter) WriteHeader(hdr *tar.Header) error {
Name: "boot/ucode.cpio",
Mode: hdr.Mode,
Size: hdr.Size,
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
if err := tw.WriteHeader(whdr); err != nil {
@ -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,
@ -668,6 +675,7 @@ func filesystem(m Moby, tw *tar.Writer, idMap map[string]uint32) error {
hdr := &tar.Header{
Name: f.Path,
Mode: mode,
ModTime: defaultModTime,
Uid: int(uid),
Gid: int(gid),
Format: tar.FormatPAX,

View File

@ -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
@ -224,6 +227,7 @@ func ImageBundle(prefix string, ref *reference.Spec, config []byte, runtime Runt
Name: path.Join(prefix, "config.json"),
Mode: 0644,
Size: int64(len(config)),
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
if err := tw.WriteHeader(hdr); err != nil {
@ -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 {
@ -297,6 +304,7 @@ func ImageBundle(prefix string, ref *reference.Spec, config []byte, runtime Runt
Name: path.Join(prefix, "runtime.json"),
Mode: 0644,
Size: int64(len(runtimeConfig)),
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
if err := tw.WriteHeader(hdr); err != nil {

View File

@ -284,6 +284,7 @@ func tarInitrdKernel(kernel, initrd []byte, cmdline string) (*bytes.Buffer, erro
Name: "kernel",
Mode: 0600,
Size: int64(len(kernel)),
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
err := tw.WriteHeader(hdr)
@ -298,6 +299,7 @@ func tarInitrdKernel(kernel, initrd []byte, cmdline string) (*bytes.Buffer, erro
Name: "initrd.img",
Mode: 0600,
Size: int64(len(initrd)),
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
err = tw.WriteHeader(hdr)
@ -312,6 +314,7 @@ func tarInitrdKernel(kernel, initrd []byte, cmdline string) (*bytes.Buffer, erro
Name: "cmdline",
Mode: 0600,
Size: int64(len(cmdline)),
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
err = tw.WriteHeader(hdr)
@ -413,6 +416,7 @@ func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdlin
Name: "kernel",
Mode: 0644,
Size: int64(len(kernel)),
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
if err := tw.WriteHeader(hdr); err != nil {
@ -427,6 +431,7 @@ func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdlin
Name: "initrd.img",
Mode: 0644,
Size: int64(len(initrd)),
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
if err := tw.WriteHeader(hdr); err != nil {
@ -441,6 +446,7 @@ func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdlin
Name: "cmdline",
Mode: 0644,
Size: int64(len(cmdline)),
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
if err := tw.WriteHeader(hdr); err != nil {
@ -455,6 +461,7 @@ func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdlin
Name: "ucode.cpio",
Mode: 0644,
Size: int64(len(ucode)),
ModTime: defaultModTime,
Format: tar.FormatPAX,
}
if err := tw.WriteHeader(hdr); err != nil {

View File

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