job.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package builder
  2. import (
  3. "io"
  4. "io/ioutil"
  5. "os"
  6. "os/exec"
  7. "strings"
  8. "github.com/docker/docker/archive"
  9. "github.com/docker/docker/daemon"
  10. "github.com/docker/docker/engine"
  11. "github.com/docker/docker/pkg/parsers"
  12. "github.com/docker/docker/registry"
  13. "github.com/docker/docker/utils"
  14. )
  15. type BuilderJob struct {
  16. Engine *engine.Engine
  17. Daemon *daemon.Daemon
  18. }
  19. func (b *BuilderJob) Install() {
  20. b.Engine.Register("build", b.CmdBuild)
  21. }
  22. func (b *BuilderJob) CmdBuild(job *engine.Job) engine.Status {
  23. if len(job.Args) != 0 {
  24. return job.Errorf("Usage: %s\n", job.Name)
  25. }
  26. var (
  27. remoteURL = job.Getenv("remote")
  28. repoName = job.Getenv("t")
  29. suppressOutput = job.GetenvBool("q")
  30. noCache = job.GetenvBool("nocache")
  31. rm = job.GetenvBool("rm")
  32. forceRm = job.GetenvBool("forcerm")
  33. authConfig = &registry.AuthConfig{}
  34. configFile = &registry.ConfigFile{}
  35. tag string
  36. context io.ReadCloser
  37. )
  38. job.GetenvJson("authConfig", authConfig)
  39. job.GetenvJson("configFile", configFile)
  40. repoName, tag = parsers.ParseRepositoryTag(repoName)
  41. if remoteURL == "" {
  42. context = ioutil.NopCloser(job.Stdin)
  43. } else if utils.IsGIT(remoteURL) {
  44. if !strings.HasPrefix(remoteURL, "git://") {
  45. remoteURL = "https://" + remoteURL
  46. }
  47. root, err := ioutil.TempDir("", "docker-build-git")
  48. if err != nil {
  49. return job.Error(err)
  50. }
  51. defer os.RemoveAll(root)
  52. if output, err := exec.Command("git", "clone", "--recursive", remoteURL, root).CombinedOutput(); err != nil {
  53. return job.Errorf("Error trying to use git: %s (%s)", err, output)
  54. }
  55. c, err := archive.Tar(root, archive.Uncompressed)
  56. if err != nil {
  57. return job.Error(err)
  58. }
  59. context = c
  60. } else if utils.IsURL(remoteURL) {
  61. f, err := utils.Download(remoteURL)
  62. if err != nil {
  63. return job.Error(err)
  64. }
  65. defer f.Body.Close()
  66. dockerFile, err := ioutil.ReadAll(f.Body)
  67. if err != nil {
  68. return job.Error(err)
  69. }
  70. c, err := archive.Generate("Dockerfile", string(dockerFile))
  71. if err != nil {
  72. return job.Error(err)
  73. }
  74. context = c
  75. }
  76. defer context.Close()
  77. sf := utils.NewStreamFormatter(job.GetenvBool("json"))
  78. builder := &Builder{
  79. Daemon: b.Daemon,
  80. Engine: b.Engine,
  81. OutStream: &utils.StdoutFormater{
  82. Writer: job.Stdout,
  83. StreamFormatter: sf,
  84. },
  85. ErrStream: &utils.StderrFormater{
  86. Writer: job.Stdout,
  87. StreamFormatter: sf,
  88. },
  89. Verbose: !suppressOutput,
  90. UtilizeCache: !noCache,
  91. Remove: rm,
  92. ForceRemove: forceRm,
  93. OutOld: job.Stdout,
  94. StreamFormatter: sf,
  95. AuthConfig: authConfig,
  96. AuthConfigFile: configFile,
  97. }
  98. id, err := builder.Run(context)
  99. if err != nil {
  100. return job.Error(err)
  101. }
  102. if repoName != "" {
  103. b.Daemon.Repositories().Set(repoName, tag, id, false)
  104. }
  105. return engine.StatusOK
  106. }