github.com/alok87/docker@v1.6.0/graph/import.go (about)

     1  package graph
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"net/http"
     7  	"net/url"
     8  
     9  	log "github.com/Sirupsen/logrus"
    10  	"github.com/docker/docker/engine"
    11  	"github.com/docker/docker/pkg/archive"
    12  	"github.com/docker/docker/pkg/progressreader"
    13  	"github.com/docker/docker/runconfig"
    14  	"github.com/docker/docker/utils"
    15  )
    16  
    17  func (s *TagStore) CmdImport(job *engine.Job) engine.Status {
    18  	if n := len(job.Args); n != 2 && n != 3 {
    19  		return job.Errorf("Usage: %s SRC REPO [TAG]", job.Name)
    20  	}
    21  	var (
    22  		src          = job.Args[0]
    23  		repo         = job.Args[1]
    24  		tag          string
    25  		sf           = utils.NewStreamFormatter(job.GetenvBool("json"))
    26  		archive      archive.ArchiveReader
    27  		resp         *http.Response
    28  		stdoutBuffer = bytes.NewBuffer(nil)
    29  		newConfig    runconfig.Config
    30  	)
    31  	if len(job.Args) > 2 {
    32  		tag = job.Args[2]
    33  	}
    34  
    35  	if src == "-" {
    36  		archive = job.Stdin
    37  	} else {
    38  		u, err := url.Parse(src)
    39  		if err != nil {
    40  			return job.Error(err)
    41  		}
    42  		if u.Scheme == "" {
    43  			u.Scheme = "http"
    44  			u.Host = src
    45  			u.Path = ""
    46  		}
    47  		job.Stdout.Write(sf.FormatStatus("", "Downloading from %s", u))
    48  		resp, err = utils.Download(u.String())
    49  		if err != nil {
    50  			return job.Error(err)
    51  		}
    52  		progressReader := progressreader.New(progressreader.Config{
    53  			In:        resp.Body,
    54  			Out:       job.Stdout,
    55  			Formatter: sf,
    56  			Size:      int(resp.ContentLength),
    57  			NewLines:  true,
    58  			ID:        "",
    59  			Action:    "Importing",
    60  		})
    61  		defer progressReader.Close()
    62  		archive = progressReader
    63  	}
    64  
    65  	buildConfigJob := job.Eng.Job("build_config")
    66  	buildConfigJob.Stdout.Add(stdoutBuffer)
    67  	buildConfigJob.Setenv("changes", job.Getenv("changes"))
    68  	// FIXME this should be remove when we remove deprecated config param
    69  	buildConfigJob.Setenv("config", job.Getenv("config"))
    70  
    71  	if err := buildConfigJob.Run(); err != nil {
    72  		return job.Error(err)
    73  	}
    74  	if err := json.NewDecoder(stdoutBuffer).Decode(&newConfig); err != nil {
    75  		return job.Error(err)
    76  	}
    77  
    78  	img, err := s.graph.Create(archive, "", "", "Imported from "+src, "", nil, &newConfig)
    79  	if err != nil {
    80  		return job.Error(err)
    81  	}
    82  	// Optionally register the image at REPO/TAG
    83  	if repo != "" {
    84  		if err := s.Set(repo, tag, img.ID, true); err != nil {
    85  			return job.Error(err)
    86  		}
    87  	}
    88  	job.Stdout.Write(sf.FormatStatus("", img.ID))
    89  	logID := img.ID
    90  	if tag != "" {
    91  		logID = utils.ImageReference(logID, tag)
    92  	}
    93  	if err = job.Eng.Job("log", "import", logID, "").Run(); err != nil {
    94  		log.Errorf("Error logging event 'import' for %s: %s", logID, err)
    95  	}
    96  	return engine.StatusOK
    97  }