123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- package builder
- import (
- "io"
- "io/ioutil"
- "os"
- "os/exec"
- "github.com/docker/docker/api"
- "github.com/docker/docker/daemon"
- "github.com/docker/docker/engine"
- "github.com/docker/docker/graph"
- "github.com/docker/docker/pkg/archive"
- "github.com/docker/docker/pkg/parsers"
- "github.com/docker/docker/pkg/urlutil"
- "github.com/docker/docker/registry"
- "github.com/docker/docker/utils"
- )
- type BuilderJob struct {
- Engine *engine.Engine
- Daemon *daemon.Daemon
- }
- func (b *BuilderJob) Install() {
- b.Engine.Register("build", b.CmdBuild)
- }
- func (b *BuilderJob) CmdBuild(job *engine.Job) engine.Status {
- if len(job.Args) != 0 {
- return job.Errorf("Usage: %s\n", job.Name)
- }
- var (
- dockerfileName = job.Getenv("dockerfile")
- remoteURL = job.Getenv("remote")
- repoName = job.Getenv("t")
- suppressOutput = job.GetenvBool("q")
- noCache = job.GetenvBool("nocache")
- rm = job.GetenvBool("rm")
- forceRm = job.GetenvBool("forcerm")
- pull = job.GetenvBool("pull")
- authConfig = ®istry.AuthConfig{}
- configFile = ®istry.ConfigFile{}
- tag string
- context io.ReadCloser
- )
- job.GetenvJson("authConfig", authConfig)
- job.GetenvJson("configFile", configFile)
- repoName, tag = parsers.ParseRepositoryTag(repoName)
- if repoName != "" {
- if err := registry.ValidateRepositoryName(repoName); err != nil {
- return job.Error(err)
- }
- if len(tag) > 0 {
- if err := graph.ValidateTagName(tag); err != nil {
- return job.Error(err)
- }
- }
- }
- if dockerfileName == "" {
- dockerfileName = api.DefaultDockerfileName
- }
- if remoteURL == "" {
- context = ioutil.NopCloser(job.Stdin)
- } else if urlutil.IsGitURL(remoteURL) {
- if !urlutil.IsGitTransport(remoteURL) {
- remoteURL = "https://" + remoteURL
- }
- root, err := ioutil.TempDir("", "docker-build-git")
- if err != nil {
- return job.Error(err)
- }
- defer os.RemoveAll(root)
- if output, err := exec.Command("git", "clone", "--recursive", remoteURL, root).CombinedOutput(); err != nil {
- return job.Errorf("Error trying to use git: %s (%s)", err, output)
- }
- c, err := archive.Tar(root, archive.Uncompressed)
- if err != nil {
- return job.Error(err)
- }
- context = c
- } else if urlutil.IsURL(remoteURL) {
- f, err := utils.Download(remoteURL)
- if err != nil {
- return job.Error(err)
- }
- defer f.Body.Close()
- dockerFile, err := ioutil.ReadAll(f.Body)
- if err != nil {
- return job.Error(err)
- }
- c, err := archive.Generate(dockerfileName, string(dockerFile))
- if err != nil {
- return job.Error(err)
- }
- context = c
- }
- defer context.Close()
- sf := utils.NewStreamFormatter(job.GetenvBool("json"))
- builder := &Builder{
- Daemon: b.Daemon,
- Engine: b.Engine,
- OutStream: &utils.StdoutFormater{
- Writer: job.Stdout,
- StreamFormatter: sf,
- },
- ErrStream: &utils.StderrFormater{
- Writer: job.Stdout,
- StreamFormatter: sf,
- },
- Verbose: !suppressOutput,
- UtilizeCache: !noCache,
- Remove: rm,
- ForceRemove: forceRm,
- Pull: pull,
- OutOld: job.Stdout,
- StreamFormatter: sf,
- AuthConfig: authConfig,
- AuthConfigFile: configFile,
- dockerfileName: dockerfileName,
- }
- id, err := builder.Run(context)
- if err != nil {
- return job.Error(err)
- }
- if repoName != "" {
- b.Daemon.Repositories().Set(repoName, tag, id, true)
- }
- return engine.StatusOK
- }
|