Use pax tar format (#1809)

* Use PAX tar format

* Add test case
This commit is contained in:
Travis DePrato 2021-12-23 08:35:00 -08:00 committed by GitHub
parent 7ae8e7d740
commit ee95be1e27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 0 deletions

View File

@ -97,6 +97,8 @@ func (t *Tar) AddFileToTar(p string) error {
// this makes this layer unnecessarily differ from a cached layer which does contain this information
hdr.Uname = ""
hdr.Gname = ""
// use PAX format to preserve accurate mtime (match Docker behavior)
hdr.Format = tar.FormatPAX
hardlink, linkDst := t.checkHardlink(p, i)
if hardlink {

View File

@ -17,12 +17,15 @@ limitations under the License.
package util
import (
"archive/tar"
"bytes"
"compress/gzip"
"io"
"io/ioutil"
"os"
"path/filepath"
"testing"
"time"
"github.com/GoogleContainerTools/kaniko/testutil"
)
@ -57,6 +60,39 @@ func Test_IsLocalTarArchive(t *testing.T) {
}
}
func Test_AddFileToTar(t *testing.T) {
testDir, err := ioutil.TempDir("", "")
if err != nil {
t.Fatalf("err setting up temp dir: %v", err)
}
defer os.RemoveAll(testDir)
path := filepath.Join(testDir, regularFiles[0])
if err := ioutil.WriteFile(path, []byte("hello"), os.ModePerm); err != nil {
t.Fatal(err)
}
// use a pre-determined time with non-zero microseconds to avoid flakiness
mtime := time.UnixMicro(1635533172891395)
if err := os.Chtimes(path, mtime, mtime); err != nil {
t.Fatal(err)
}
buf := new(bytes.Buffer)
tarw := NewTar(buf)
if err := tarw.AddFileToTar(path); err != nil {
t.Fatal(err)
}
tarw.Close()
// Check that the mtime is correct (#1808)
tarReader := tar.NewReader(buf)
hdr, err := tarReader.Next()
if err != nil {
t.Fatal(err)
}
testutil.CheckDeepEqual(t, mtime, hdr.ModTime)
}
func setUpFilesAndTars(testDir string) error {
regularFilesAndContents := map[string]string{
regularFiles[0]: "",