From 018a8235e2903b08d35409401d1ed06aa2fb7cd0 Mon Sep 17 00:00:00 2001 From: user123456 Date: Fri, 13 Jun 2025 11:02:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=95=9C=E5=83=8F=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E7=BC=93=E5=AD=98=E6=B1=A1=E6=9F=93=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/imagetar.go | 27 ++++++++++++++++----------- src/token_cache.go | 9 +++++++++ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/imagetar.go b/src/imagetar.go index 23d89f1..c668323 100644 --- a/src/imagetar.go +++ b/src/imagetar.go @@ -78,7 +78,7 @@ func (is *ImageStreamer) StreamImageToWriter(ctx context.Context, imageRef strin contextOptions := append(is.remoteOptions, remote.WithContext(ctx)) - desc, err := is.getImageDescriptor(ref, contextOptions) + desc, err := is.getImageDescriptorWithPlatform(ref, contextOptions, options.Platform) if err != nil { return fmt.Errorf("获取镜像描述失败: %w", err) } @@ -94,6 +94,11 @@ func (is *ImageStreamer) StreamImageToWriter(ctx context.Context, imageRef strin // getImageDescriptor 获取镜像描述符 func (is *ImageStreamer) getImageDescriptor(ref name.Reference, options []remote.Option) (*remote.Descriptor, error) { + return is.getImageDescriptorWithPlatform(ref, options, "") +} + +// 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 { @@ -103,14 +108,14 @@ func (is *ImageStreamer) getImageDescriptor(ref name.Reference, options []remote } if reference != "" { - cacheKey := buildManifestCacheKey(ref.Context().String(), reference) - if cachedItem := globalCache.Get(cacheKey); cachedItem != nil { - desc := &remote.Descriptor{ - Manifest: cachedItem.Data, + 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 } - log.Printf("使用缓存的manifest: %s", ref.String()) - return desc, nil - } } } @@ -128,13 +133,13 @@ func (is *ImageStreamer) getImageDescriptor(ref name.Reference, options []remote } if reference != "" { - cacheKey := buildManifestCacheKey(ref.Context().String(), 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 (TTL: %v)", ref.String(), ttl) + log.Printf("缓存manifest: %s (平台: %s, TTL: %v)", ref.String(), platform, ttl) } } @@ -376,7 +381,7 @@ func (is *ImageStreamer) streamSingleImageForBatch(ctx context.Context, tarWrite contextOptions := append(is.remoteOptions, remote.WithContext(ctx)) - desc, err := is.getImageDescriptor(ref, contextOptions) + desc, err := is.getImageDescriptorWithPlatform(ref, contextOptions, options.Platform) if err != nil { return nil, nil, fmt.Errorf("获取镜像描述失败: %w", err) } diff --git a/src/token_cache.go b/src/token_cache.go index a30fb58..b985fb3 100644 --- a/src/token_cache.go +++ b/src/token_cache.go @@ -78,6 +78,15 @@ func buildManifestCacheKey(imageRef, reference string) string { return buildCacheKey("manifest", key) } +// buildManifestCacheKeyWithPlatform 构建包含平台信息的manifest缓存key +func buildManifestCacheKeyWithPlatform(imageRef, reference, platform string) string { + if platform == "" { + platform = "default" + } + key := fmt.Sprintf("%s:%s@%s", imageRef, reference, platform) + return buildCacheKey("manifest", key) +} + // getManifestTTL 根据引用类型智能确定TTL func getManifestTTL(reference string) time.Duration { cfg := GetConfig()