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 }