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 Apr 30, 2024
1 parent fd819ef commit 243641f
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 164 deletions.
49 changes: 25 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, 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,25 @@ type runOptionFunc func(*llb.ExecInfo)
func (f runOptionFunc) SetRunOption(ei *llb.ExecInfo) {
f(ei)
}

func resolveBaseConfig(ctx context.Context, resolver llb.ImageMetaResolver, platform *ocispecs.Platform, spec *dalec.Spec, targetKey string) (*dalec.DockerImageSpec, error) {
baseRef := dalec.GetBaseOutputImage(spec, targetKey)
if baseRef == "" {
baseRef = mariner2DistrolessRef
}

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

var img dalec.DockerImageSpec
if err := json.Unmarshal(dt, &img); err != nil {
return nil, errors.Wrap(err, "error unmarshalling base 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, client, platform, spec, targetKey)
if err != nil {
return nil, nil, err
}

ref, err := res.SingleRef()
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 @@ -73,16 +76,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
61 changes: 61 additions & 0 deletions imgconfig.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package dalec

func BuildImageConfig(spec *Spec, targetKey string, img *DockerImageSpec) error {
cfg := img.Config
if err := MergeImageConfig(&cfg, MergeSpecImage(spec, targetKey)); err != nil {
return err
}

img.Config = cfg
return nil
}

func GetBaseOutputImage(spec *Spec, target string) string {
i := spec.Targets[target].Image
if i == nil || i.Base == "" {
return ""
}
return i.Base
}

func MergeSpecImage(spec *Spec, targetKey string) *ImageConfig {
var cfg ImageConfig

if spec.Image != nil {
cfg = *spec.Image
}

if i := spec.Targets[targetKey].Image; i != nil {
if i.Entrypoint != "" {
cfg.Entrypoint = i.Entrypoint
}

if i.Cmd != "" {
cfg.Cmd = i.Cmd
}

cfg.Env = append(cfg.Env, i.Env...)

for k, v := range i.Volumes {
cfg.Volumes[k] = v
}

for k, v := range i.Labels {
cfg.Labels[k] = v
}

if i.WorkingDir != "" {
cfg.WorkingDir = i.WorkingDir
}

if i.StopSignal != "" {
cfg.StopSignal = i.StopSignal
}

if i.Base != "" {
cfg.Base = i.Base
}
}

return &cfg
}

0 comments on commit 243641f

Please sign in to comment.