@@ -12,6 +12,7 @@ import (
12
12
"github.com/moby/buildkit/client/llb"
13
13
"github.com/moby/buildkit/exporter/containerimage/exptypes"
14
14
"github.com/moby/buildkit/frontend/dockerfile/dockerfile2llb"
15
+ "github.com/moby/buildkit/frontend/dockerfile/dockerignore"
15
16
"github.com/moby/buildkit/frontend/gateway/client"
16
17
"github.com/moby/buildkit/frontend/gateway/grpcclient"
17
18
"github.com/moby/buildkit/util/appcontext"
@@ -31,9 +32,10 @@ func newFrontendCmd() *cobra.Command {
31
32
32
33
// mimic dockerfile.v1 frontend
33
34
const (
34
- localNameContext = "context"
35
- localNameDockerfile = "dockerfile"
36
- keyFilename = "filename"
35
+ localNameContext = "context"
36
+ localNameDockerfile = "dockerfile"
37
+ keyFilename = "filename"
38
+ dockerignoreFilename = ".dockerignore"
37
39
)
38
40
39
41
func frontendAction (cmd * cobra.Command , args []string ) error {
@@ -55,6 +57,7 @@ func frontendBuild(nixImage string) client.BuildFunc {
55
57
localDfSt := llb .Local (localNameDockerfile ,
56
58
llb .SessionID (c .BuildOpts ().SessionID ),
57
59
dockerfile2llb .WithInternalName ("local dockerfile" ),
60
+ llb .FollowPaths ([]string {dfName }),
58
61
)
59
62
60
63
// Inject the self binary into the ExecOp.
@@ -67,14 +70,13 @@ func frontendBuild(nixImage string) client.BuildFunc {
67
70
if err != nil {
68
71
return nil , err
69
72
}
70
-
71
- localCtxSt := llb .Local (localNameContext ,
72
- llb .SessionID (c .BuildOpts ().SessionID ),
73
- dockerfile2llb .WithInternalName ("local context" ),
74
- )
73
+ localCtxSt , err := getContextSt (ctx , c )
74
+ if err != nil {
75
+ return nil , err
76
+ }
75
77
76
78
runSt := nixImageSt .Run (
77
- llb .AddMount ("/context" , localCtxSt ),
79
+ llb .AddMount ("/context" , * localCtxSt ),
78
80
llb .AddMount ("/dockerfile" , localDfSt ),
79
81
llb .AddMount ("/self" , * selfImageSt ),
80
82
llb .AddMount ("/out" , llb .Scratch ()),
@@ -209,3 +211,46 @@ func validateSelfImageSt(ctx context.Context, c client.Client, selfImageSt llb.S
209
211
}
210
212
return selfPath , nil
211
213
}
214
+
215
+ func getContextSt (ctx context.Context , c client.Client ) (* llb.State , error ) {
216
+ st := llb .Local (localNameContext ,
217
+ llb .SessionID (c .BuildOpts ().SessionID ),
218
+ llb .FollowPaths ([]string {dockerignoreFilename }),
219
+ dockerfile2llb .WithInternalName ("load " + dockerignoreFilename ),
220
+ llb .Differ (llb .DiffNone , false ),
221
+ )
222
+ def , err := st .Marshal (ctx )
223
+ if err != nil {
224
+ return nil , err
225
+ }
226
+ res , err := c .Solve (ctx , client.SolveRequest {
227
+ Evaluate : true ,
228
+ Definition : def .ToPB (),
229
+ })
230
+ if err != nil {
231
+ return nil , err
232
+ }
233
+ ref , err := res .SingleRef ()
234
+ if err != nil {
235
+ return nil , err
236
+ }
237
+ dt , _ := ref .ReadFile (ctx , client.ReadRequest {
238
+ Filename : dockerignoreFilename ,
239
+ }) // error ignored
240
+
241
+ var excludes []string
242
+ if len (dt ) != 0 {
243
+ excludes , err = dockerignore .ReadAll (bytes .NewBuffer (dt ))
244
+ if err != nil {
245
+ return nil , err
246
+ }
247
+ }
248
+
249
+ st = llb .Local (localNameContext ,
250
+ dockerfile2llb .WithInternalName ("load build context" ),
251
+ llb .SessionID (c .BuildOpts ().SessionID ),
252
+ llb .ExcludePatterns (excludes ),
253
+ )
254
+
255
+ return & st , nil
256
+ }
0 commit comments