mirror of https://github.com/docker/docs.git
Implement docker import with the standalone client lib.
Signed-off-by: David Calavera <david.calavera@gmail.com>
This commit is contained in:
parent
381262fbea
commit
6bf757500b
|
@ -3,12 +3,13 @@ package client
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/url"
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/docker/distribution/reference"
|
"github.com/docker/distribution/reference"
|
||||||
|
"github.com/docker/docker/api/client/lib"
|
||||||
Cli "github.com/docker/docker/cli"
|
Cli "github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/opts"
|
"github.com/docker/docker/opts"
|
||||||
|
"github.com/docker/docker/pkg/jsonmessage"
|
||||||
flag "github.com/docker/docker/pkg/mflag"
|
flag "github.com/docker/docker/pkg/mflag"
|
||||||
"github.com/docker/docker/pkg/urlutil"
|
"github.com/docker/docker/pkg/urlutil"
|
||||||
"github.com/docker/docker/registry"
|
"github.com/docker/docker/registry"
|
||||||
|
@ -29,20 +30,17 @@ func (cli *DockerCli) CmdImport(args ...string) error {
|
||||||
cmd.ParseFlags(args, true)
|
cmd.ParseFlags(args, true)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
v = url.Values{}
|
in io.Reader
|
||||||
|
tag string
|
||||||
src = cmd.Arg(0)
|
src = cmd.Arg(0)
|
||||||
|
srcName = src
|
||||||
repository = cmd.Arg(1)
|
repository = cmd.Arg(1)
|
||||||
|
changes = flChanges.GetAll()
|
||||||
)
|
)
|
||||||
|
|
||||||
v.Set("fromSrc", src)
|
|
||||||
v.Set("repo", repository)
|
|
||||||
v.Set("message", *message)
|
|
||||||
for _, change := range flChanges.GetAll() {
|
|
||||||
v.Add("changes", change)
|
|
||||||
}
|
|
||||||
if cmd.NArg() == 3 {
|
if cmd.NArg() == 3 {
|
||||||
fmt.Fprintf(cli.err, "[DEPRECATED] The format 'file|URL|- [REPOSITORY [TAG]]' has been deprecated. Please use file|URL|- [REPOSITORY[:TAG]]\n")
|
fmt.Fprintf(cli.err, "[DEPRECATED] The format 'file|URL|- [REPOSITORY [TAG]]' has been deprecated. Please use file|URL|- [REPOSITORY[:TAG]]\n")
|
||||||
v.Set("tag", cmd.Arg(2))
|
tag = cmd.Arg(2)
|
||||||
}
|
}
|
||||||
|
|
||||||
if repository != "" {
|
if repository != "" {
|
||||||
|
@ -56,12 +54,10 @@ func (cli *DockerCli) CmdImport(args ...string) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var in io.Reader
|
|
||||||
|
|
||||||
if src == "-" {
|
if src == "-" {
|
||||||
in = cli.in
|
in = cli.in
|
||||||
} else if !urlutil.IsURL(src) {
|
} else if !urlutil.IsURL(src) {
|
||||||
v.Set("fromSrc", "-")
|
srcName = "-"
|
||||||
file, err := os.Open(src)
|
file, err := os.Open(src)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -71,12 +67,20 @@ func (cli *DockerCli) CmdImport(args ...string) error {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sopts := &streamOpts{
|
options := lib.ImportImageOptions{
|
||||||
rawTerminal: true,
|
Source: in,
|
||||||
in: in,
|
SourceName: srcName,
|
||||||
out: cli.out,
|
RepositoryName: repository,
|
||||||
|
Message: *message,
|
||||||
|
Tag: tag,
|
||||||
|
Changes: changes,
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := cli.stream("POST", "/images/create?"+v.Encode(), sopts)
|
responseBody, err := cli.client.ImportImage(options)
|
||||||
return err
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer responseBody.Close()
|
||||||
|
|
||||||
|
return jsonmessage.DisplayJSONMessagesStream(responseBody, cli.out, cli.outFd, cli.isTerminalOut)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CreateImageOptions holds information to create images
|
// CreateImageOptions holds information to create images.
|
||||||
type CreateImageOptions struct {
|
type CreateImageOptions struct {
|
||||||
// Parent is the image to create this image from
|
// Parent is the image to create this image from
|
||||||
Parent string
|
Parent string
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
package lib
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"net/url"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ImportImageOptions holds information to import images from the client host.
|
||||||
|
type ImportImageOptions struct {
|
||||||
|
// Source is the data to send to the server to create this image from
|
||||||
|
Source io.Reader
|
||||||
|
// Source is the name of the source to import this image from
|
||||||
|
SourceName string
|
||||||
|
// RepositoryName is the name of the repository to import this image
|
||||||
|
RepositoryName string
|
||||||
|
// Message is the message to tag the image with
|
||||||
|
Message string
|
||||||
|
// Tag is the name to tag this image
|
||||||
|
Tag string
|
||||||
|
// Changes are the raw changes to apply to the image
|
||||||
|
Changes []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ImportImage creates a new image based in the source options.
|
||||||
|
// It returns the JSON content in the response body.
|
||||||
|
func (cli *Client) ImportImage(options ImportImageOptions) (io.ReadCloser, error) {
|
||||||
|
var query url.Values
|
||||||
|
query.Set("fromSrc", options.SourceName)
|
||||||
|
query.Set("repo", options.RepositoryName)
|
||||||
|
query.Set("tag", options.Tag)
|
||||||
|
query.Set("message", options.Message)
|
||||||
|
for _, change := range options.Changes {
|
||||||
|
query.Add("changes", change)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := cli.POSTRaw("/images/create", query, options.Source, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return resp.body, nil
|
||||||
|
}
|
Loading…
Reference in New Issue