1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

builder: update platform support to puller

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
This commit is contained in:
Tonis Tiigi 2018-06-26 16:17:28 -07:00
parent 337ba71fc1
commit 0b50d6c315
2 changed files with 26 additions and 12 deletions

View file

@ -113,7 +113,7 @@ func (is *imageSource) resolveLocal(refStr string) ([]byte, error) {
return img.RawJSON(), nil return img.RawJSON(), nil
} }
func (is *imageSource) ResolveImageConfig(ctx context.Context, ref string) (digest.Digest, []byte, error) { func (is *imageSource) ResolveImageConfig(ctx context.Context, ref string, platform *ocispec.Platform) (digest.Digest, []byte, error) {
if preferLocal { if preferLocal {
dt, err := is.resolveLocal(ref) dt, err := is.resolveLocal(ref)
if err == nil { if err == nil {
@ -126,7 +126,7 @@ func (is *imageSource) ResolveImageConfig(ctx context.Context, ref string) (dige
dt []byte dt []byte
} }
res, err := is.g.Do(ctx, ref, func(ctx context.Context) (interface{}, error) { res, err := is.g.Do(ctx, ref, func(ctx context.Context) (interface{}, error) {
dgst, dt, err := imageutil.Config(ctx, ref, is.getResolver(ctx), is.ContentStore, nil) dgst, dt, err := imageutil.Config(ctx, ref, is.getResolver(ctx), is.ContentStore, platform)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -145,10 +145,16 @@ func (is *imageSource) Resolve(ctx context.Context, id source.Identifier) (sourc
return nil, errors.Errorf("invalid image identifier %v", id) return nil, errors.Errorf("invalid image identifier %v", id)
} }
platform := platforms.DefaultSpec()
if imageIdentifier.Platform != nil {
platform = *imageIdentifier.Platform
}
p := &puller{ p := &puller{
src: imageIdentifier, src: imageIdentifier,
is: is, is: is,
resolver: is.getResolver(ctx), resolver: is.getResolver(ctx),
platform: platform,
} }
return p, nil return p, nil
} }
@ -163,17 +169,20 @@ type puller struct {
resolveErr error resolveErr error
resolver remotes.Resolver resolver remotes.Resolver
config []byte config []byte
platform ocispec.Platform
} }
func (p *puller) mainManifestKey(dgst digest.Digest) (digest.Digest, error) { func (p *puller) mainManifestKey(dgst digest.Digest, platform ocispec.Platform) (digest.Digest, error) {
dt, err := json.Marshal(struct { dt, err := json.Marshal(struct {
Digest digest.Digest Digest digest.Digest
OS string OS string
Arch string Arch string
Variant string `json:",omitempty"`
}{ }{
Digest: p.desc.Digest, Digest: p.desc.Digest,
OS: runtime.GOOS, OS: platform.OS,
Arch: runtime.GOARCH, Arch: platform.Architecture,
Variant: platform.Variant,
}) })
if err != nil { if err != nil {
return "", err return "", err
@ -248,7 +257,7 @@ func (p *puller) resolve(ctx context.Context) error {
return return
} }
_, dt, err := p.is.ResolveImageConfig(ctx, ref.String()) _, dt, err := p.is.ResolveImageConfig(ctx, ref.String(), &p.platform)
if err != nil { if err != nil {
p.resolveErr = err p.resolveErr = err
resolveProgressDone(err) resolveProgressDone(err)
@ -266,7 +275,7 @@ func (p *puller) CacheKey(ctx context.Context, index int) (string, bool, error)
p.resolveLocal() p.resolveLocal()
if p.desc.Digest != "" && index == 0 { if p.desc.Digest != "" && index == 0 {
dgst, err := p.mainManifestKey(p.desc.Digest) dgst, err := p.mainManifestKey(p.desc.Digest, p.platform)
if err != nil { if err != nil {
return "", false, err return "", false, err
} }
@ -282,7 +291,7 @@ func (p *puller) CacheKey(ctx context.Context, index int) (string, bool, error)
} }
if p.desc.Digest != "" && index == 0 { if p.desc.Digest != "" && index == 0 {
dgst, err := p.mainManifestKey(p.desc.Digest) dgst, err := p.mainManifestKey(p.desc.Digest, p.platform)
if err != nil { if err != nil {
return "", false, err return "", false, err
} }

View file

@ -9,6 +9,7 @@ import (
"time" "time"
"github.com/containerd/containerd/content" "github.com/containerd/containerd/content"
"github.com/containerd/containerd/platforms"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/backend" "github.com/docker/docker/api/types/backend"
"github.com/docker/docker/builder" "github.com/docker/docker/builder"
@ -208,6 +209,10 @@ func (b *Builder) Build(ctx context.Context, opt backend.BuildConfig) (*builder.
frontendAttrs["no-cache"] = "" frontendAttrs["no-cache"] = ""
} }
if opt.Options.Platform != nil {
frontendAttrs["platform"] = platforms.Format(*opt.Options.Platform)
}
exporterAttrs := map[string]string{} exporterAttrs := map[string]string{}
if len(opt.Options.Tags) > 0 { if len(opt.Options.Tags) > 0 {