import.go 1.6 KB

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