c276a8b8ba
Fields in CUE were renamed to the lowercase version of Dockerfile instructions. There's now opportunity to make other fields simpler to use (e.g., healthcheck), this commit is focused on env. Signed-off-by: Helder Correia <174525+helderco@users.noreply.github.com>
74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package task
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/docker/distribution/reference"
|
|
"github.com/moby/buildkit/client/llb"
|
|
"github.com/rs/zerolog/log"
|
|
"go.dagger.io/dagger/compiler"
|
|
"go.dagger.io/dagger/plancontext"
|
|
"go.dagger.io/dagger/solver"
|
|
)
|
|
|
|
func init() {
|
|
Register("Pull", func() Task { return &pullTask{} })
|
|
}
|
|
|
|
type pullTask struct {
|
|
}
|
|
|
|
func (c *pullTask) Run(ctx context.Context, pctx *plancontext.Context, s solver.Solver, v *compiler.Value) (*compiler.Value, error) {
|
|
lg := log.Ctx(ctx)
|
|
|
|
rawRef, err := v.Lookup("source").String()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Read auth info
|
|
auth, err := decodeAuthValue(pctx, v.Lookup("auth"))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, a := range auth {
|
|
s.AddCredentials(a.Target, a.Username, a.Secret.PlainText())
|
|
lg.Debug().Str("target", a.Target).Msg("add target credentials")
|
|
}
|
|
|
|
ref, err := reference.ParseNormalizedNamed(rawRef)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse ref %s: %w", rawRef, err)
|
|
}
|
|
// Add the default tag "latest" to a reference if it only has a repo name.
|
|
ref = reference.TagNameOnly(ref)
|
|
|
|
st := llb.Image(
|
|
ref.String(),
|
|
withCustomName(v, "Pull %s", rawRef),
|
|
)
|
|
|
|
// Load image metadata and convert to to LLB.
|
|
platform := pctx.Platform.Get()
|
|
image, digest, err := s.ResolveImageConfig(ctx, ref.String(), llb.ResolveImageConfigOpt{
|
|
LogName: vertexNamef(v, "load metadata for %s", ref.String()),
|
|
Platform: &platform,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
result, err := s.Solve(ctx, st, pctx.Platform.Get())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
fs := pctx.FS.New(result)
|
|
|
|
return compiler.NewValue().FillFields(map[string]interface{}{
|
|
"output": fs.MarshalCUE(),
|
|
"digest": digest,
|
|
"config": ConvertImageConfig(image.Config),
|
|
})
|
|
}
|