1- package builder
1+ package daemon
22
33import (
44 "crypto/sha256"
@@ -10,6 +10,7 @@ import (
1010 "io/ioutil"
1111 "net/url"
1212 "os"
13+ "os/exec"
1314 "path"
1415 "path/filepath"
1516 "reflect"
@@ -20,7 +21,6 @@ import (
2021 "time"
2122
2223 "github.com/docker/docker/archive"
23- "github.com/docker/docker/daemon"
2424 "github.com/docker/docker/engine"
2525 "github.com/docker/docker/nat"
2626 "github.com/docker/docker/pkg/parsers"
@@ -32,6 +32,86 @@ import (
3232 "github.com/docker/docker/utils"
3333)
3434
35+ func (daemon * Daemon ) CmdBuild (job * engine.Job ) engine.Status {
36+ if len (job .Args ) != 0 {
37+ return job .Errorf ("Usage: %s\n " , job .Name )
38+ }
39+ var (
40+ remoteURL = job .Getenv ("remote" )
41+ repoName = job .Getenv ("t" )
42+ suppressOutput = job .GetenvBool ("q" )
43+ noCache = job .GetenvBool ("nocache" )
44+ rm = job .GetenvBool ("rm" )
45+ forceRm = job .GetenvBool ("forcerm" )
46+ authConfig = & registry.AuthConfig {}
47+ configFile = & registry.ConfigFile {}
48+ tag string
49+ context io.ReadCloser
50+ )
51+ job .GetenvJson ("authConfig" , authConfig )
52+ job .GetenvJson ("configFile" , configFile )
53+ repoName , tag = parsers .ParseRepositoryTag (repoName )
54+
55+ if remoteURL == "" {
56+ context = ioutil .NopCloser (job .Stdin )
57+ } else if utils .IsGIT (remoteURL ) {
58+ if ! strings .HasPrefix (remoteURL , "git://" ) {
59+ remoteURL = "https://" + remoteURL
60+ }
61+ root , err := ioutil .TempDir ("" , "docker-build-git" )
62+ if err != nil {
63+ return job .Error (err )
64+ }
65+ defer os .RemoveAll (root )
66+
67+ if output , err := exec .Command ("git" , "clone" , "--recursive" , remoteURL , root ).CombinedOutput (); err != nil {
68+ return job .Errorf ("Error trying to use git: %s (%s)" , err , output )
69+ }
70+
71+ c , err := archive .Tar (root , archive .Uncompressed )
72+ if err != nil {
73+ return job .Error (err )
74+ }
75+ context = c
76+ } else if utils .IsURL (remoteURL ) {
77+ f , err := utils .Download (remoteURL )
78+ if err != nil {
79+ return job .Error (err )
80+ }
81+ defer f .Body .Close ()
82+ dockerFile , err := ioutil .ReadAll (f .Body )
83+ if err != nil {
84+ return job .Error (err )
85+ }
86+ c , err := archive .Generate ("Dockerfile" , string (dockerFile ))
87+ if err != nil {
88+ return job .Error (err )
89+ }
90+ context = c
91+ }
92+ defer context .Close ()
93+
94+ sf := utils .NewStreamFormatter (job .GetenvBool ("json" ))
95+ b := NewBuildFile (daemon , daemon .eng ,
96+ & utils.StdoutFormater {
97+ Writer : job .Stdout ,
98+ StreamFormatter : sf ,
99+ },
100+ & utils.StderrFormater {
101+ Writer : job .Stdout ,
102+ StreamFormatter : sf ,
103+ },
104+ ! suppressOutput , ! noCache , rm , forceRm , job .Stdout , sf , authConfig , configFile )
105+ id , err := b .Build (context )
106+ if err != nil {
107+ return job .Error (err )
108+ }
109+ if repoName != "" {
110+ daemon .Repositories ().Set (repoName , tag , id , false )
111+ }
112+ return engine .StatusOK
113+ }
114+
35115var (
36116 ErrDockerfileEmpty = errors .New ("Dockerfile cannot be empty" )
37117)
@@ -43,7 +123,7 @@ type BuildFile interface {
43123}
44124
45125type buildFile struct {
46- daemon * daemon. Daemon
126+ daemon * Daemon
47127 eng * engine.Engine
48128
49129 image string
@@ -124,7 +204,7 @@ func (b *buildFile) CmdFrom(name string) error {
124204 b .config = image .Config
125205 }
126206 if b .config .Env == nil || len (b .config .Env ) == 0 {
127- b .config .Env = append (b .config .Env , "PATH=" + daemon . DefaultPathEnv )
207+ b .config .Env = append (b .config .Env , "PATH=" + DefaultPathEnv )
128208 }
129209 // Process ONBUILD triggers if they exist
130210 if nTriggers := len (b .config .OnBuild ); nTriggers != 0 {
@@ -416,7 +496,7 @@ func (b *buildFile) checkPathForAddition(orig string) error {
416496 return nil
417497}
418498
419- func (b * buildFile ) addContext (container * daemon. Container , orig , dest string , decompress bool ) error {
499+ func (b * buildFile ) addContext (container * Container , orig , dest string , decompress bool ) error {
420500 var (
421501 err error
422502 destExists = true
@@ -668,7 +748,7 @@ func (b *buildFile) CmdAdd(args string) error {
668748 return b .runContextCommand (args , true , true , "ADD" )
669749}
670750
671- func (b * buildFile ) create () (* daemon. Container , error ) {
751+ func (b * buildFile ) create () (* Container , error ) {
672752 if b .image == "" {
673753 return nil , fmt .Errorf ("Please provide a source image with `from` prior to run" )
674754 }
@@ -689,7 +769,7 @@ func (b *buildFile) create() (*daemon.Container, error) {
689769 return c , nil
690770}
691771
692- func (b * buildFile ) run (c * daemon. Container ) error {
772+ func (b * buildFile ) run (c * Container ) error {
693773 var errCh chan error
694774 if b .verbose {
695775 errCh = utils .Go (func () error {
@@ -906,7 +986,7 @@ func fixPermissions(destination string, uid, gid int) error {
906986 })
907987}
908988
909- func NewBuildFile (d * daemon. Daemon , eng * engine.Engine , outStream , errStream io.Writer , verbose , utilizeCache , rm bool , forceRm bool , outOld io.Writer , sf * utils.StreamFormatter , auth * registry.AuthConfig , authConfigFile * registry.ConfigFile ) BuildFile {
989+ func NewBuildFile (d * Daemon , eng * engine.Engine , outStream , errStream io.Writer , verbose , utilizeCache , rm bool , forceRm bool , outOld io.Writer , sf * utils.StreamFormatter , auth * registry.AuthConfig , authConfigFile * registry.ConfigFile ) BuildFile {
910990 return & buildFile {
911991 daemon : d ,
912992 eng : eng ,
0 commit comments