client/image_tag.go
4f0d95fa
 package client // import "github.com/docker/docker/client"
7c36a1af
 
 import (
7d62e40f
 	"context"
7c36a1af
 	"net/url"
 
3a127939
 	"github.com/docker/distribution/reference"
a041697c
 	"github.com/pkg/errors"
7c36a1af
 )
 
 // ImageTag tags an image in the docker host
a041697c
 func (cli *Client) ImageTag(ctx context.Context, source, target string) error {
4a0704cd
 	if _, err := reference.ParseAnyReference(source); err != nil {
a041697c
 		return errors.Wrapf(err, "Error parsing reference: %q is not a valid repository/tag", source)
 	}
 
3a127939
 	ref, err := reference.ParseNormalizedNamed(target)
7c36a1af
 	if err != nil {
a041697c
 		return errors.Wrapf(err, "Error parsing reference: %q is not a valid repository/tag", target)
7c36a1af
 	}
 
3a127939
 	if _, isCanonical := ref.(reference.Canonical); isCanonical {
7c36a1af
 		return errors.New("refusing to create a tag with a digest reference")
 	}
 
3a127939
 	ref = reference.TagNameOnly(ref)
7c36a1af
 
 	query := url.Values{}
3a127939
 	query.Set("repo", reference.FamiliarName(ref))
 	if tagged, ok := ref.(reference.Tagged); ok {
 		query.Set("tag", tagged.Tag())
 	}
7c36a1af
 
a041697c
 	resp, err := cli.post(ctx, "/images/"+source+"/tag", query, nil, nil)
7c36a1af
 	ensureReaderClosed(resp)
 	return err
 }