1
0
mirror of https://github.com/containers/buildah.git synced 2025-07-31 15:24:26 +03:00

Add a "tag" command

Add a "tag" command, for adding names to locally-stored images.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>

Closes: #110
Approved by: rhatdan
This commit is contained in:
Nalin Dahyabhai
2017-05-19 14:13:15 -04:00
committed by Atomic Bot
parent 76395efa52
commit 3065ea3d16
7 changed files with 164 additions and 33 deletions

View File

@ -83,6 +83,7 @@ func main() {
rmiCommand, rmiCommand,
budCommand, budCommand,
inspectCommand, inspectCommand,
tagCommand,
} }
err := app.Run(os.Args) err := app.Run(os.Args)
if err != nil { if err != nil {

39
cmd/buildah/tag.go Normal file
View File

@ -0,0 +1,39 @@
package main
import (
"fmt"
"github.com/projectatomic/buildah/util"
"github.com/urfave/cli"
)
var (
tagDescription = "Adds one or more additional names to locally-stored image"
tagCommand = cli.Command{
Name: "tag",
Usage: "Add an additional name to a local image",
Description: tagDescription,
Action: tagCmd,
ArgsUsage: "IMAGE-NAME [IMAGE-NAME ...]",
}
)
func tagCmd(c *cli.Context) error {
args := c.Args()
if len(args) < 2 {
return fmt.Errorf("image name and at least one new name must be specified")
}
store, err := getStore(c)
if err != nil {
return err
}
img, err := util.FindImage(store, args[0])
if err != nil {
return fmt.Errorf("error finding local image %q: %v", args[0], err)
}
err = util.AddImageNames(store, img, args[1:])
if err != nil {
return fmt.Errorf("error adding names %v to image %q: %v", args[1:], args[0], err)
}
return nil
}

View File

@ -1,15 +1,15 @@
package buildah package buildah
import ( import (
"fmt"
"io" "io"
"github.com/Sirupsen/logrus"
"github.com/containers/image/copy" "github.com/containers/image/copy"
"github.com/containers/image/docker/reference"
"github.com/containers/image/signature" "github.com/containers/image/signature"
"github.com/containers/image/storage" "github.com/containers/image/storage"
"github.com/containers/image/types" "github.com/containers/image/types"
"github.com/containers/storage/pkg/archive" "github.com/containers/storage/pkg/archive"
"github.com/projectatomic/buildah/util"
) )
// CommitOptions can be used to alter how an image is committed. // CommitOptions can be used to alter how an image is committed.
@ -33,23 +33,6 @@ type CommitOptions struct {
ReportWriter io.Writer ReportWriter io.Writer
} }
func expandTags(tags []string) ([]string, error) {
expanded := []string{}
for _, tag := range tags {
name, err := reference.ParseNormalizedNamed(tag)
if err != nil {
return nil, fmt.Errorf("error parsing tag %q: %v", tag, err)
}
name = reference.TagNameOnly(name)
tag = ""
if tagged, ok := name.(reference.NamedTagged); ok {
tag = ":" + tagged.Tag()
}
expanded = append(expanded, name.Name()+tag)
}
return expanded, nil
}
// Commit writes the contents of the container, along with its updated // Commit writes the contents of the container, along with its updated
// configuration, to a new image in the specified location, and if we know how, // configuration, to a new image in the specified location, and if we know how,
// add any additional tags that were specified. // add any additional tags that were specified.
@ -67,20 +50,23 @@ func (b *Builder) Commit(dest types.ImageReference, options CommitOptions) error
return err return err
} }
err = copy.Image(policyContext, dest, src, getCopyOptions(options.ReportWriter)) err = copy.Image(policyContext, dest, src, getCopyOptions(options.ReportWriter))
switch dest.Transport().Name() { if err != nil {
case storage.Transport.Name(): return err
tags, err := expandTags(options.AdditionalTags) }
if err != nil { if len(options.AdditionalTags) > 0 {
return err switch dest.Transport().Name() {
} case storage.Transport.Name():
img, err := storage.Transport.GetStoreImage(b.store, dest) img, err := storage.Transport.GetStoreImage(b.store, dest)
if err != nil { if err != nil {
return err return err
} }
err = b.store.SetNames(img.ID, append(img.Names, tags...)) err = util.AddImageNames(b.store, img, options.AdditionalTags)
if err != nil { if err != nil {
return fmt.Errorf("error setting image names to %v: %v", append(img.Names, tags...), err) return err
}
default:
logrus.Warnf("don't know how to add tags to images stored in %q transport", dest.Transport().Name())
} }
} }
return err return nil
} }

View File

@ -537,6 +537,19 @@ return 1
esac esac
} }
_buildah_tag() {
local options_with_args="
"
local all_options="$options_with_args"
case "$cur" in
-*)
COMPREPLY=($(compgen -W "$options_with_args" -- "$cur"))
;;
esac
}
_buildah_from() { _buildah_from() {
local boolean_options=" local boolean_options="
--help --help
@ -583,6 +596,7 @@ return 1
rm rm
rmi rmi
run run
tag
umount umount
unmount unmount
) )

18
docs/buildah-tag.md Normal file
View File

@ -0,0 +1,18 @@
## buildah-tag "1" "May 2017" "buildah"
## NAME
buildah tag - Add additional names to local images.
## SYNOPSIS
**buildah** **tag** **name** **new-name** [...]
## DESCRIPTION
Adds additional names to locally-stored images.
## EXAMPLE
buildah tag imageName firstNewName
buildah tag imageName firstNewName SecondNewName
## SEE ALSO
buildah(1)

19
tests/tag.bats Normal file
View File

@ -0,0 +1,19 @@
#!/usr/bin/env bats
load helpers
@test "tag" {
cid=$(buildah from --pull=false --signature-policy ${TESTSDIR}/policy.json scratch)
run buildah commit --signature-policy ${TESTSDIR}/policy.json "$cid" scratch-image
[ "$status" -eq 0 ]
run buildah inspect --type image tagged-image
[ "$status" -ne 0 ]
run buildah tag scratch-image tagged-image tagged-also-image named-image
[ "$status" -eq 0 ]
run buildah inspect --type image tagged-image
[ "$status" -eq 0 ]
run buildah inspect --type image tagged-also-image
[ "$status" -eq 0 ]
run buildah inspect --type image named-image
[ "$status" -eq 0 ]
}

54
util/util.go Normal file
View File

@ -0,0 +1,54 @@
package util
import (
"fmt"
"github.com/containers/image/docker/reference"
is "github.com/containers/image/storage"
"github.com/containers/storage"
)
// ExpandTags takes unqualified names, parses them as image names, and returns
// the fully expanded result, including a tag.
func ExpandTags(tags []string) ([]string, error) {
expanded := []string{}
for _, tag := range tags {
name, err := reference.ParseNormalizedNamed(tag)
if err != nil {
return nil, fmt.Errorf("error parsing tag %q: %v", tag, err)
}
name = reference.TagNameOnly(name)
tag = ""
if tagged, ok := name.(reference.NamedTagged); ok {
tag = ":" + tagged.Tag()
}
expanded = append(expanded, name.Name()+tag)
}
return expanded, nil
}
// FindImage locates the locally-stored image which corresponds to a given name.
func FindImage(store storage.Store, image string) (*storage.Image, error) {
ref, err := is.Transport.ParseStoreReference(store, image)
if err != nil {
return nil, fmt.Errorf("error parsing reference to image %q: %v", image, err)
}
img, err := is.Transport.GetStoreImage(store, ref)
if err != nil {
return nil, fmt.Errorf("unable to locate image: %v", err)
}
return img, nil
}
// AddImageNames adds the specified names to the specified image.
func AddImageNames(store storage.Store, image *storage.Image, addNames []string) error {
names, err := ExpandTags(addNames)
if err != nil {
return err
}
err = store.SetNames(image.ID, append(image.Names, names...))
if err != nil {
return fmt.Errorf("error adding names (%v) to image %q: %v", names, image.ID, err)
}
return nil
}