github.com/dougm/docker@v1.5.0/graph/import.go (about)

     1  package graph
     2  
     3  import (
     4  	"net/http"
     5  	"net/url"
     6  
     7  	log "github.com/Sirupsen/logrus"
     8  	"github.com/docker/docker/engine"
     9  	"github.com/docker/docker/pkg/archive"
    10  	"github.com/docker/docker/utils"
    11  )
    12  
    13  func (s *TagStore) CmdImport(job *engine.Job) engine.Status {
    14  	if n := len(job.Args); n != 2 && n != 3 {
    15  		return job.Errorf("Usage: %s SRC REPO [TAG]", job.Name)
    16  	}
    17  	var (
    18  		src     = job.Args[0]
    19  		repo    = job.Args[1]
    20  		tag     string
    21  		sf      = utils.NewStreamFormatter(job.GetenvBool("json"))
    22  		archive archive.ArchiveReader
    23  		resp    *http.Response
    24  	)
    25  	if len(job.Args) > 2 {
    26  		tag = job.Args[2]
    27  	}
    28  
    29  	if src == "-" {
    30  		archive = job.Stdin
    31  	} else {
    32  		u, err := url.Parse(src)
    33  		if err != nil {
    34  			return job.Error(err)
    35  		}
    36  		if u.Scheme == "" {
    37  			u.Scheme = "http"
    38  			u.Host = src
    39  			u.Path = ""
    40  		}
    41  		job.Stdout.Write(sf.FormatStatus("", "Downloading from %s", u))
    42  		resp, err = utils.Download(u.String())
    43  		if err != nil {
    44  			return job.Error(err)
    45  		}
    46  		progressReader := utils.ProgressReader(resp.Body, int(resp.ContentLength), job.Stdout, sf, true, "", "Importing")
    47  		defer progressReader.Close()
    48  		archive = progressReader
    49  	}
    50  	img, err := s.graph.Create(archive, "", "", "Imported from "+src, "", nil, nil)
    51  	if err != nil {
    52  		return job.Error(err)
    53  	}
    54  	// Optionally register the image at REPO/TAG
    55  	if repo != "" {
    56  		if err := s.Set(repo, tag, img.ID, true); err != nil {
    57  			return job.Error(err)
    58  		}
    59  	}
    60  	job.Stdout.Write(sf.FormatStatus("", img.ID))
    61  	logID := img.ID
    62  	if tag != "" {
    63  		logID += ":" + tag
    64  	}
    65  	if err = job.Eng.Job("log", "import", logID, "").Run(); err != nil {
    66  		log.Errorf("Error logging event 'import' for %s: %s", logID, err)
    67  	}
    68  	return engine.StatusOK
    69  }