Signed-off-by: John Howard <jhoward@microsoft.com>
| ... | ... |
@@ -43,7 +43,7 @@ type Backend interface {
|
| 43 | 43 |
// ContainerCreateWorkdir creates the workdir |
| 44 | 44 |
ContainerCreateWorkdir(containerID string) error |
| 45 | 45 |
|
| 46 |
- CreateImage(config []byte, parent string) (Image, error) |
|
| 46 |
+ CreateImage(config []byte, parent string, platform string) (Image, error) |
|
| 47 | 47 |
|
| 48 | 48 |
ImageCacheBuilder |
| 49 | 49 |
} |
| ... | ... |
@@ -100,6 +100,6 @@ type Image interface {
|
| 100 | 100 |
type ReleaseableLayer interface {
|
| 101 | 101 |
Release() error |
| 102 | 102 |
Mount() (string, error) |
| 103 |
- Commit() (ReleaseableLayer, error) |
|
| 103 |
+ Commit(platform string) (ReleaseableLayer, error) |
|
| 104 | 104 |
DiffID() layer.DiffID |
| 105 | 105 |
} |
| ... | ... |
@@ -65,7 +65,7 @@ func (b *Builder) commitContainer(dispatchState *dispatchState, id string, conta |
| 65 | 65 |
} |
| 66 | 66 |
|
| 67 | 67 |
func (b *Builder) exportImage(state *dispatchState, imageMount *imageMount, runConfig *container.Config) error {
|
| 68 |
- newLayer, err := imageMount.Layer().Commit() |
|
| 68 |
+ newLayer, err := imageMount.Layer().Commit(b.platform) |
|
| 69 | 69 |
if err != nil {
|
| 70 | 70 |
return err |
| 71 | 71 |
} |
| ... | ... |
@@ -93,7 +93,7 @@ func (b *Builder) exportImage(state *dispatchState, imageMount *imageMount, runC |
| 93 | 93 |
return errors.Wrap(err, "failed to encode image config") |
| 94 | 94 |
} |
| 95 | 95 |
|
| 96 |
- exportedImage, err := b.docker.CreateImage(config, state.imageID) |
|
| 96 |
+ exportedImage, err := b.docker.CreateImage(config, state.imageID, parentImage.OS) |
|
| 97 | 97 |
if err != nil {
|
| 98 | 98 |
return errors.Wrapf(err, "failed to export image") |
| 99 | 99 |
} |
| ... | ... |
@@ -78,7 +78,7 @@ func (m *MockBackend) MakeImageCache(cacheFrom []string, platform string) builde |
| 78 | 78 |
return nil |
| 79 | 79 |
} |
| 80 | 80 |
|
| 81 |
-func (m *MockBackend) CreateImage(config []byte, parent string) (builder.Image, error) {
|
|
| 81 |
+func (m *MockBackend) CreateImage(config []byte, parent string, platform string) (builder.Image, error) {
|
|
| 82 | 82 |
return nil, nil |
| 83 | 83 |
} |
| 84 | 84 |
|
| ... | ... |
@@ -121,7 +121,7 @@ func (l *mockLayer) Mount() (string, error) {
|
| 121 | 121 |
return "mountPath", nil |
| 122 | 122 |
} |
| 123 | 123 |
|
| 124 |
-func (l *mockLayer) Commit() (builder.ReleaseableLayer, error) {
|
|
| 124 |
+func (l *mockLayer) Commit(string) (builder.ReleaseableLayer, error) {
|
|
| 125 | 125 |
return nil, nil |
| 126 | 126 |
} |
| 127 | 127 |
|
| ... | ... |
@@ -2,6 +2,7 @@ package daemon |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 | 4 |
"io" |
| 5 |
+ "runtime" |
|
| 5 | 6 |
|
| 6 | 7 |
"github.com/Sirupsen/logrus" |
| 7 | 8 |
"github.com/docker/distribution/reference" |
| ... | ... |
@@ -39,7 +40,7 @@ func (rl *releaseableLayer) Mount() (string, error) {
|
| 39 | 39 |
return rl.rwLayer.Mount("")
|
| 40 | 40 |
} |
| 41 | 41 |
|
| 42 |
-func (rl *releaseableLayer) Commit() (builder.ReleaseableLayer, error) {
|
|
| 42 |
+func (rl *releaseableLayer) Commit(platform string) (builder.ReleaseableLayer, error) {
|
|
| 43 | 43 |
var chainID layer.ChainID |
| 44 | 44 |
if rl.roLayer != nil {
|
| 45 | 45 |
chainID = rl.roLayer.ChainID() |
| ... | ... |
@@ -50,7 +51,7 @@ func (rl *releaseableLayer) Commit() (builder.ReleaseableLayer, error) {
|
| 50 | 50 |
return nil, err |
| 51 | 51 |
} |
| 52 | 52 |
|
| 53 |
- newLayer, err := rl.layerStore.Register(stream, chainID) |
|
| 53 |
+ newLayer, err := rl.layerStore.Register(stream, chainID, layer.Platform(platform)) |
|
| 54 | 54 |
if err != nil {
|
| 55 | 55 |
return nil, err |
| 56 | 56 |
} |
| ... | ... |
@@ -139,7 +140,7 @@ func (daemon *Daemon) pullForBuilder(ctx context.Context, name string, authConfi |
| 139 | 139 |
// leaking of layers. |
| 140 | 140 |
func (daemon *Daemon) GetImageAndReleasableLayer(ctx context.Context, refOrID string, opts backend.GetImageAndLayerOptions) (builder.Image, builder.ReleaseableLayer, error) {
|
| 141 | 141 |
if refOrID == "" {
|
| 142 |
- layer, err := newReleasableLayerForImage(nil, daemon.layerStore) |
|
| 142 |
+ layer, err := newReleasableLayerForImage(nil, daemon.stores[opts.Platform].layerStore) |
|
| 143 | 143 |
return nil, layer, err |
| 144 | 144 |
} |
| 145 | 145 |
|
| ... | ... |
@@ -163,19 +164,22 @@ func (daemon *Daemon) GetImageAndReleasableLayer(ctx context.Context, refOrID st |
| 163 | 163 |
// CreateImage creates a new image by adding a config and ID to the image store. |
| 164 | 164 |
// This is similar to LoadImage() except that it receives JSON encoded bytes of |
| 165 | 165 |
// an image instead of a tar archive. |
| 166 |
-func (daemon *Daemon) CreateImage(config []byte, parent string) (builder.Image, error) {
|
|
| 167 |
- id, err := daemon.imageStore.Create(config) |
|
| 166 |
+func (daemon *Daemon) CreateImage(config []byte, parent string, platform string) (builder.Image, error) {
|
|
| 167 |
+ if platform == "" {
|
|
| 168 |
+ platform = runtime.GOOS |
|
| 169 |
+ } |
|
| 170 |
+ id, err := daemon.stores[platform].imageStore.Create(config) |
|
| 168 | 171 |
if err != nil {
|
| 169 | 172 |
return nil, errors.Wrapf(err, "failed to create image") |
| 170 | 173 |
} |
| 171 | 174 |
|
| 172 | 175 |
if parent != "" {
|
| 173 |
- if err := daemon.imageStore.SetParent(id, image.ID(parent)); err != nil {
|
|
| 176 |
+ if err := daemon.stores[platform].imageStore.SetParent(id, image.ID(parent)); err != nil {
|
|
| 174 | 177 |
return nil, errors.Wrapf(err, "failed to set parent %s", parent) |
| 175 | 178 |
} |
| 176 | 179 |
} |
| 177 | 180 |
|
| 178 |
- return daemon.imageStore.Get(id) |
|
| 181 |
+ return daemon.stores[platform].imageStore.Get(id) |
|
| 179 | 182 |
} |
| 180 | 183 |
|
| 181 | 184 |
// IDMappings returns uid/gid mappings for the builder |
| ... | ... |
@@ -170,7 +170,7 @@ func (daemon *Daemon) Commit(name string, c *backend.ContainerCommitConfig) (str |
| 170 | 170 |
} |
| 171 | 171 |
} |
| 172 | 172 |
|
| 173 |
- l, err := daemon.stores[container.Platform].layerStore.Register(rwTar, rootFS.ChainID(), layer.Platform(container.Platform)) |
|
| 173 |
+ l, err := daemon.stores[container.Platform].layerStore.Register(rwTar, parent.RootFS.ChainID(), layer.Platform(container.Platform)) |
|
| 174 | 174 |
if err != nil {
|
| 175 | 175 |
return "", err |
| 176 | 176 |
} |