From a67ef6c52c59f580a34e7deca463aed5dfdb6647 Mon Sep 17 00:00:00 2001 From: user123456 Date: Fri, 13 Jun 2025 17:00:47 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A6=BB=E7=BA=BF=E9=95=9C=E5=83=8F=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E5=8E=BB=E6=8E=89=E7=BC=93=E5=AD=98=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E7=BC=93=E5=AD=98=E4=B8=8D=E5=AE=8C=E6=95=B4=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E7=A9=BA=E6=8C=87=E9=92=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/imagetar.go | 51 +++++-------------------------------------------- 1 file changed, 5 insertions(+), 46 deletions(-) diff --git a/src/imagetar.go b/src/imagetar.go index 64c8fce..d08de5b 100644 --- a/src/imagetar.go +++ b/src/imagetar.go @@ -211,51 +211,8 @@ func (is *ImageStreamer) getImageDescriptor(ref name.Reference, options []remote // getImageDescriptorWithPlatform 获取指定平台的镜像描述符 func (is *ImageStreamer) getImageDescriptorWithPlatform(ref name.Reference, options []remote.Option, platform string) (*remote.Descriptor, error) { - if isCacheEnabled() { - var reference string - if tagged, ok := ref.(name.Tag); ok { - reference = tagged.TagStr() - } else if digested, ok := ref.(name.Digest); ok { - reference = digested.DigestStr() - } - - if reference != "" { - cacheKey := buildManifestCacheKeyWithPlatform(ref.Context().String(), reference, platform) - if cachedItem := globalCache.Get(cacheKey); cachedItem != nil { - desc := &remote.Descriptor{ - Manifest: cachedItem.Data, - } - log.Printf("使用缓存的manifest: %s (平台: %s)", ref.String(), platform) - return desc, nil - } - } - } - - desc, err := remote.Get(ref, options...) - if err != nil { - return nil, err - } - - if isCacheEnabled() { - var reference string - if tagged, ok := ref.(name.Tag); ok { - reference = tagged.TagStr() - } else if digested, ok := ref.(name.Digest); ok { - reference = digested.DigestStr() - } - - if reference != "" { - cacheKey := buildManifestCacheKeyWithPlatform(ref.Context().String(), reference, platform) - ttl := getManifestTTL(reference) - headers := map[string]string{ - "Docker-Content-Digest": desc.Digest.String(), - } - globalCache.Set(cacheKey, desc.Manifest, string(desc.MediaType), headers, ttl) - log.Printf("缓存manifest: %s (平台: %s, TTL: %v)", ref.String(), platform, ttl) - } - } - - return desc, nil + // 直接从网络获取完整的descriptor,确保对象完整性 + return remote.Get(ref, options...) } // StreamImageToGin 流式响应到Gin @@ -503,7 +460,7 @@ func (is *ImageStreamer) streamSingleImageForBatch(ctx context.Context, tarWrite switch desc.MediaType { case types.OCIImageIndex, types.DockerManifestList: - // 处理多架构镜像,复用单个下载的逻辑 + // 处理多架构镜像 img, err := is.selectPlatformImage(desc, options) if err != nil { return nil, nil, fmt.Errorf("选择平台镜像失败: %w", err) @@ -574,6 +531,8 @@ func (is *ImageStreamer) streamSingleImageForBatch(ctx context.Context, tarWrite return manifest, repositories, nil } + + // selectPlatformImage 从多架构镜像中选择合适的平台镜像 func (is *ImageStreamer) selectPlatformImage(desc *remote.Descriptor, options *StreamOptions) (v1.Image, error) { index, err := desc.ImageIndex()