Explorar o código

LCOW: Rework after 33454 merged which refactored daemon/builder interface

Signed-off-by: John Howard <jhoward@microsoft.com>
John Howard %!s(int64=8) %!d(string=hai) anos
pai
achega
3a09b56a10

+ 2 - 2
builder/builder.go

@@ -43,7 +43,7 @@ type Backend interface {
 	// ContainerCreateWorkdir creates the workdir
 	ContainerCreateWorkdir(containerID string) error
 
-	CreateImage(config []byte, parent string) (Image, error)
+	CreateImage(config []byte, parent string, platform string) (Image, error)
 
 	ImageCacheBuilder
 }
@@ -100,6 +100,6 @@ type Image interface {
 type ReleaseableLayer interface {
 	Release() error
 	Mount() (string, error)
-	Commit() (ReleaseableLayer, error)
+	Commit(platform string) (ReleaseableLayer, error)
 	DiffID() layer.DiffID
 }

+ 2 - 2
builder/dockerfile/internals.go

@@ -65,7 +65,7 @@ func (b *Builder) commitContainer(dispatchState *dispatchState, id string, conta
 }
 
 func (b *Builder) exportImage(state *dispatchState, imageMount *imageMount, runConfig *container.Config) error {
-	newLayer, err := imageMount.Layer().Commit()
+	newLayer, err := imageMount.Layer().Commit(b.platform)
 	if err != nil {
 		return err
 	}
@@ -93,7 +93,7 @@ func (b *Builder) exportImage(state *dispatchState, imageMount *imageMount, runC
 		return errors.Wrap(err, "failed to encode image config")
 	}
 
-	exportedImage, err := b.docker.CreateImage(config, state.imageID)
+	exportedImage, err := b.docker.CreateImage(config, state.imageID, parentImage.OS)
 	if err != nil {
 		return errors.Wrapf(err, "failed to export image")
 	}

+ 2 - 2
builder/dockerfile/mockbackend_test.go

@@ -78,7 +78,7 @@ func (m *MockBackend) MakeImageCache(cacheFrom []string, platform string) builde
 	return nil
 }
 
-func (m *MockBackend) CreateImage(config []byte, parent string) (builder.Image, error) {
+func (m *MockBackend) CreateImage(config []byte, parent string, platform string) (builder.Image, error) {
 	return nil, nil
 }
 
@@ -121,7 +121,7 @@ func (l *mockLayer) Mount() (string, error) {
 	return "mountPath", nil
 }
 
-func (l *mockLayer) Commit() (builder.ReleaseableLayer, error) {
+func (l *mockLayer) Commit(string) (builder.ReleaseableLayer, error) {
 	return nil, nil
 }
 

+ 11 - 7
daemon/build.go

@@ -2,6 +2,7 @@ package daemon
 
 import (
 	"io"
+	"runtime"
 
 	"github.com/Sirupsen/logrus"
 	"github.com/docker/distribution/reference"
@@ -39,7 +40,7 @@ func (rl *releaseableLayer) Mount() (string, error) {
 	return rl.rwLayer.Mount("")
 }
 
-func (rl *releaseableLayer) Commit() (builder.ReleaseableLayer, error) {
+func (rl *releaseableLayer) Commit(platform string) (builder.ReleaseableLayer, error) {
 	var chainID layer.ChainID
 	if rl.roLayer != nil {
 		chainID = rl.roLayer.ChainID()
@@ -50,7 +51,7 @@ func (rl *releaseableLayer) Commit() (builder.ReleaseableLayer, error) {
 		return nil, err
 	}
 
-	newLayer, err := rl.layerStore.Register(stream, chainID)
+	newLayer, err := rl.layerStore.Register(stream, chainID, layer.Platform(platform))
 	if err != nil {
 		return nil, err
 	}
@@ -139,7 +140,7 @@ func (daemon *Daemon) pullForBuilder(ctx context.Context, name string, authConfi
 // leaking of layers.
 func (daemon *Daemon) GetImageAndReleasableLayer(ctx context.Context, refOrID string, opts backend.GetImageAndLayerOptions) (builder.Image, builder.ReleaseableLayer, error) {
 	if refOrID == "" {
-		layer, err := newReleasableLayerForImage(nil, daemon.layerStore)
+		layer, err := newReleasableLayerForImage(nil, daemon.stores[opts.Platform].layerStore)
 		return nil, layer, err
 	}
 
@@ -163,19 +164,22 @@ func (daemon *Daemon) GetImageAndReleasableLayer(ctx context.Context, refOrID st
 // CreateImage creates a new image by adding a config and ID to the image store.
 // This is similar to LoadImage() except that it receives JSON encoded bytes of
 // an image instead of a tar archive.
-func (daemon *Daemon) CreateImage(config []byte, parent string) (builder.Image, error) {
-	id, err := daemon.imageStore.Create(config)
+func (daemon *Daemon) CreateImage(config []byte, parent string, platform string) (builder.Image, error) {
+	if platform == "" {
+		platform = runtime.GOOS
+	}
+	id, err := daemon.stores[platform].imageStore.Create(config)
 	if err != nil {
 		return nil, errors.Wrapf(err, "failed to create image")
 	}
 
 	if parent != "" {
-		if err := daemon.imageStore.SetParent(id, image.ID(parent)); err != nil {
+		if err := daemon.stores[platform].imageStore.SetParent(id, image.ID(parent)); err != nil {
 			return nil, errors.Wrapf(err, "failed to set parent %s", parent)
 		}
 	}
 
-	return daemon.imageStore.Get(id)
+	return daemon.stores[platform].imageStore.Get(id)
 }
 
 // IDMappings returns uid/gid mappings for the builder

+ 1 - 1
daemon/commit.go

@@ -170,7 +170,7 @@ func (daemon *Daemon) Commit(name string, c *backend.ContainerCommitConfig) (str
 		}
 	}
 
-	l, err := daemon.stores[container.Platform].layerStore.Register(rwTar, rootFS.ChainID(), layer.Platform(container.Platform))
+	l, err := daemon.stores[container.Platform].layerStore.Register(rwTar, parent.RootFS.ChainID(), layer.Platform(container.Platform))
 	if err != nil {
 		return "", err
 	}