@@ -5,22 +5,20 @@ import (
5
5
"encoding/base64"
6
6
"encoding/json"
7
7
"io"
8
-
9
- "github.com/docker/cli/cli/streams"
8
+
10
9
"github.com/distribution/reference"
10
+ "github.com/docker/cli/cli/streams"
11
11
"github.com/docker/docker/api/types/image"
12
12
dockerregistry "github.com/docker/docker/api/types/registry"
13
+ "github.com/docker/docker/pkg/jsonmessage"
13
14
"github.com/loft-sh/devspace/pkg/devspace/build/builder/helper"
14
15
"github.com/loft-sh/devspace/pkg/devspace/config/versions/latest"
15
16
devspacecontext "github.com/loft-sh/devspace/pkg/devspace/context"
16
17
dockerclient "github.com/loft-sh/devspace/pkg/devspace/docker"
17
18
"github.com/loft-sh/devspace/pkg/devspace/kubectl"
18
19
"github.com/loft-sh/devspace/pkg/devspace/pullsecrets"
19
20
command2 "github.com/loft-sh/utils/pkg/command"
20
-
21
21
"github.com/pkg/errors"
22
-
23
- "github.com/docker/docker/pkg/jsonmessage"
24
22
)
25
23
26
24
// EngineName is the name of the building engine
@@ -29,7 +27,7 @@ const EngineName = "docker"
29
27
// Builder holds the necessary information to build and push docker images
30
28
type Builder struct {
31
29
helper * helper.BuildHelper
32
-
30
+
33
31
authConfig * dockerregistry.AuthConfig
34
32
client dockerclient.Client
35
33
skipPush bool
@@ -57,7 +55,7 @@ func (b *Builder) ShouldRebuild(ctx devspacecontext.Context, forceRebuild bool)
57
55
imageCache , _ := ctx .Config ().LocalCache ().GetImageCache (b .helper .ImageConf .Name )
58
56
imageName := imageCache .ResolveImage () + ":" + imageCache .Tag
59
57
rebuild , err := b .helper .ShouldRebuild (ctx , forceRebuild )
60
-
58
+
61
59
// Check if image is present in local docker daemon
62
60
if ! rebuild && err == nil {
63
61
if b .skipPushOnLocalKubernetes && ctx .KubeClient () != nil && kubectl .IsLocalKubernetes (ctx .KubeClient ()) {
@@ -68,7 +66,7 @@ func (b *Builder) ShouldRebuild(ctx devspacecontext.Context, forceRebuild bool)
68
66
}
69
67
}
70
68
}
71
-
69
+
72
70
return rebuild , err
73
71
}
74
72
@@ -79,7 +77,7 @@ func (b *Builder) BuildImage(ctx devspacecontext.Context, contextPath, dockerfil
79
77
var (
80
78
displayRegistryURL = "hub.docker.com"
81
79
)
82
-
80
+
83
81
// Display nice registry name
84
82
registryURL , err := pullsecrets .GetRegistryFromImageName (b .helper .ImageName )
85
83
if err != nil {
@@ -88,12 +86,12 @@ func (b *Builder) BuildImage(ctx devspacecontext.Context, contextPath, dockerfil
88
86
if registryURL != "" {
89
87
displayRegistryURL = registryURL
90
88
}
91
-
89
+
92
90
// We skip pushing when it is the minikube client
93
91
if b .skipPushOnLocalKubernetes && ctx .KubeClient () != nil && kubectl .IsLocalKubernetes (ctx .KubeClient ()) {
94
92
b .skipPush = true
95
93
}
96
-
94
+
97
95
// Authenticate
98
96
if ! b .skipPush && ! b .helper .ImageConf .SkipPush {
99
97
if pullsecrets .IsAzureContainerRegistry (registryURL ) {
@@ -108,18 +106,18 @@ func (b *Builder) BuildImage(ctx devspacecontext.Context, contextPath, dockerfil
108
106
if err != nil {
109
107
return errors .Errorf ("Error during image registry authentication: %v" , err )
110
108
}
111
-
109
+
112
110
ctx .Log ().Done ("Authentication successful (" + displayRegistryURL + ")" )
113
111
}
114
112
}
115
-
113
+
116
114
// create context stream
117
115
body , writer , outStream , buildOptions , err := b .helper .CreateContextStream (contextPath , dockerfilePath , entrypoint , cmd , ctx .Log ())
118
116
defer writer .Close ()
119
117
if err != nil {
120
118
return err
121
119
}
122
-
120
+
123
121
// Should we build with cli?
124
122
useBuildKit := false
125
123
useDockerCli := b .helper .ImageConf .Docker != nil && b .helper .ImageConf .Docker .UseCLI
@@ -138,27 +136,27 @@ func (b *Builder) BuildImage(ctx devspacecontext.Context, contextPath, dockerfil
138
136
} else {
139
137
// make sure to use the correct proxy configuration
140
138
buildOptions .BuildArgs = b .client .ParseProxyConfig (buildOptions .BuildArgs )
141
-
139
+
142
140
response , err := b .client .ImageBuild (ctx .Context (), body , * buildOptions )
143
141
if err != nil {
144
142
return err
145
143
}
146
144
defer response .Body .Close ()
147
-
145
+
148
146
err = jsonmessage .DisplayJSONMessagesStream (response .Body , outStream , outStream .FD (), outStream .IsTerminal (), nil )
149
147
if err != nil {
150
148
return err
151
149
}
152
150
}
153
-
151
+
154
152
// Check if we skip push
155
153
if ! b .skipPush && ! b .helper .ImageConf .SkipPush {
156
154
for _ , tag := range buildOptions .Tags {
157
155
err = b .pushImage (ctx .Context (), writer , tag )
158
156
if err != nil {
159
157
return errors .Errorf ("error during image push: %v" , err )
160
158
}
161
-
159
+
162
160
ctx .Log ().Info ("Image pushed to registry (" + displayRegistryURL + ")" )
163
161
}
164
162
} else if ctx .KubeClient () != nil && kubectl .GetKindContext (ctx .KubeClient ().CurrentContext ()) != "" {
@@ -169,14 +167,14 @@ func (b *Builder) BuildImage(ctx devspacecontext.Context, contextPath, dockerfil
169
167
completeArgs = append (completeArgs , command [1 :]... )
170
168
err = command2 .Command (ctx .Context (), ctx .WorkingDir (), ctx .Environ (), writer , writer , nil , command [0 ], completeArgs ... )
171
169
if err != nil {
172
- ctx . Log (). Info ( errors .Errorf ("error during image load to kind cluster: %v" , err ) )
170
+ return errors .Errorf ("error during image load to kind cluster: %v" , err )
173
171
}
174
172
ctx .Log ().Info ("Image loaded to kind cluster" )
175
173
}
176
174
} else {
177
175
ctx .Log ().Infof ("Skip image push for %s" , b .helper .ImageName )
178
176
}
179
-
177
+
180
178
return nil
181
179
}
182
180
@@ -186,12 +184,12 @@ func (b *Builder) Authenticate(ctx context.Context) (*dockerregistry.AuthConfig,
186
184
if err != nil {
187
185
return nil , err
188
186
}
189
-
187
+
190
188
b .authConfig , err = b .client .Login (ctx , registryURL , "" , "" , true , false , false )
191
189
if err != nil {
192
190
return nil , err
193
191
}
194
-
192
+
195
193
return b .authConfig , nil
196
194
}
197
195
@@ -201,25 +199,25 @@ func (b *Builder) pushImage(ctx context.Context, writer io.Writer, imageName str
201
199
if err != nil {
202
200
return err
203
201
}
204
-
202
+
205
203
encodedAuth , err := encodeAuthToBase64 (* b .authConfig )
206
204
if err != nil {
207
205
return err
208
206
}
209
-
207
+
210
208
out , err := b .client .ImagePush (ctx , reference .FamiliarString (ref ), image.PushOptions {
211
209
RegistryAuth : encodedAuth ,
212
210
})
213
211
if err != nil {
214
212
return err
215
213
}
216
-
214
+
217
215
outStream := streams .NewOut (writer )
218
216
err = jsonmessage .DisplayJSONMessagesStream (out , outStream , outStream .FD (), outStream .IsTerminal (), nil )
219
217
if err != nil {
220
218
return err
221
219
}
222
-
220
+
223
221
return nil
224
222
}
225
223
@@ -228,6 +226,6 @@ func encodeAuthToBase64(authConfig dockerregistry.AuthConfig) (string, error) {
228
226
if err != nil {
229
227
return "" , err
230
228
}
231
-
229
+
232
230
return base64 .URLEncoding .EncodeToString (buf ), nil
233
231
}
0 commit comments