diff --git a/cache/contenthash/filehash.go b/cache/contenthash/filehash.go index 8f936fef..27890421 100644 --- a/cache/contenthash/filehash.go +++ b/cache/contenthash/filehash.go @@ -40,6 +40,9 @@ func NewFileHash(path string, fi os.FileInfo) (hash.Hash, error) { } func NewFromStat(stat *fstypes.Stat) (hash.Hash, error) { + // Clear the socket bit since archive/tar.FileInfoHeader does not handle it + stat.Mode &^= uint32(os.ModeSocket) + fi := &statInfo{stat} hdr, err := tar.FileInfoHeader(fi, stat.Linkname) if err != nil { diff --git a/client/client_test.go b/client/client_test.go index 1e07fb64..90a9953d 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -113,6 +113,7 @@ func TestIntegration(t *testing.T) { testCacheMountNoCache, testExporterTargetExists, testTarExporterWithSocket, + testTarExporterWithSocketCopy, testTarExporterSymlink, testMultipleRegistryCacheImportExport, testSourceMap, @@ -1653,6 +1654,30 @@ func testTarExporterWithSocket(t *testing.T, sb integration.Sandbox) { require.NoError(t, err) } +func testTarExporterWithSocketCopy(t *testing.T, sb integration.Sandbox) { + if os.Getenv("TEST_DOCKERD") == "1" { + t.Skip("tar exporter is temporarily broken on dockerd") + } + + requiresLinux(t) + c, err := New(context.TODO(), sb.Address()) + require.NoError(t, err) + defer c.Close() + + alpine := llb.Image("docker.io/library/alpine:latest") + state := alpine.Run(llb.Args([]string{"sh", "-c", "nc -l -s local:/root/socket.sock & usleep 100000; kill %1"})).Root() + + fa := llb.Copy(state, "/root", "/roo2", &llb.CopyInfo{}) + + scratchCopy := llb.Scratch().File(fa) + + def, err := scratchCopy.Marshal(context.TODO()) + require.NoError(t, err) + + _, err = c.Solve(context.TODO(), def, SolveOpt{}, nil) + require.NoError(t, err) +} + // moby/buildkit#1418 func testTarExporterSymlink(t *testing.T, sb integration.Sandbox) { requiresLinux(t)