Преглед на файлове

Merge pull request #47068 from vvoland/docker-save-fix-layers

image/save: Fix missing layers in manifest
Sebastiaan van Stijn преди 1 година
родител
ревизия
8f89f10b40
променени са 2 файла, в които са добавени 44 реда и са изтрити 0 реда
  1. 8 0
      image/tarexport/save.go
  2. 36 0
      integration/image/save_test.go

+ 8 - 0
image/tarexport/save.go

@@ -523,5 +523,13 @@ func (s *saveSession) saveLayer(id layer.ChainID, legacyImg image.V1Image, creat
 	if fs, ok := l.(distribution.Describable); ok {
 		src = fs.Descriptor()
 	}
+
+	if src.Digest == "" {
+		src = distribution.Descriptor{
+			MediaType: ocispec.MediaTypeImageLayer,
+			Digest:    lDgst,
+			Size:      l.Size(),
+		}
+	}
 	return src, nil
 }

+ 36 - 0
integration/image/save_test.go

@@ -15,11 +15,13 @@ import (
 
 	"github.com/cpuguy83/tar2go"
 	containertypes "github.com/docker/docker/api/types/container"
+	"github.com/docker/docker/api/types/versions"
 	"github.com/docker/docker/integration/internal/build"
 	"github.com/docker/docker/integration/internal/container"
 	"github.com/docker/docker/pkg/archive"
 	"github.com/docker/docker/testutil/fakecontext"
 	"github.com/opencontainers/go-digest"
+	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 	"gotest.tools/v3/assert"
 	"gotest.tools/v3/assert/cmp"
 	is "gotest.tools/v3/assert/cmp"
@@ -85,6 +87,40 @@ func TestSaveCheckTimes(t *testing.T) {
 	}
 }
 
+// Regression test for https://github.com/moby/moby/issues/47065
+func TestSaveCheckManifestLayers(t *testing.T) {
+	skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.44"), "OCI layout support was introduced in v25")
+	t.Parallel()
+
+	ctx := setupTest(t)
+	client := testEnv.APIClient()
+
+	const repoName = "busybox:latest"
+	img, _, err := client.ImageInspectWithRaw(ctx, repoName)
+	assert.NilError(t, err)
+
+	rdr, err := client.ImageSave(ctx, []string{repoName})
+	assert.NilError(t, err)
+
+	tarfs := tarIndexFS(t, rdr)
+
+	indexData, err := fs.ReadFile(tarfs, "index.json")
+	assert.NilError(t, err)
+
+	var index ocispec.Index
+	assert.NilError(t, json.Unmarshal(indexData, &index))
+
+	assert.Assert(t, is.Len(index.Manifests, 1))
+
+	manifestData, err := fs.ReadFile(tarfs, "blobs/sha256/"+index.Manifests[0].Digest.Encoded())
+	assert.NilError(t, err)
+
+	var manifest ocispec.Manifest
+	assert.NilError(t, json.Unmarshal(manifestData, &manifest))
+
+	assert.Check(t, is.Len(manifest.Layers, len(img.RootFS.Layers)))
+}
+
 func TestSaveRepoWithMultipleImages(t *testing.T) {
 	ctx := setupTest(t)
 	client := testEnv.APIClient()