-
Notifications
You must be signed in to change notification settings - Fork 13
/
handle_depsonly.go
59 lines (50 loc) 路 1.72 KB
/
handle_depsonly.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
package mariner2
import (
"context"
"strings"
"github.com/Azure/dalec"
"github.com/Azure/dalec/frontend"
"github.com/moby/buildkit/client/llb"
gwclient "github.com/moby/buildkit/frontend/gateway/client"
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
)
func handleDepsOnly(ctx context.Context, client gwclient.Client) (*gwclient.Result, error) {
return frontend.BuildWithPlatform(ctx, client, func(ctx context.Context, client gwclient.Client, platform *ocispecs.Platform, spec *dalec.Spec, targetKey string) (gwclient.Reference, *dalec.DockerImageSpec, error) {
pg := dalec.ProgressGroup("Build mariner2 deps-only container: " + spec.Name)
baseImg := getWorkerImage(client, pg)
rpmDir := baseImg.Run(
shArgs(`set -ex; dir="/tmp/rpms/RPMS/$(uname -m)"; mkdir -p "${dir}"; tdnf install -y --releasever=2.0 --downloadonly --alldeps --downloaddir "${dir}" `+strings.Join(spec.GetRuntimeDeps(targetKey), " ")),
defaultTdnfCacheMount(),
pg,
).
AddMount("/tmp/rpms", llb.Scratch())
sOpt, err := frontend.SourceOptFromClient(ctx, client)
if err != nil {
return nil, nil, err
}
st, err := specToContainerLLB(spec, targetKey, baseImg, rpmDir, sOpt, pg)
if err != nil {
return nil, nil, err
}
def, err := st.Marshal(ctx, pg)
if err != nil {
return nil, nil, err
}
res, err := client.Solve(ctx, gwclient.SolveRequest{
Definition: def.ToPB(),
})
if err != nil {
return nil, nil, err
}
base := frontend.GetBaseOutputImage(spec, targetKey, marinerDistrolessRef)
img, err := frontend.BuildImageConfig(ctx, client, spec, targetKey, base)
if err != nil {
return nil, nil, err
}
ref, err := res.SingleRef()
if err != nil {
return nil, nil, err
}
return ref, img, nil
})
}