mirror of
https://github.com/containers/podman.git
synced 2025-12-08 06:39:05 +08:00
podman-remote load image
enable the ability to load an image into remote storage using the remote client. Signed-off-by: baude <bbaude@redhat.com>
This commit is contained in:
@@ -322,3 +322,14 @@ func (r *LocalRuntime) SaveImage(ctx context.Context, c *cliconfig.SaveValues) e
|
||||
}
|
||||
return newImage.Save(ctx, source, c.Format, c.Output, additionalTags, c.Quiet, c.Compress)
|
||||
}
|
||||
|
||||
// LoadImage is a wrapper function for libpod PruneVolumes
|
||||
func (r *LocalRuntime) LoadImage(ctx context.Context, name string, cli *cliconfig.LoadValues) (string, error) {
|
||||
var (
|
||||
writer io.Writer
|
||||
)
|
||||
if !cli.Quiet {
|
||||
writer = os.Stderr
|
||||
}
|
||||
return r.Runtime.LoadImage(ctx, name, cli.Input, writer, cli.SignaturePolicy)
|
||||
}
|
||||
|
||||
@@ -486,7 +486,7 @@ func (r *LocalRuntime) Build(ctx context.Context, c *cliconfig.BuildValues, opti
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
buildinfo.ContextDir = strings.Replace(tempFile, ":", "", -1)
|
||||
buildinfo.ContextDir = tempFile
|
||||
|
||||
reply, err := iopodman.BuildImage().Send(r.Conn, varlink.More, buildinfo)
|
||||
if err != nil {
|
||||
@@ -549,7 +549,7 @@ func (r *LocalRuntime) SendFileOverVarlink(source string) (string, error) {
|
||||
|
||||
}
|
||||
|
||||
return tempFile, nil
|
||||
return strings.Replace(tempFile, ":", "", -1), nil
|
||||
}
|
||||
|
||||
// GetAllVolumes retrieves all the volumes
|
||||
@@ -763,3 +763,36 @@ func (r *LocalRuntime) SaveImage(ctx context.Context, c *cliconfig.SaveValues) e
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// LoadImage loads a container image from a remote client's filesystem
|
||||
func (r *LocalRuntime) LoadImage(ctx context.Context, name string, cli *cliconfig.LoadValues) (string, error) {
|
||||
var names string
|
||||
remoteTempFile, err := r.SendFileOverVarlink(cli.Input)
|
||||
if err != nil {
|
||||
return "", nil
|
||||
}
|
||||
more := varlink.More
|
||||
if cli.Quiet {
|
||||
more = 0
|
||||
}
|
||||
reply, err := iopodman.LoadImage().Send(r.Conn, uint64(more), name, remoteTempFile, cli.Quiet, true)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
for {
|
||||
responses, flags, err := reply()
|
||||
if err != nil {
|
||||
logrus.Error(err)
|
||||
return "", err
|
||||
}
|
||||
for _, line := range responses.Logs {
|
||||
fmt.Print(line)
|
||||
}
|
||||
names = responses.Id
|
||||
if flags&varlink.Continues == 0 {
|
||||
break
|
||||
}
|
||||
}
|
||||
return names, nil
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ import (
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
ociv1 "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/opentracing/opentracing-go"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
@@ -3,7 +3,6 @@ package libpod
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
@@ -15,6 +14,11 @@ import (
|
||||
"github.com/containers/libpod/pkg/util"
|
||||
"github.com/containers/storage"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/containers/image/directory"
|
||||
dockerarchive "github.com/containers/image/docker/archive"
|
||||
ociarchive "github.com/containers/image/oci/archive"
|
||||
"github.com/opencontainers/image-spec/specs-go/v1"
|
||||
)
|
||||
|
||||
// Runtime API
|
||||
@@ -211,3 +215,41 @@ func downloadFromURL(source string) (string, error) {
|
||||
|
||||
return outFile.Name(), nil
|
||||
}
|
||||
|
||||
// LoadImage loads a container image into local storage
|
||||
func (r *Runtime) LoadImage(ctx context.Context, name, inputFile string, writer io.Writer, signaturePolicy string) (string, error) {
|
||||
var newImages []*image.Image
|
||||
src, err := dockerarchive.ParseReference(inputFile) // FIXME? We should add dockerarchive.NewReference()
|
||||
if err == nil {
|
||||
newImages, err = r.ImageRuntime().LoadFromArchiveReference(ctx, src, signaturePolicy, writer)
|
||||
}
|
||||
if err != nil {
|
||||
// generate full src name with specified image:tag
|
||||
src, err := ociarchive.NewReference(inputFile, name) // imageName may be ""
|
||||
if err == nil {
|
||||
newImages, err = r.ImageRuntime().LoadFromArchiveReference(ctx, src, signaturePolicy, writer)
|
||||
}
|
||||
if err != nil {
|
||||
src, err := directory.NewReference(inputFile)
|
||||
if err == nil {
|
||||
newImages, err = r.ImageRuntime().LoadFromArchiveReference(ctx, src, signaturePolicy, writer)
|
||||
}
|
||||
if err != nil {
|
||||
return "", errors.Wrapf(err, "error pulling %q", name)
|
||||
}
|
||||
}
|
||||
}
|
||||
return getImageNames(newImages), nil
|
||||
}
|
||||
|
||||
func getImageNames(images []*image.Image) string {
|
||||
var names string
|
||||
for i := range images {
|
||||
if i == 0 {
|
||||
names = images[i].InputName
|
||||
} else {
|
||||
names += ", " + images[i].InputName
|
||||
}
|
||||
}
|
||||
return names
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user