github.com/tompao/docker@v1.9.1/graph/import.go (about)

     1  package graph
     2  
     3  import (
     4  	"io"
     5  	"net/http"
     6  	"net/url"
     7  
     8  	"github.com/docker/docker/pkg/httputils"
     9  	"github.com/docker/docker/pkg/progressreader"
    10  	"github.com/docker/docker/pkg/streamformatter"
    11  	"github.com/docker/docker/runconfig"
    12  	"github.com/docker/docker/utils"
    13  )
    14  
    15  // Import imports an image, getting the archived layer data either from
    16  // inConfig (if src is "-"), or from a URI specified in src. Progress output is
    17  // written to outStream. Repository and tag names can optionally be given in
    18  // the repo and tag arguments, respectively.
    19  func (s *TagStore) Import(src string, repo string, tag string, msg string, inConfig io.ReadCloser, outStream io.Writer, containerConfig *runconfig.Config) error {
    20  	var (
    21  		sf      = streamformatter.NewJSONStreamFormatter()
    22  		archive io.ReadCloser
    23  		resp    *http.Response
    24  	)
    25  
    26  	if src == "-" {
    27  		archive = inConfig
    28  	} else {
    29  		inConfig.Close()
    30  		u, err := url.Parse(src)
    31  		if err != nil {
    32  			return err
    33  		}
    34  		if u.Scheme == "" {
    35  			u.Scheme = "http"
    36  			u.Host = src
    37  			u.Path = ""
    38  		}
    39  		outStream.Write(sf.FormatStatus("", "Downloading from %s", u))
    40  		resp, err = httputils.Download(u.String())
    41  		if err != nil {
    42  			return err
    43  		}
    44  		progressReader := progressreader.New(progressreader.Config{
    45  			In:        resp.Body,
    46  			Out:       outStream,
    47  			Formatter: sf,
    48  			Size:      resp.ContentLength,
    49  			NewLines:  true,
    50  			ID:        "",
    51  			Action:    "Importing",
    52  		})
    53  		archive = progressReader
    54  	}
    55  
    56  	defer archive.Close()
    57  	if len(msg) == 0 {
    58  		msg = "Imported from " + src
    59  	}
    60  
    61  	img, err := s.graph.Create(archive, "", "", msg, "", nil, containerConfig)
    62  	if err != nil {
    63  		return err
    64  	}
    65  	// Optionally register the image at REPO/TAG
    66  	if repo != "" {
    67  		if err := s.Tag(repo, tag, img.ID, true); err != nil {
    68  			return err
    69  		}
    70  	}
    71  	outStream.Write(sf.FormatStatus("", img.ID))
    72  	logID := img.ID
    73  	if tag != "" {
    74  		logID = utils.ImageReference(logID, tag)
    75  	}
    76  
    77  	s.eventsService.Log("import", logID, "")
    78  	return nil
    79  }