-
Notifications
You must be signed in to change notification settings - Fork 18
/
dockerfile.go
77 lines (63 loc) · 1.56 KB
/
dockerfile.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package dockerfile
import (
"context"
"encoding/json"
"github.com/moby/buildkit/client/llb/sourceresolver"
"github.com/moby/buildkit/frontend/dockerfile/dockerfile2llb"
"github.com/moby/buildkit/frontend/dockerui"
"github.com/moby/buildkit/solver/pb"
"github.com/opencontainers/go-digest"
)
type DummyResolver struct{}
func (dr *DummyResolver) ResolveImageConfig(
ctx context.Context,
ref string,
opt sourceresolver.Opt,
) (string, digest.Digest, []byte, error) {
return ref, "", []byte("{}"), nil
}
func LocalContextSourcePaths(
ctx context.Context,
dockerfileContents []byte,
dockerArguments map[string]string,
) ([]string, error) {
var result []string
state, _, _, _, err := dockerfile2llb.Dockerfile2LLB(context.Background(), dockerfileContents,
dockerfile2llb.ConvertOpt{
Config: dockerui.Config{
BuildArgs: dockerArguments,
},
MetaResolver: &DummyResolver{},
},
)
if err != nil {
return nil, err
}
marshalledState, err := state.Marshal(ctx)
if err != nil {
return nil, err
}
for _, dt := range marshalledState.Def {
var op pb.Op
if err := (&op).Unmarshal(dt); err != nil {
return nil, err
}
source := op.GetSource()
if source == nil {
continue
}
if source.Identifier != "local://"+dockerui.DefaultLocalNameContext {
continue
}
followPathsJSON, ok := source.Attrs[pb.AttrFollowPaths]
if !ok {
continue
}
var followPaths []string
if err := json.Unmarshal([]byte(followPathsJSON), &followPaths); err != nil {
return nil, err
}
result = append(result, followPaths...)
}
return result, nil
}