mirror of
https://github.com/containers/podman.git
synced 2025-07-15 03:02:52 +08:00
podman import, load, and commit are too verbose
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
This commit is contained in:
@ -1,6 +1,9 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/projectatomic/libpod/libpod"
|
||||
@ -25,6 +28,10 @@ var (
|
||||
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,
|
||||
@ -84,10 +91,19 @@ func commitCmd(c *cli.Context) error {
|
||||
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)
|
||||
}
|
||||
return ctr.Commit(c.BoolT("pause"), opts)
|
||||
img, err := ctr.Commit(c.BoolT("pause"), opts)
|
||||
if err == nil {
|
||||
fmt.Println(img.ID)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -25,6 +25,10 @@ var (
|
||||
Name: "message, m",
|
||||
Usage: "Set commit message for imported image",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "quiet, q",
|
||||
Usage: "Suppress output",
|
||||
},
|
||||
}
|
||||
importDescription = `Create a container image from the contents of the specified tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz).
|
||||
Note remote tar balls can be specified, via web address.
|
||||
@ -84,6 +88,11 @@ func importCmd(c *cli.Context) error {
|
||||
}
|
||||
|
||||
opts.ImageConfig = config
|
||||
opts.Writer = nil
|
||||
|
||||
if !c.Bool("quiet") {
|
||||
opts.Writer = os.Stderr
|
||||
}
|
||||
|
||||
// if source is a url, download it and save to a temp file
|
||||
u, err := url.ParseRequestURI(source)
|
||||
@ -96,7 +105,11 @@ func importCmd(c *cli.Context) error {
|
||||
source = file
|
||||
}
|
||||
|
||||
return runtime.ImportImage(source, opts)
|
||||
img, err := runtime.ImportImage(source, opts)
|
||||
if err == nil {
|
||||
fmt.Println(img.ID)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// donwloadFromURL downloads an image in the format "https:/example.com/myimage.tar"
|
||||
|
@ -672,6 +672,8 @@ _podman_commit() {
|
||||
-h
|
||||
--pause
|
||||
-p
|
||||
--quiet
|
||||
-q
|
||||
"
|
||||
_complete_ "$options_with_args" "$boolean_options"
|
||||
|
||||
@ -816,6 +818,8 @@ _podman_import() {
|
||||
local boolean_options="
|
||||
--help
|
||||
-h
|
||||
--quiet
|
||||
-q
|
||||
"
|
||||
_complete_ "$options_with_args" "$boolean_options"
|
||||
|
||||
@ -1409,7 +1413,8 @@ _podman_save() {
|
||||
"
|
||||
local boolean_options="
|
||||
--compress
|
||||
--quiet -q
|
||||
-q
|
||||
--quiet
|
||||
"
|
||||
_complete_ "$options_with_args" "$boolean_options"
|
||||
}
|
||||
@ -1529,7 +1534,8 @@ _podman_load() {
|
||||
--signature-policy
|
||||
"
|
||||
local boolean_options="
|
||||
--quiet -q
|
||||
--quiet
|
||||
-q
|
||||
"
|
||||
_complete_ "$options_with_args" "$boolean_options"
|
||||
}
|
||||
|
@ -12,6 +12,7 @@ podman commit - Create new image based on the changed container
|
||||
[**--change**|**-c**]
|
||||
[**--message**|**-m**]
|
||||
[**--help**|**-h**]
|
||||
[**--verbose**]
|
||||
|
||||
## DESCRIPTION
|
||||
**podman commit** creates an image based on a changed container. The author of the
|
||||
@ -19,7 +20,8 @@ image can be set using the **--author** flag. Various image instructions can be
|
||||
configured with the **--change** flag and a commit message can be set using the
|
||||
**--message** flag. The container and its processes are paused while the image is
|
||||
committed. This minimizes the likelihood of data corruption when creating the new
|
||||
image. If this is not desired, the **--pause** flag can be set to false.
|
||||
image. If this is not desired, the **--pause** flag can be set to false. When the commit
|
||||
is complete, podman will print out the ID of the new image.
|
||||
|
||||
**podman [GLOBAL OPTIONS]**
|
||||
|
||||
@ -43,6 +45,9 @@ Set commit message for committed image
|
||||
**--pause, -p**
|
||||
Pause the container when creating an image
|
||||
|
||||
**--quiet, -q**
|
||||
Suppress output
|
||||
|
||||
## EXAMPLES
|
||||
|
||||
```
|
||||
@ -54,39 +59,22 @@ Copying config sha256:c16a6d30f3782288ec4e7521c754acc29d37155629cb39149756f486da
|
||||
448 B / 448 B [============================================================] 0s
|
||||
Writing manifest to image destination
|
||||
Storing signatures
|
||||
e3ce4d93051ceea088d1c242624d659be32cf1667ef62f1d16d6b60193e2c7a8
|
||||
```
|
||||
|
||||
```
|
||||
# podman commit --message "committing container to image" reverent_golick image-commited
|
||||
Getting image source signatures
|
||||
Copying blob sha256:b41deda5a2feb1f03a5c1bb38c598cbc12c9ccd675f438edc6acd815f7585b86
|
||||
25.80 MB / 25.80 MB [======================================================] 0s
|
||||
Copying config sha256:af376cdda5c0ac1d9592bf56567253d203f8de6a8edf356c683a645d75221540
|
||||
376 B / 376 B [============================================================] 0s
|
||||
Writing manifest to image destination
|
||||
Storing signatures
|
||||
# podman commit -q --message "committing container to image" reverent_golick image-commited
|
||||
e3ce4d93051ceea088d1c242624d659be32cf1667ef62f1d16d6b60193e2c7a8
|
||||
```
|
||||
|
||||
```
|
||||
# podman commit --author "firstName lastName" reverent_golick
|
||||
Getting image source signatures
|
||||
Copying blob sha256:b41deda5a2feb1f03a5c1bb38c598cbc12c9ccd675f438edc6acd815f7585b86
|
||||
25.80 MB / 25.80 MB [======================================================] 0s
|
||||
Copying config sha256:d61387b4d5edf65edee5353e2340783703074ffeaaac529cde97a8357eea7645
|
||||
378 B / 378 B [============================================================] 0s
|
||||
Writing manifest to image destination
|
||||
Storing signatures
|
||||
# podman commit -q --author "firstName lastName" reverent_golick
|
||||
e3ce4d93051ceea088d1c242624d659be32cf1667ef62f1d16d6b60193e2c7a8
|
||||
```
|
||||
|
||||
```
|
||||
# podman commit --pause=false reverent_golick image-commited
|
||||
Getting image source signatures
|
||||
Copying blob sha256:b41deda5a2feb1f03a5c1bb38c598cbc12c9ccd675f438edc6acd815f7585b86
|
||||
25.80 MB / 25.80 MB [======================================================] 0s
|
||||
Copying config sha256:5813fe8a3b18696089fd09957a12e88bda43dc1745b5240879ffffe93240d29a
|
||||
419 B / 419 B [============================================================] 0s
|
||||
Writing manifest to image destination
|
||||
Storing signatures
|
||||
# podman commit -q --pause=false reverent_golick image-commited
|
||||
e3ce4d93051ceea088d1c242624d659be32cf1667ef62f1d16d6b60193e2c7a8
|
||||
```
|
||||
|
||||
## SEE ALSO
|
||||
|
@ -11,6 +11,7 @@ podman import - Import a tarball and save it as a filesystem image
|
||||
[**--change**|**-c**]
|
||||
[**--message**|**-m**]
|
||||
[**--help**|**-h**]
|
||||
[**-verbose**]
|
||||
|
||||
## DESCRIPTION
|
||||
**podman import** imports a tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz)
|
||||
@ -34,6 +35,9 @@ Can be set multiple times
|
||||
**--message, -m**
|
||||
Set commit message for imported image
|
||||
|
||||
**--quiet, -q**
|
||||
Shows progress on the import
|
||||
|
||||
## EXAMPLES
|
||||
|
||||
```
|
||||
@ -45,17 +49,12 @@ Copying config sha256:c16a6d30f3782288ec4e7521c754acc29d37155629cb39149756f486da
|
||||
448 B / 448 B [============================================================] 0s
|
||||
Writing manifest to image destination
|
||||
Storing signatures
|
||||
db65d991f3bbf7f31ed1064db9a6ced7652e3f8166c4736aa9133dadd3c7acb3
|
||||
```
|
||||
|
||||
```
|
||||
# cat ctr.tar | podman import --message "importing the ctr.tar tarball" - image-imported
|
||||
Getting image source signatures
|
||||
Copying blob sha256:b41deda5a2feb1f03a5c1bb38c598cbc12c9ccd675f438edc6acd815f7585b86
|
||||
25.80 MB / 25.80 MB [======================================================] 0s
|
||||
Copying config sha256:af376cdda5c0ac1d9592bf56567253d203f8de6a8edf356c683a645d75221540
|
||||
376 B / 376 B [============================================================] 0s
|
||||
Writing manifest to image destination
|
||||
Storing signatures
|
||||
# cat ctr.tar | podman -q import --message "importing the ctr.tar tarball" - image-imported
|
||||
db65d991f3bbf7f31ed1064db9a6ced7652e3f8166c4736aa9133dadd3c7acb3
|
||||
```
|
||||
|
||||
```
|
||||
@ -67,6 +66,7 @@ Copying config sha256:d61387b4d5edf65edee5353e2340783703074ffeaaac529cde97a8357e
|
||||
378 B / 378 B [============================================================] 0s
|
||||
Writing manifest to image destination
|
||||
Storing signatures
|
||||
db65d991f3bbf7f31ed1064db9a6ced7652e3f8166c4736aa9133dadd3c7acb3
|
||||
```
|
||||
|
||||
```
|
||||
@ -79,6 +79,7 @@ Copying config sha256:5813fe8a3b18696089fd09957a12e88bda43dc1745b5240879ffffe932
|
||||
419 B / 419 B [============================================================] 0s
|
||||
Writing manifest to image destination
|
||||
Storing signatures
|
||||
db65d991f3bbf7f31ed1064db9a6ced7652e3f8166c4736aa9133dadd3c7acb3
|
||||
```
|
||||
|
||||
## SEE ALSO
|
||||
|
@ -9,6 +9,7 @@ import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/containers/storage"
|
||||
"github.com/docker/docker/daemon/caps"
|
||||
"github.com/docker/docker/pkg/signal"
|
||||
"github.com/docker/docker/pkg/stringid"
|
||||
@ -588,19 +589,19 @@ func (c *Container) Inspect(size bool) (*inspect.ContainerInspectData, error) {
|
||||
|
||||
// Commit commits the changes between a container and its image, creating a new
|
||||
// image
|
||||
func (c *Container) Commit(pause bool, options CopyOptions) error {
|
||||
func (c *Container) Commit(pause bool, options CopyOptions) (*storage.Image, error) {
|
||||
if !c.locked {
|
||||
c.lock.Lock()
|
||||
defer c.lock.Unlock()
|
||||
|
||||
if err := c.syncContainer(); err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if c.state.State == ContainerStateRunning && pause {
|
||||
if err := c.runtime.ociRuntime.pauseContainer(c); err != nil {
|
||||
return errors.Wrapf(err, "error pausing container %q", c.ID())
|
||||
return nil, errors.Wrapf(err, "error pausing container %q", c.ID())
|
||||
}
|
||||
defer func() {
|
||||
if err := c.runtime.ociRuntime.unpauseContainer(c); err != nil {
|
||||
@ -611,13 +612,13 @@ func (c *Container) Commit(pause bool, options CopyOptions) error {
|
||||
|
||||
tempFile, err := ioutil.TempFile(c.runtime.config.TmpDir, "podman-commit")
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "error creating temp file")
|
||||
return nil, errors.Wrapf(err, "error creating temp file")
|
||||
}
|
||||
defer os.Remove(tempFile.Name())
|
||||
defer tempFile.Close()
|
||||
|
||||
if err := c.export(tempFile.Name()); err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
return c.runtime.ImportImage(tempFile.Name(), options)
|
||||
}
|
||||
|
@ -1032,30 +1032,30 @@ func (r *Runtime) GetHistory(image string) ([]ociv1.History, []types.BlobInfo, s
|
||||
}
|
||||
|
||||
// ImportImage imports an OCI format image archive into storage as an image
|
||||
func (r *Runtime) ImportImage(path string, options CopyOptions) error {
|
||||
func (r *Runtime) ImportImage(path string, options CopyOptions) (*storage.Image, error) {
|
||||
r.lock.RLock()
|
||||
defer r.lock.RUnlock()
|
||||
|
||||
if !r.valid {
|
||||
return ErrRuntimeStopped
|
||||
return nil, ErrRuntimeStopped
|
||||
}
|
||||
|
||||
file := TarballTransport + ":" + path
|
||||
src, err := alltransports.ParseImageName(file)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "error parsing image name %q", path)
|
||||
return nil, errors.Wrapf(err, "error parsing image name %q", path)
|
||||
}
|
||||
|
||||
updater, ok := src.(tarball.ConfigUpdater)
|
||||
if !ok {
|
||||
return errors.Wrapf(err, "unexpected type, a tarball reference should implement tarball.ConfigUpdater")
|
||||
return nil, errors.Wrapf(err, "unexpected type, a tarball reference should implement tarball.ConfigUpdater")
|
||||
}
|
||||
|
||||
annotations := make(map[string]string)
|
||||
|
||||
err = updater.ConfigUpdate(options.ImageConfig, annotations)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "error updating image config")
|
||||
return nil, errors.Wrapf(err, "error updating image config")
|
||||
}
|
||||
|
||||
var reference = options.Reference
|
||||
@ -1065,24 +1065,26 @@ func (r *Runtime) ImportImage(path string, options CopyOptions) error {
|
||||
if reference == "" {
|
||||
reference, err = getImageDigest(src, sc)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
policyContext, err := getPolicyContext(sc)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
defer policyContext.Destroy()
|
||||
|
||||
copyOptions := common.GetCopyOptions(os.Stdout, "", nil, nil, common.SigningOptions{}, "", "", false)
|
||||
copyOptions := common.GetCopyOptions(options.Writer, "", nil, nil, common.SigningOptions{}, "", "", false)
|
||||
|
||||
dest, err := is.Transport.ParseStoreReference(r.store, reference)
|
||||
if err != nil {
|
||||
errors.Wrapf(err, "error getting image reference for %q", options.Reference)
|
||||
}
|
||||
|
||||
return cp.Image(policyContext, dest, src, copyOptions)
|
||||
if err = cp.Image(policyContext, dest, src, copyOptions); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// Use no lock version of GetImage
|
||||
return r.getImage(reference)
|
||||
}
|
||||
|
||||
// GetImageInspectInfo returns the inspect information of an image
|
||||
|
Reference in New Issue
Block a user