Skip to content

Commit 853cfc3

Browse files
committed
Add support for .dockerignore files
Signed-off-by: Tristan Pemble <[email protected]>
1 parent 4180407 commit 853cfc3

File tree

1 file changed

+54
-9
lines changed

1 file changed

+54
-9
lines changed

cmd/buildkit-nix/frontend.go

+54-9
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/moby/buildkit/client/llb"
1313
"github.com/moby/buildkit/exporter/containerimage/exptypes"
1414
"github.com/moby/buildkit/frontend/dockerfile/dockerfile2llb"
15+
"github.com/moby/buildkit/frontend/dockerfile/dockerignore"
1516
"github.com/moby/buildkit/frontend/gateway/client"
1617
"github.com/moby/buildkit/frontend/gateway/grpcclient"
1718
"github.com/moby/buildkit/util/appcontext"
@@ -31,9 +32,10 @@ func newFrontendCmd() *cobra.Command {
3132

3233
// mimic dockerfile.v1 frontend
3334
const (
34-
localNameContext = "context"
35-
localNameDockerfile = "dockerfile"
36-
keyFilename = "filename"
35+
localNameContext = "context"
36+
localNameDockerfile = "dockerfile"
37+
keyFilename = "filename"
38+
dockerignoreFilename = ".dockerignore"
3739
)
3840

3941
func frontendAction(cmd *cobra.Command, args []string) error {
@@ -55,6 +57,7 @@ func frontendBuild(nixImage string) client.BuildFunc {
5557
localDfSt := llb.Local(localNameDockerfile,
5658
llb.SessionID(c.BuildOpts().SessionID),
5759
dockerfile2llb.WithInternalName("local dockerfile"),
60+
llb.FollowPaths([]string{dfName}),
5861
)
5962

6063
// Inject the self binary into the ExecOp.
@@ -67,14 +70,13 @@ func frontendBuild(nixImage string) client.BuildFunc {
6770
if err != nil {
6871
return nil, err
6972
}
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+
}
7577

7678
runSt := nixImageSt.Run(
77-
llb.AddMount("/context", localCtxSt),
79+
llb.AddMount("/context", *localCtxSt),
7880
llb.AddMount("/dockerfile", localDfSt),
7981
llb.AddMount("/self", *selfImageSt),
8082
llb.AddMount("/out", llb.Scratch()),
@@ -209,3 +211,46 @@ func validateSelfImageSt(ctx context.Context, c client.Client, selfImageSt llb.S
209211
}
210212
return selfPath, nil
211213
}
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

Comments
 (0)