Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pkg/cli/admin/catalog/mirror.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ func (o *MirrorCatalogOptions) Complete(cmd *cobra.Command, args []string) error
a.SecurityOptions = o.SecurityOptions
a.FilterOptions = o.FilterOptions
a.ParallelOptions = o.ParallelOptions
a.ForceManifestList = true
a.Mappings = []imgmirror.Mapping{{
Source: fromRef[0],
Destination: toRef,
Expand Down
6 changes: 3 additions & 3 deletions pkg/cli/image/manifest/manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ func FirstManifest(ctx context.Context, from imagereference.DockerImageReference
}

originalSrcDigest := srcDigest
srcManifests, srcManifest, srcDigest, err := ProcessManifestList(ctx, srcDigest, srcManifest, manifests, from, filterFn)
srcManifests, srcManifest, srcDigest, err := ProcessManifestList(ctx, srcDigest, srcManifest, manifests, from, filterFn, false)
if err != nil {
return nil, ManifestLocation{}, err
}
Expand Down Expand Up @@ -330,7 +330,7 @@ func ManifestToImageConfig(ctx context.Context, srcManifest distribution.Manifes
}
}

func ProcessManifestList(ctx context.Context, srcDigest digest.Digest, srcManifest distribution.Manifest, manifests distribution.ManifestService, ref imagereference.DockerImageReference, filterFn FilterFunc) ([]distribution.Manifest, distribution.Manifest, digest.Digest, error) {
func ProcessManifestList(ctx context.Context, srcDigest digest.Digest, srcManifest distribution.Manifest, manifests distribution.ManifestService, ref imagereference.DockerImageReference, filterFn FilterFunc, forceManifestList bool) ([]distribution.Manifest, distribution.Manifest, digest.Digest, error) {
var srcManifests []distribution.Manifest
switch t := srcManifest.(type) {
case *manifestlist.DeserializedManifestList:
Expand Down Expand Up @@ -379,7 +379,7 @@ func ProcessManifestList(ctx context.Context, srcDigest digest.Digest, srcManife
}

switch {
case len(srcManifests) == 1:
case len(srcManifests) == 1 && !forceManifestList:
manifestDigest, err := registryclient.ContentDigestForManifest(srcManifests[0], srcDigest.Algorithm())
if err != nil {
return nil, nil, "", err
Expand Down
6 changes: 5 additions & 1 deletion pkg/cli/image/mirror/mirror.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ type MirrorImageOptions struct {
SkipMultipleScopes bool
SkipMissing bool
Force bool
ForceManifestList bool

MaxRegistry int
ParallelOptions imagemanifest.ParallelOptions
Expand Down Expand Up @@ -144,6 +145,9 @@ func NewCmdMirrorImage(name string, streams genericclioptions.IOStreams) *cobra.
o.FilterOptions.Bind(flag)
o.ParallelOptions.Bind(flag)

// Always mirror manifestlist if available
o.ForceManifestList = true

flag.BoolVar(&o.DryRun, "dry-run", o.DryRun, "Print the actions that would be taken and exit without writing to the destinations.")
flag.BoolVar(&o.SkipMissing, "skip-missing", o.SkipMissing, "If an input image is not found, skip them.")
flag.BoolVar(&o.SkipMount, "skip-mount", o.SkipMount, "Always push layers instead of cross-mounting them")
Expand Down Expand Up @@ -462,7 +466,7 @@ func (o *MirrorImageOptions) plan() (*plan, error) {

// filter or load manifest list as appropriate
originalSrcDigest := srcDigest
srcManifests, srcManifest, srcDigest, err := imagemanifest.ProcessManifestList(ctx, srcDigest, srcManifest, manifests, src.ref.Ref, o.FilterOptions.IncludeAll)
srcManifests, srcManifest, srcDigest, err := imagemanifest.ProcessManifestList(ctx, srcDigest, srcManifest, manifests, src.ref.Ref, o.FilterOptions.IncludeAll, o.ForceManifestList)
if err != nil {
plan.AddError(retrieverError{src: src.ref, err: err})
return
Expand Down