Skip to content

Commit

Permalink
Simplify image config build
Browse files Browse the repository at this point in the history
This requires callers to pass in a default image config instead of
expecting the function to resolve a config from an image ref.
This makes things a bit easier to integrate with and not making
assumptions that the base config is going to come from an image ref.

In the future I plan to make the default base config to by built-in
rather than always pulling from an image ref.
This will save a round trip with the registry and makes ure we aren't
relying on an image in the registry that we wouldn't otherwise need to.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
  • Loading branch information
cpuguy83 committed May 9, 2024
1 parent 95069cb commit 1ba981a
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 169 deletions.
5 changes: 3 additions & 2 deletions frontend/azlinux/azlinux3.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/moby/buildkit/client/llb"
"github.com/moby/buildkit/client/llb/sourceresolver"
gwclient "github.com/moby/buildkit/frontend/gateway/client"
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
)

const (
Expand Down Expand Up @@ -38,8 +39,8 @@ func (w azlinux3) Install(pkgs []string, opts ...installOpt) llb.RunOption {
return dalec.WithRunOptions(tdnfInstall(&cfg, "3.0", pkgs), w.tdnfCacheMount(cfg.root))
}

func (azlinux3) DefaultImageConfig(ctx context.Context, client gwclient.Client) (*dalec.DockerImageSpec, error) {
_, _, dt, err := client.ResolveImageConfig(ctx, azlinux3DistrolessRef, sourceresolver.Opt{})
func (azlinux3) DefaultImageConfig(ctx context.Context, resolver llb.ImageMetaResolver, platform *ocispecs.Platform) (*dalec.DockerImageSpec, error) {
_, _, dt, err := resolver.ResolveImageConfig(ctx, azlinux3DistrolessRef, sourceresolver.Opt{Platform: platform})
if err != nil {
return nil, err
}
Expand Down
55 changes: 31 additions & 24 deletions frontend/azlinux/handle_container.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,30 +53,9 @@ func handleContainer(w worker) gwclient.BuildFunc {
return nil, nil, err
}

var img *dalec.DockerImageSpec
if base := frontend.GetBaseOutputImage(spec, targetKey, ""); base != "" {
_, _, dt, err := client.ResolveImageConfig(ctx, base, sourceresolver.Opt{})
if err != nil {
return nil, nil, errors.Wrap(err, "error resolving base image config")
}
var cfg dalec.DockerImageSpec
if err := json.Unmarshal(dt, &cfg); err != nil {
return nil, nil, errors.Wrap(err, "error unmarshalling base image config")
}
img = &cfg
} else {
img, err = w.DefaultImageConfig(ctx, client)
if err != nil {
return nil, nil, errors.Wrap(err, "could not get default image config")
}
}

// TODO: DNM: This is not merging the image config from the spec.
specImg := frontend.MergeSpecImage(spec, targetKey)

err = dalec.MergeImageConfig(&img.Config, specImg)
img, err := resolveBaseConfig(ctx, w, client, platform, spec, targetKey)
if err != nil {
return nil, nil, err
return nil, nil, errors.Wrap(err, "could not resolve base image config")
}

ref, err := res.SingleRef()
Expand Down Expand Up @@ -147,7 +126,7 @@ func specToContainerLLB(w worker, client gwclient.Client, spec *dalec.Spec, targ
builderImg := w.Base(client, opts...)

rootfs := llb.Scratch()
if ref := frontend.GetBaseOutputImage(spec, target, ""); ref != "" {
if ref := dalec.GetBaseOutputImage(spec, target); ref != "" {
rootfs = llb.Image(ref, llb.WithMetaResolver(sOpt.Resolver), dalec.WithConstraints(opts...))
}

Expand Down Expand Up @@ -213,3 +192,31 @@ type runOptionFunc func(*llb.ExecInfo)
func (f runOptionFunc) SetRunOption(ei *llb.ExecInfo) {
f(ei)
}

func resolveBaseConfig(ctx context.Context, w worker, resolver llb.ImageMetaResolver, platform *ocispecs.Platform, spec *dalec.Spec, targetKey string) (*dalec.DockerImageSpec, error) {
var img *dalec.DockerImageSpec

if ref := dalec.GetBaseOutputImage(spec, targetKey); ref != "" {
_, _, dt, err := resolver.ResolveImageConfig(ctx, ref, sourceresolver.Opt{Platform: platform})
if err != nil {
return nil, errors.Wrap(err, "error resolving base image config")
}

var i dalec.DockerImageSpec
if err := json.Unmarshal(dt, &i); err != nil {
return nil, errors.Wrap(err, "error unmarshalling base image config")
}
img = &i
} else {
var err error
img, err = w.DefaultImageConfig(ctx, resolver, platform)
if err != nil {
return nil, errors.Wrap(err, "error resolving default image config")
}
}

if err := dalec.BuildImageConfig(spec, targetKey, img); err != nil {
return nil, err
}
return img, nil
}
22 changes: 3 additions & 19 deletions frontend/azlinux/handle_depsonly.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@ package azlinux

import (
"context"
"encoding/json"
"strings"

"github.com/Azure/dalec"
"github.com/Azure/dalec/frontend"
"github.com/moby/buildkit/client/llb"
"github.com/moby/buildkit/client/llb/sourceresolver"
gwclient "github.com/moby/buildkit/frontend/gateway/client"
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/pkg/errors"
)

func handleDepsOnly(w worker) gwclient.BuildFunc {
Expand Down Expand Up @@ -51,22 +48,9 @@ func handleDepsOnly(w worker) gwclient.BuildFunc {
return nil, nil, err
}

var img *dalec.DockerImageSpec
if base := frontend.GetBaseOutputImage(spec, targetKey, ""); base != "" {
_, _, dt, err := client.ResolveImageConfig(ctx, base, sourceresolver.Opt{})
if err != nil {
return nil, nil, errors.Wrap(err, "error resolving base image config")
}
var cfg dalec.DockerImageSpec
if err := json.Unmarshal(dt, &cfg); err != nil {
return nil, nil, errors.Wrap(err, "error unmarshalling base image config")
}
img = &cfg
} else {
img, err = w.DefaultImageConfig(ctx, client)
if err != nil {
return nil, nil, errors.Wrap(err, "could not get default image config")
}
img, err := resolveBaseConfig(ctx, w, client, platform, spec, targetKey)
if err != nil {
return nil, nil, err
}

ref, err := res.SingleRef()
Expand Down
3 changes: 2 additions & 1 deletion frontend/azlinux/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/moby/buildkit/client/llb"
gwclient "github.com/moby/buildkit/frontend/gateway/client"
"github.com/moby/buildkit/frontend/subrequests/targets"
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
)

const (
Expand All @@ -20,7 +21,7 @@ const (
type worker interface {
Base(resolver llb.ImageMetaResolver, opts ...llb.ConstraintsOpt) llb.State
Install(pkgs []string, opts ...installOpt) llb.RunOption
DefaultImageConfig(context.Context, gwclient.Client) (*dalec.DockerImageSpec, error)
DefaultImageConfig(context.Context, llb.ImageMetaResolver, *ocispecs.Platform) (*dalec.DockerImageSpec, error)
}

func newHandler(w worker) gwclient.BuildFunc {
Expand Down
7 changes: 5 additions & 2 deletions frontend/azlinux/mariner2.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/moby/buildkit/client/llb"
"github.com/moby/buildkit/client/llb/sourceresolver"
gwclient "github.com/moby/buildkit/frontend/gateway/client"
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
)

const (
Expand Down Expand Up @@ -38,8 +39,10 @@ func (w mariner2) Install(pkgs []string, opts ...installOpt) llb.RunOption {
return dalec.WithRunOptions(tdnfInstall(&cfg, "2.0", pkgs), w.tdnfCacheMount(cfg.root))
}

func (mariner2) DefaultImageConfig(ctx context.Context, client gwclient.Client) (*dalec.DockerImageSpec, error) {
_, _, dt, err := client.ResolveImageConfig(ctx, mariner2DistrolessRef, sourceresolver.Opt{})
func (mariner2) DefaultImageConfig(ctx context.Context, resolver llb.ImageMetaResolver, platform *ocispecs.Platform) (*dalec.DockerImageSpec, error) {
_, _, dt, err := resolver.ResolveImageConfig(ctx, mariner2DistrolessRef, sourceresolver.Opt{
Platform: platform,
})
if err != nil {
return nil, err
}
Expand Down
116 changes: 0 additions & 116 deletions frontend/imgconfig.go

This file was deleted.

26 changes: 21 additions & 5 deletions frontend/windows/handle_container.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@ package windows

import (
"context"
"encoding/json"
"fmt"
"runtime"

"github.com/Azure/dalec"
"github.com/Azure/dalec/frontend"
"github.com/moby/buildkit/client/llb"
"github.com/moby/buildkit/client/llb/sourceresolver"
"github.com/moby/buildkit/frontend/dockerui"
gwclient "github.com/moby/buildkit/frontend/gateway/client"
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/pkg/errors"
)

const (
Expand Down Expand Up @@ -82,16 +85,29 @@ func handleContainer(ctx context.Context, client gwclient.Client) (*gwclient.Res
return nil, nil, err
}

base := frontend.GetBaseOutputImage(spec, targetKey, defaultBaseImage)
imgRef := dalec.GetBaseOutputImage(spec, targetKey)
if imgRef == "" {
imgRef = defaultBaseImage
}

img, err := frontend.BuildImageConfig(ctx, client, spec, targetKey, base, frontend.WithPlatform(targetPlatform))
_, _, dt, err := client.ResolveImageConfig(ctx, imgRef, sourceresolver.Opt{
Platform: &targetPlatform,
})
if err != nil {
return nil, nil, err
return nil, nil, errors.Wrap(err, "could not resolve base image config")
}

ref, err := res.SingleRef()
var img dalec.DockerImageSpec
if err := json.Unmarshal(dt, &img); err != nil {
return nil, nil, errors.Wrap(err, "error unmarshalling base image config")
}

if err := dalec.BuildImageConfig(spec, targetKey, &img); err != nil {
return nil, nil, errors.Wrap(err, "error creating image config")
}

return ref, img, err
ref, err := res.SingleRef()
return ref, &img, err
})
}

Expand Down
Loading

0 comments on commit 1ba981a

Please sign in to comment.