TagImage is just a wrapper for TagImageWithReference which parses the
repo and tag into a reference. Change TagImageWithReference into
TagImage and move the responsibility of reference parsing to caller.
Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
| ... | ... |
@@ -21,7 +21,7 @@ import ( |
| 21 | 21 |
// ImageComponent provides an interface for working with images |
| 22 | 22 |
type ImageComponent interface {
|
| 23 | 23 |
SquashImage(from string, to string) (string, error) |
| 24 |
- TagImageWithReference(context.Context, image.ID, reference.Named) error |
|
| 24 |
+ TagImage(context.Context, image.ID, reference.Named) error |
|
| 25 | 25 |
} |
| 26 | 26 |
|
| 27 | 27 |
// Builder defines interface for running a build |
| ... | ... |
@@ -13,7 +13,7 @@ import ( |
| 13 | 13 |
// tagImages creates image tags for the imageID. |
| 14 | 14 |
func tagImages(ctx context.Context, ic ImageComponent, stdout io.Writer, imageID image.ID, repoAndTags []reference.Named) error {
|
| 15 | 15 |
for _, rt := range repoAndTags {
|
| 16 |
- if err := ic.TagImageWithReference(ctx, imageID, rt); err != nil {
|
|
| 16 |
+ if err := ic.TagImage(ctx, imageID, rt); err != nil {
|
|
| 17 | 17 |
return err |
| 18 | 18 |
} |
| 19 | 19 |
_, _ = fmt.Fprintln(stdout, "Successfully tagged", reference.FamiliarString(rt)) |
| ... | ... |
@@ -26,7 +26,7 @@ type imageBackend interface {
|
| 26 | 26 |
ImageHistory(ctx context.Context, imageName string) ([]*image.HistoryResponseItem, error) |
| 27 | 27 |
Images(ctx context.Context, opts types.ImageListOptions) ([]*types.ImageSummary, error) |
| 28 | 28 |
GetImage(ctx context.Context, refOrID string, options image.GetImageOpts) (*dockerimage.Image, error) |
| 29 |
- TagImage(ctx context.Context, imageName, repository, tag string) (string, error) |
|
| 29 |
+ TagImage(ctx context.Context, id dockerimage.ID, newRef reference.Named) error |
|
| 30 | 30 |
ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error) |
| 31 | 31 |
} |
| 32 | 32 |
|
| ... | ... |
@@ -369,7 +369,29 @@ func (ir *imageRouter) postImagesTag(ctx context.Context, w http.ResponseWriter, |
| 369 | 369 |
if err := httputils.ParseForm(r); err != nil {
|
| 370 | 370 |
return err |
| 371 | 371 |
} |
| 372 |
- if _, err := ir.backend.TagImage(ctx, vars["name"], r.Form.Get("repo"), r.Form.Get("tag")); err != nil {
|
|
| 372 |
+ |
|
| 373 |
+ repo := r.Form.Get("repo")
|
|
| 374 |
+ tag := r.Form.Get("tag")
|
|
| 375 |
+ |
|
| 376 |
+ ref, err := reference.ParseNormalizedNamed(repo) |
|
| 377 |
+ if err != nil {
|
|
| 378 |
+ return errdefs.InvalidParameter(err) |
|
| 379 |
+ } |
|
| 380 |
+ |
|
| 381 |
+ if tag != "" {
|
|
| 382 |
+ if ref, err = reference.WithTag(reference.TrimNamed(ref), tag); err != nil {
|
|
| 383 |
+ return errdefs.InvalidParameter(err) |
|
| 384 |
+ } |
|
| 385 |
+ } else {
|
|
| 386 |
+ ref = reference.TagNameOnly(ref) |
|
| 387 |
+ } |
|
| 388 |
+ |
|
| 389 |
+ img, err := ir.backend.GetImage(ctx, vars["name"], opts.GetImageOpts{})
|
|
| 390 |
+ if err != nil {
|
|
| 391 |
+ return errdefs.NotFound(err) |
|
| 392 |
+ } |
|
| 393 |
+ |
|
| 394 |
+ if err := ir.backend.TagImage(ctx, img.ID(), ref); err != nil {
|
|
| 373 | 395 |
return err |
| 374 | 396 |
} |
| 375 | 397 |
w.WriteHeader(http.StatusCreated) |
| ... | ... |
@@ -7,6 +7,7 @@ import ( |
| 7 | 7 |
"strings" |
| 8 | 8 |
"time" |
| 9 | 9 |
|
| 10 |
+ "github.com/docker/distribution/reference" |
|
| 10 | 11 |
"github.com/docker/docker/api/types/backend" |
| 11 | 12 |
containertypes "github.com/docker/docker/api/types/container" |
| 12 | 13 |
"github.com/docker/docker/builder/dockerfile" |
| ... | ... |
@@ -119,6 +120,26 @@ func merge(userConf, imageConf *containertypes.Config) error {
|
| 119 | 119 |
// applying that config over the existing container config. |
| 120 | 120 |
func (daemon *Daemon) CreateImageFromContainer(ctx context.Context, name string, c *backend.CreateImageConfig) (string, error) {
|
| 121 | 121 |
start := time.Now() |
| 122 |
+ |
|
| 123 |
+ var newRef reference.Named |
|
| 124 |
+ if c.Repo != "" {
|
|
| 125 |
+ ref, err := reference.ParseNormalizedNamed(c.Repo) |
|
| 126 |
+ if err != nil {
|
|
| 127 |
+ return "", errdefs.InvalidParameter(err) |
|
| 128 |
+ } |
|
| 129 |
+ |
|
| 130 |
+ if c.Tag != "" {
|
|
| 131 |
+ ref, err = reference.WithTag(ref, c.Tag) |
|
| 132 |
+ if err != nil {
|
|
| 133 |
+ return "", errdefs.InvalidParameter(err) |
|
| 134 |
+ } |
|
| 135 |
+ } else {
|
|
| 136 |
+ ref = reference.TagNameOnly(ref) |
|
| 137 |
+ } |
|
| 138 |
+ |
|
| 139 |
+ newRef = ref |
|
| 140 |
+ } |
|
| 141 |
+ |
|
| 122 | 142 |
container, err := daemon.GetContainer(name) |
| 123 | 143 |
if err != nil {
|
| 124 | 144 |
return "", err |
| ... | ... |
@@ -169,12 +190,13 @@ func (daemon *Daemon) CreateImageFromContainer(ctx context.Context, name string, |
| 169 | 169 |
return "", err |
| 170 | 170 |
} |
| 171 | 171 |
|
| 172 |
- var imageRef string |
|
| 173 |
- if c.Repo != "" {
|
|
| 174 |
- imageRef, err = daemon.imageService.TagImage(ctx, string(id), c.Repo, c.Tag) |
|
| 172 |
+ imageRef := "" |
|
| 173 |
+ if newRef != nil {
|
|
| 174 |
+ err = daemon.imageService.TagImage(ctx, id, newRef) |
|
| 175 | 175 |
if err != nil {
|
| 176 | 176 |
return "", err |
| 177 | 177 |
} |
| 178 |
+ imageRef = reference.FamiliarString(newRef) |
|
| 178 | 179 |
} |
| 179 | 180 |
daemon.LogContainerEventWithAttributes(container, "commit", map[string]string{
|
| 180 | 181 |
"comment": c.Comment, |
| ... | ... |
@@ -37,8 +37,7 @@ type ImageService interface {
|
| 37 | 37 |
CountImages() int |
| 38 | 38 |
ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error) |
| 39 | 39 |
ImportImage(ctx context.Context, ref reference.Named, platform *v1.Platform, msg string, layerReader io.Reader, changes []string) (image.ID, error) |
| 40 |
- TagImage(ctx context.Context, imageName, repository, tag string) (string, error) |
|
| 41 |
- TagImageWithReference(ctx context.Context, imageID image.ID, newTag reference.Named) error |
|
| 40 |
+ TagImage(ctx context.Context, imageID image.ID, newTag reference.Named) error |
|
| 42 | 41 |
GetImage(ctx context.Context, refOrID string, options imagetype.GetImageOpts) (*image.Image, error) |
| 43 | 42 |
ImageHistory(ctx context.Context, name string) ([]*imagetype.HistoryResponseItem, error) |
| 44 | 43 |
CommitImage(ctx context.Context, c backend.CommitConfig) (image.ID, error) |
| ... | ... |
@@ -80,7 +80,7 @@ func (i *ImageService) ImportImage(ctx context.Context, newRef reference.Named, |
| 80 | 80 |
} |
| 81 | 81 |
|
| 82 | 82 |
if newRef != nil {
|
| 83 |
- if err := i.TagImageWithReference(ctx, id, newRef); err != nil {
|
|
| 83 |
+ if err := i.TagImage(ctx, id, newRef); err != nil {
|
|
| 84 | 84 |
return "", err |
| 85 | 85 |
} |
| 86 | 86 |
} |
| ... | ... |
@@ -4,34 +4,11 @@ import ( |
| 4 | 4 |
"context" |
| 5 | 5 |
|
| 6 | 6 |
"github.com/docker/distribution/reference" |
| 7 |
- imagetypes "github.com/docker/docker/api/types/image" |
|
| 8 | 7 |
"github.com/docker/docker/image" |
| 9 | 8 |
) |
| 10 | 9 |
|
| 11 |
-// TagImage creates the tag specified by newTag, pointing to the image named |
|
| 12 |
-// imageName (alternatively, imageName can also be an image ID). |
|
| 13 |
-func (i *ImageService) TagImage(ctx context.Context, imageName, repository, tag string) (string, error) {
|
|
| 14 |
- img, err := i.GetImage(ctx, imageName, imagetypes.GetImageOpts{})
|
|
| 15 |
- if err != nil {
|
|
| 16 |
- return "", err |
|
| 17 |
- } |
|
| 18 |
- |
|
| 19 |
- newTag, err := reference.ParseNormalizedNamed(repository) |
|
| 20 |
- if err != nil {
|
|
| 21 |
- return "", err |
|
| 22 |
- } |
|
| 23 |
- if tag != "" {
|
|
| 24 |
- if newTag, err = reference.WithTag(reference.TrimNamed(newTag), tag); err != nil {
|
|
| 25 |
- return "", err |
|
| 26 |
- } |
|
| 27 |
- } |
|
| 28 |
- |
|
| 29 |
- err = i.TagImageWithReference(ctx, img.ID(), newTag) |
|
| 30 |
- return reference.FamiliarString(newTag), err |
|
| 31 |
-} |
|
| 32 |
- |
|
| 33 |
-// TagImageWithReference adds the given reference to the image ID provided. |
|
| 34 |
-func (i *ImageService) TagImageWithReference(ctx context.Context, imageID image.ID, newTag reference.Named) error {
|
|
| 10 |
+// TagImage adds the given reference to the image ID provided. |
|
| 11 |
+func (i *ImageService) TagImage(ctx context.Context, imageID image.ID, newTag reference.Named) error {
|
|
| 35 | 12 |
if err := i.referenceStore.AddTag(newTag, imageID.Digest(), true); err != nil {
|
| 36 | 13 |
return err |
| 37 | 14 |
} |