imagetools: fix pushing same image with multiple names

containerd pusher can’t handle this case atm so we
need to make sure we always create a new resolver
for each name.

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
pull/815/head
Tonis Tiigi 3 years ago
parent 4690e14c40
commit b497587f21

@ -150,7 +150,7 @@ func (r *Resolver) Combine(ctx context.Context, in string, descs []ocispec.Descr
func (r *Resolver) Push(ctx context.Context, ref reference.Named, desc ocispec.Descriptor, dt []byte) error { func (r *Resolver) Push(ctx context.Context, ref reference.Named, desc ocispec.Descriptor, dt []byte) error {
ref = reference.TagNameOnly(ref) ref = reference.TagNameOnly(ref)
p, err := r.r.Pusher(ctx, ref.String()) p, err := r.resolver().Pusher(ctx, ref.String())
if err != nil { if err != nil {
return err return err
} }

@ -24,26 +24,29 @@ type Opt struct {
} }
type Resolver struct { type Resolver struct {
r remotes.Resolver auth docker.Authorizer
} }
func New(opt Opt) *Resolver { func New(opt Opt) *Resolver {
resolver := docker.NewResolver(docker.ResolverOptions{
Client: http.DefaultClient,
Credentials: toCredentialsFunc(opt.Auth),
})
return &Resolver{ return &Resolver{
r: resolver, auth: docker.NewDockerAuthorizer(docker.WithAuthCreds(toCredentialsFunc(opt.Auth)), docker.WithAuthClient(http.DefaultClient)),
} }
} }
func (r *Resolver) resolver() remotes.Resolver {
return docker.NewResolver(docker.ResolverOptions{
Authorizer: r.auth,
Client: http.DefaultClient,
})
}
func (r *Resolver) Resolve(ctx context.Context, in string) (string, ocispec.Descriptor, error) { func (r *Resolver) Resolve(ctx context.Context, in string) (string, ocispec.Descriptor, error) {
ref, err := parseRef(in) ref, err := parseRef(in)
if err != nil { if err != nil {
return "", ocispec.Descriptor{}, err return "", ocispec.Descriptor{}, err
} }
in, desc, err := r.r.Resolve(ctx, ref.String()) in, desc, err := r.resolver().Resolve(ctx, ref.String())
if err != nil { if err != nil {
return "", ocispec.Descriptor{}, err return "", ocispec.Descriptor{}, err
} }
@ -65,7 +68,7 @@ func (r *Resolver) Get(ctx context.Context, in string) ([]byte, ocispec.Descript
} }
func (r *Resolver) GetDescriptor(ctx context.Context, in string, desc ocispec.Descriptor) ([]byte, error) { func (r *Resolver) GetDescriptor(ctx context.Context, in string, desc ocispec.Descriptor) ([]byte, error) {
fetcher, err := r.r.Fetcher(ctx, in) fetcher, err := r.resolver().Fetcher(ctx, in)
if err != nil { if err != nil {
return nil, err return nil, err
} }

Loading…
Cancel
Save