From a4f6a65d82db166c3214b7c5ee8942d6bd02a9e9 Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Thu, 16 May 2024 17:14:42 +0200 Subject: [PATCH] fix --resolve-image-digests Signed-off-by: Nicolas De Loof --- cmd/compose/config.go | 93 ++++++++++++++++++++++++++----------------- go.mod | 2 +- go.sum | 4 +- pkg/compose/pull.go | 3 +- 4 files changed, 62 insertions(+), 40 deletions(-) diff --git a/cmd/compose/config.go b/cmd/compose/config.go index ab6d5c583a..9993ca311c 100644 --- a/cmd/compose/config.go +++ b/cmd/compose/config.go @@ -143,47 +143,15 @@ func configCommand(p *ProjectOptions, dockerCli command.Cli) *cobra.Command { return cmd } -func runConfig(ctx context.Context, dockerCli command.Cli, opts configOptions, services []string) error { +func runConfig(ctx context.Context, dockerCli command.Cli, opts configOptions, services []string) (err error) { var content []byte if opts.noInterpolate { - // we can't use ToProject, so the model we render here is only partially resolved - model, err := opts.ToModel(ctx, dockerCli, services) - if err != nil { - return err - } - - if opts.resolveImageDigests { - err = resolveImageDigests(ctx, dockerCli, model) - if err != nil { - return err - } - } - - content, err = formatModel(model, opts.Format) + content, err = runConfigNoInterpolate(ctx, dockerCli, opts, services) if err != nil { return err } } else { - project, err := opts.ToProject(ctx, dockerCli, services) - if err != nil { - return err - } - - if !opts.noConsistency { - err := project.CheckContainerNameUnicity() - if err != nil { - return err - } - } - - switch opts.Format { - case "json": - content, err = project.MarshalJSON() - case "yaml": - content, err = project.MarshalYAML() - default: - return fmt.Errorf("unsupported format %q", opts.Format) - } + content, err = runConfigInterpolate(ctx, dockerCli, opts, services) if err != nil { return err } @@ -200,10 +168,62 @@ func runConfig(ctx context.Context, dockerCli command.Cli, opts configOptions, s if opts.Output != "" && len(content) > 0 { return os.WriteFile(opts.Output, content, 0o666) } - _, err := fmt.Fprint(dockerCli.Out(), string(content)) + _, err = fmt.Fprint(dockerCli.Out(), string(content)) return err } +func runConfigInterpolate(ctx context.Context, dockerCli command.Cli, opts configOptions, services []string) ([]byte, error) { + project, err := opts.ToProject(ctx, dockerCli, services) + if err != nil { + return nil, err + } + + if opts.resolveImageDigests { + project, err = project.WithImagesResolved(compose.ImageDigestResolver(ctx, dockerCli.ConfigFile(), dockerCli.Client())) + if err != nil { + return nil, err + } + } + + if !opts.noConsistency { + err := project.CheckContainerNameUnicity() + if err != nil { + return nil, err + } + } + + var content []byte + switch opts.Format { + case "json": + content, err = project.MarshalJSON() + case "yaml": + content, err = project.MarshalYAML() + default: + return nil, fmt.Errorf("unsupported format %q", opts.Format) + } + if err != nil { + return nil, err + } + return content, nil +} + +func runConfigNoInterpolate(ctx context.Context, dockerCli command.Cli, opts configOptions, services []string) ([]byte, error) { + // we can't use ToProject, so the model we render here is only partially resolved + model, err := opts.ToModel(ctx, dockerCli, services) + if err != nil { + return nil, err + } + + if opts.resolveImageDigests { + err = resolveImageDigests(ctx, dockerCli, model) + if err != nil { + return nil, err + } + } + + return formatModel(model, opts.Format) +} + func resolveImageDigests(ctx context.Context, dockerCli command.Cli, model map[string]any) (err error) { // create a pseudo-project so we can rely on WithImagesResolved to resolve images p := &types.Project{ @@ -342,6 +362,7 @@ func runConfigImages(ctx context.Context, dockerCli command.Cli, opts configOpti if err != nil { return err } + for _, s := range project.Services { fmt.Fprintln(dockerCli.Out(), api.GetImageNameOrDefault(s, project.Name)) } diff --git a/go.mod b/go.mod index a072de0dff..d06455de0c 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/Microsoft/go-winio v0.6.2 github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/buger/goterm v1.0.4 - github.com/compose-spec/compose-go/v2 v2.1.0 + github.com/compose-spec/compose-go/v2 v2.1.1-0.20240516145816-197e6352c64a github.com/containerd/console v1.0.4 github.com/containerd/containerd v1.7.16 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index 19f17dcc29..9b060c5af0 100644 --- a/go.sum +++ b/go.sum @@ -90,8 +90,8 @@ github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+g github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/compose-spec/compose-go/v2 v2.1.0 h1:qdW2qISQlCQG8v1O2TChcdxgAWTUGgUX/CPSO+ES9+E= -github.com/compose-spec/compose-go/v2 v2.1.0/go.mod h1:bEPizBkIojlQ20pi2vNluBa58tevvj0Y18oUSHPyfdc= +github.com/compose-spec/compose-go/v2 v2.1.1-0.20240516145816-197e6352c64a h1:R0ufvPulvRvFa8JaFEWzSJmkhjfeArXD9vKk0jpmpM4= +github.com/compose-spec/compose-go/v2 v2.1.1-0.20240516145816-197e6352c64a/go.mod h1:bEPizBkIojlQ20pi2vNluBa58tevvj0Y18oUSHPyfdc= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= diff --git a/pkg/compose/pull.go b/pkg/compose/pull.go index ac227bbc84..046d3faeb5 100644 --- a/pkg/compose/pull.go +++ b/pkg/compose/pull.go @@ -264,7 +264,8 @@ func ImageDigestResolver(ctx context.Context, file *configfile.ConfigFile, apiCl } inspect, err := apiClient.DistributionInspect(ctx, named.String(), auth) if err != nil { - return "", err + return "", + fmt.Errorf("failed ot resolve digest for %s: %w", named.String(), err) } return inspect.Descriptor.Digest, nil }