mirror of
https://github.com/containers/podman.git
synced 2026-07-27 07:27:09 -04:00
The progress should not be show for import, load, and commit. It makes machine parsing of the output much more difficult. Also, each command should output an image ID or name for the user. Added a --verbose flag for users that still want to see progress. Resolves issue #450 Signed-off-by: baude <bbaude@redhat.com> Closes: #456 Approved by: rhatdan
110 lines
2.6 KiB
Go
110 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/opencontainers/image-spec/specs-go/v1"
|
|
"github.com/pkg/errors"
|
|
"github.com/projectatomic/libpod/libpod"
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
var (
|
|
commitFlags = []cli.Flag{
|
|
cli.StringSliceFlag{
|
|
Name: "change, c",
|
|
Usage: "Apply the following possible instructions to the created image (default []): CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | STOPSIGNAL | USER | VOLUME | WORKDIR",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "message, m",
|
|
Usage: "Set commit message for imported image",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "author, a",
|
|
Usage: "Set the author for the image comitted",
|
|
},
|
|
cli.BoolTFlag{
|
|
Name: "pause, p",
|
|
Usage: "Pause container during commit",
|
|
},
|
|
cli.BoolFlag{
|
|
Name: "quiet, q",
|
|
Usage: "Suppress output",
|
|
},
|
|
}
|
|
commitDescription = `Create an image from a container's changes.
|
|
Optionally tag the image created, set the author with the --author flag,
|
|
set the commit message with the --message flag,
|
|
and make changes to the instructions with the --change flag.`
|
|
commitCommand = cli.Command{
|
|
Name: "commit",
|
|
Usage: "Create new image based on the changed container",
|
|
Description: commitDescription,
|
|
Flags: commitFlags,
|
|
Action: commitCmd,
|
|
ArgsUsage: "CONTAINER [REPOSITORY[:TAG]]",
|
|
}
|
|
)
|
|
|
|
func commitCmd(c *cli.Context) error {
|
|
if err := validateFlags(c, commitFlags); err != nil {
|
|
return err
|
|
}
|
|
|
|
runtime, err := getRuntime(c)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "could not get runtime")
|
|
}
|
|
defer runtime.Shutdown(false)
|
|
|
|
var opts libpod.CopyOptions
|
|
var container string
|
|
args := c.Args()
|
|
switch len(args) {
|
|
case 0:
|
|
return errors.Errorf("need to give container name or id")
|
|
case 1:
|
|
container = args[0]
|
|
case 2:
|
|
container = args[0]
|
|
opts.Reference = args[1]
|
|
default:
|
|
return errors.Errorf("too many arguments. Usage CONTAINER [REFERENCE]")
|
|
}
|
|
|
|
changes := v1.ImageConfig{}
|
|
if c.IsSet("change") {
|
|
changes, err = getImageConfig(c.StringSlice("change"))
|
|
if err != nil {
|
|
return errors.Wrapf(err, "error adding config changes to image %q", container)
|
|
}
|
|
}
|
|
|
|
history := []v1.History{
|
|
{Comment: c.String("message")},
|
|
}
|
|
|
|
config := v1.Image{
|
|
Config: changes,
|
|
History: history,
|
|
Author: c.String("author"),
|
|
}
|
|
opts.ImageConfig = config
|
|
opts.Writer = nil
|
|
|
|
if !c.Bool("quiet") {
|
|
opts.Writer = os.Stderr
|
|
}
|
|
|
|
ctr, err := runtime.LookupContainer(container)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "error looking up container %q", container)
|
|
}
|
|
img, err := ctr.Commit(c.BoolT("pause"), opts)
|
|
if err == nil {
|
|
fmt.Println(img.ID)
|
|
}
|
|
return nil
|
|
}
|