11package build
22
33import (
4- "bufio"
54 "encoding/json"
65 "errors"
76 "fmt"
@@ -14,24 +13,39 @@ import (
1413 shellquote "github.com/kballard/go-shellquote"
1514)
1615
17- func (bb * Build ) build (path , dockerfile string , tag string , env map [string ]string ) error {
18- if path == "" {
19- return fmt .Errorf ("must have path to build" )
16+ // loginForDocker performs Docker registry login using docker CLI
17+ func loginForDocker (bb * Build , auth map [string ]struct {
18+ Username string
19+ Password string
20+ }) error {
21+ for host , entry := range auth {
22+ buf := & strings.Builder {}
23+
24+ err := bb .Exec .Stream (buf , strings .NewReader (entry .Password ), "docker" , "login" , "-u" , entry .Username , "--password-stdin" , host )
25+
26+ bb .Printf ("Authenticating %s: %s\n " , host , strings .TrimSpace (buf .String ()))
27+
28+ if err != nil {
29+ return err
30+ }
2031 }
2132
22- df := filepath .Join (path , dockerfile )
33+ return nil
34+ }
2335
36+ // buildWithDocker builds a Docker image using the Docker CLI
37+ func (bb * Build ) buildWithDocker (path , dockerfile string , tag string , env map [string ]string ) error {
2438 args := []string {"build" }
2539
2640 if ! bb .Cache {
2741 args = append (args , "--no-cache" )
2842 }
2943
3044 args = append (args , "-t" , tag )
31- args = append (args , "-f" , df )
45+ args = append (args , "-f" , dockerfile )
3246 args = append (args , "--network" , "host" )
3347
34- ba , err := bb .buildArgs (df , env )
48+ ba , err := bb .buildArgs (dockerfile , env )
3549 if err != nil {
3650 return err
3751 }
@@ -68,43 +82,60 @@ func (bb *Build) build(path, dockerfile string, tag string, env map[string]strin
6882 return nil
6983}
7084
71- func (bb * Build ) buildArgs (dockerfile string , env map [string ]string ) ([]string , error ) {
72- fd , err := os .Open (dockerfile )
85+ // pull retrieves an image from a Docker registry
86+ func (bb * Build ) pull (image string ) error {
87+ if bb .Method == "kaniko" {
88+ return bb .pullWithKaniko (image )
89+ }
90+
91+ fmt .Fprintf (bb .writer , "Running: docker pull %s\n " , image )
92+
93+ data , err := bb .Exec .Execute ("docker" , "pull" , image )
7394 if err != nil {
74- return nil , err
95+ return errors .New (strings .TrimSpace (string (data )))
96+ }
97+
98+ return nil
99+ }
100+
101+ // push sends an image to a Docker registry
102+ func (bb * Build ) push (tag string ) error {
103+ if bb .Method == "kaniko" {
104+ return bb .pushWithKaniko (tag )
75105 }
76- defer fd .Close ()
77106
78- s := bufio . NewScanner ( fd )
107+ fmt . Fprintf ( bb . writer , "Running: docker push %s \n " , tag )
79108
80- args := []string {}
109+ data , err := bb .Exec .Execute ("docker" , "push" , tag )
110+ if err != nil {
111+ return errors .New (strings .TrimSpace (string (data )))
112+ }
81113
82- for s . Scan () {
83- fields := strings . Fields ( strings . TrimSpace ( s . Text ()))
114+ return nil
115+ }
84116
85- if len (fields ) < 2 {
86- continue
87- }
117+ // tag adds a tag to an existing Docker image
118+ func (bb * Build ) tag (from , to string ) error {
119+ if bb .Method == "kaniko" {
120+ return bb .tagWithKaniko (from , to )
121+ }
88122
89- parts := strings .Split (fields [1 ], "=" )
90-
91- switch fields [0 ] {
92- case "FROM" :
93- if bb .Development && strings .Contains (strings .ToLower (s .Text ()), "as development" ) {
94- args = append (args , "--target" , "development" )
95- }
96- case "ARG" :
97- k := strings .TrimSpace (parts [0 ])
98- if v , ok := env [k ]; ok {
99- args = append (args , "--build-arg" , fmt .Sprintf ("%s=%s" , k , v ))
100- }
101- }
123+ fmt .Fprintf (bb .writer , "Running: docker tag %s %s\n " , from , to )
124+
125+ data , err := bb .Exec .Execute ("docker" , "tag" , from , to )
126+ if err != nil {
127+ return errors .New (strings .TrimSpace (string (data )))
102128 }
103129
104- return args , nil
130+ return nil
105131}
106132
133+ // injectConvoxEnv adds the convox-env executable to a Docker image
107134func (bb * Build ) injectConvoxEnv (tag string ) error {
135+ if bb .Method == "kaniko" {
136+ return bb .injectConvoxEnvWithKaniko (tag )
137+ }
138+
108139 fmt .Fprintf (bb .writer , "Injecting: convox-env\n " )
109140
110141 var cmd []string
@@ -157,43 +188,10 @@ func (bb *Build) injectConvoxEnv(tag string) error {
157188 return err
158189 }
159190
160- data , err = bb .Exec .Execute ("docker" , "build" , "-t" , tag , tmp )
191+ _ , err = bb .Exec .Execute ("docker" , "build" , "-t" , tag , tmp )
161192 if err != nil {
162193 return err
163194 }
164195
165196 return nil
166197}
167-
168- func (bb * Build ) pull (tag string ) error {
169- fmt .Fprintf (bb .writer , "Running: docker pull %s\n " , tag )
170-
171- data , err := bb .Exec .Execute ("docker" , "pull" , tag )
172- if err != nil {
173- return errors .New (strings .TrimSpace (string (data )))
174- }
175-
176- return nil
177- }
178-
179- func (bb * Build ) push (tag string ) error {
180- fmt .Fprintf (bb .writer , "Running: docker push %s\n " , tag )
181-
182- data , err := bb .Exec .Execute ("docker" , "push" , tag )
183- if err != nil {
184- return errors .New (strings .TrimSpace (string (data )))
185- }
186-
187- return nil
188- }
189-
190- func (bb * Build ) tag (from , to string ) error {
191- fmt .Fprintf (bb .writer , "Running: docker tag %s %s\n " , from , to )
192-
193- data , err := bb .Exec .Execute ("docker" , "tag" , from , to )
194- if err != nil {
195- return errors .New (strings .TrimSpace (string (data )))
196- }
197-
198- return nil
199- }
0 commit comments