Skip to content

Commit 6a0cd7c

Browse files
authored
Merge pull request #4387 from TBBle/include-OS-version-and-features-in-platforms
Include OS version and features in OCI platforms
2 parents 257622c + 98e0d8d commit 6a0cd7c

File tree

14 files changed

+98
-39
lines changed

14 files changed

+98
-39
lines changed

client/llb/marshal.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,18 @@ func MarshalConstraints(base, override *Constraints) (*pb.Op, *pb.OpMetadata) {
9595
c.Platform = &defaultPlatform
9696
}
9797

98+
opPlatform := pb.Platform{
99+
OS: c.Platform.OS,
100+
Architecture: c.Platform.Architecture,
101+
Variant: c.Platform.Variant,
102+
OSVersion: c.Platform.OSVersion,
103+
}
104+
if c.Platform.OSFeatures != nil {
105+
opPlatform.OSFeatures = append([]string{}, c.Platform.OSFeatures...)
106+
}
107+
98108
return &pb.Op{
99-
Platform: &pb.Platform{
100-
OS: c.Platform.OS,
101-
Architecture: c.Platform.Architecture,
102-
Variant: c.Platform.Variant,
103-
OSVersion: c.Platform.OSVersion,
104-
OSFeatures: c.Platform.OSFeatures,
105-
},
109+
Platform: &opPlatform,
106110
Constraints: &pb.WorkerConstraints{
107111
Filter: c.WorkerConstraints,
108112
},

client/llb/state.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,16 @@ func (s State) WithImageConfig(c []byte) (State, error) {
258258
}
259259
s = s.Dir(img.Config.WorkingDir)
260260
if img.Architecture != "" && img.OS != "" {
261-
s = s.Platform(ocispecs.Platform{
261+
plat := ocispecs.Platform{
262262
OS: img.OS,
263263
Architecture: img.Architecture,
264264
Variant: img.Variant,
265-
})
265+
OSVersion: img.OSVersion,
266+
}
267+
if img.OSFeatures != nil {
268+
plat.OSFeatures = append([]string{}, img.OSFeatures...)
269+
}
270+
s = s.Platform(plat)
266271
}
267272
return s, nil
268273
}

exporter/containerimage/writer.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,8 @@ func defaultImageConfig() ([]byte, error) {
598598
img := ocispecs.Image{}
599599
img.Architecture = pl.Architecture
600600
img.OS = pl.OS
601+
img.OSVersion = pl.OSVersion
602+
img.OSFeatures = pl.OSFeatures
601603
img.Variant = pl.Variant
602604
img.RootFS.Type = "layers"
603605
img.Config.WorkingDir = "/"

frontend/dockerfile/dockerfile2llb/convert.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,10 @@ func toDispatchState(ctx context.Context, dt []byte, opt ConvertOpt) (*dispatchS
274274
OS: img.OS,
275275
Architecture: img.Architecture,
276276
Variant: img.Variant,
277+
OSVersion: img.OSVersion,
278+
}
279+
if img.OSFeatures != nil {
280+
ds.platform.OSFeatures = append([]string{}, img.OSFeatures...)
277281
}
278282
}
279283
}
@@ -595,6 +599,10 @@ func toDispatchState(ctx context.Context, dt []byte, opt ConvertOpt) (*dispatchS
595599
target.image.OS = platformOpt.targetPlatform.OS
596600
target.image.Architecture = platformOpt.targetPlatform.Architecture
597601
target.image.Variant = platformOpt.targetPlatform.Variant
602+
target.image.OSVersion = platformOpt.targetPlatform.OSVersion
603+
if platformOpt.targetPlatform.OSFeatures != nil {
604+
target.image.OSFeatures = append([]string{}, platformOpt.targetPlatform.OSFeatures...)
605+
}
598606
}
599607

600608
return target, nil

frontend/dockerfile/dockerfile2llb/image.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ func emptyImage(platform ocispecs.Platform) image.Image {
1919
img := image.Image{}
2020
img.Architecture = platform.Architecture
2121
img.OS = platform.OS
22+
img.OSVersion = platform.OSVersion
23+
if platform.OSFeatures != nil {
24+
img.OSFeatures = append([]string{}, platform.OSFeatures...)
25+
}
2226
img.Variant = platform.Variant
2327
img.RootFS.Type = "layers"
2428
img.Config.WorkingDir = "/"

frontend/dockerui/build.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (bc *Client) Build(ctx context.Context, fn BuildFunc) (*ResultBuilder, erro
5757
p.OSVersion = img.OSVersion
5858
}
5959
if p.OSFeatures == nil && len(img.OSFeatures) > 0 {
60-
p.OSFeatures = img.OSFeatures
60+
p.OSFeatures = append([]string{}, img.OSFeatures...)
6161
}
6262
}
6363

solver/llbsolver/ops/exec.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ func (e *ExecOp) CacheMap(ctx context.Context, g session.Group, index int) (*sol
113113
OS: e.platform.OS,
114114
Architecture: e.platform.Architecture,
115115
Variant: e.platform.Variant,
116+
OSVersion: e.platform.OSVersion,
117+
OSFeatures: e.platform.OSFeatures,
116118
}
117119
}
118120

@@ -133,17 +135,21 @@ func (e *ExecOp) CacheMap(ctx context.Context, g session.Group, index int) (*sol
133135
}
134136

135137
dt, err := json.Marshal(struct {
136-
Type string
137-
Exec *pb.ExecOp
138-
OS string
139-
Arch string
140-
Variant string `json:",omitempty"`
138+
Type string
139+
Exec *pb.ExecOp
140+
OS string
141+
Arch string
142+
Variant string `json:",omitempty"`
143+
OSVersion string `json:",omitempty"`
144+
OSFeatures []string `json:",omitempty"`
141145
}{
142-
Type: execCacheType,
143-
Exec: &op,
144-
OS: p.OS,
145-
Arch: p.Architecture,
146-
Variant: p.Variant,
146+
Type: execCacheType,
147+
Exec: &op,
148+
OS: p.OS,
149+
Arch: p.Architecture,
150+
Variant: p.Variant,
151+
OSVersion: p.OSVersion,
152+
OSFeatures: p.OSFeatures,
147153
})
148154
if err != nil {
149155
return nil, false, err

solver/llbsolver/ops/exec_binfmt.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ func getEmulator(ctx context.Context, p *pb.Platform, idmap *idtools.IdentityMap
9090
pp := platforms.Normalize(ocispecs.Platform{
9191
Architecture: p.Architecture,
9292
OS: p.OS,
93+
OSVersion: p.OSVersion,
94+
OSFeatures: p.OSFeatures,
9395
Variant: p.Variant,
9496
})
9597

solver/llbsolver/provenance/capture.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,9 @@ func (c *Capture) AddImage(i ImageSource) {
152152
return
153153
}
154154
if v.Platform != nil && i.Platform != nil {
155-
if v.Platform.Architecture == i.Platform.Architecture && v.Platform.OS == i.Platform.OS && v.Platform.Variant == i.Platform.Variant {
155+
// NOTE: Deliberately excluding OSFeatures, as there's no extant (or rational) case where a source image is an index and contains images distinguished only by OSFeature
156+
// See https://github.com/moby/buildkit/pull/4387#discussion_r1376234241 and https://github.com/opencontainers/image-spec/issues/1147
157+
if v.Platform.Architecture == i.Platform.Architecture && v.Platform.OS == i.Platform.OS && v.Platform.OSVersion == i.Platform.OSVersion && v.Platform.Variant == i.Platform.Variant {
156158
return
157159
}
158160
}

solver/llbsolver/vertex.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,17 +79,29 @@ func NormalizeRuntimePlatforms() LoadOpt {
7979
OS: p.OS,
8080
Architecture: p.Architecture,
8181
Variant: p.Variant,
82+
OSVersion: p.OSVersion,
83+
OSFeatures: p.OSFeatures,
8284
}
8385
}
8486
op.Platform = defaultPlatform
8587
}
86-
platform := ocispecs.Platform{OS: op.Platform.OS, Architecture: op.Platform.Architecture, Variant: op.Platform.Variant}
88+
platform := ocispecs.Platform{
89+
OS: op.Platform.OS,
90+
Architecture: op.Platform.Architecture,
91+
Variant: op.Platform.Variant,
92+
OSVersion: op.Platform.OSVersion,
93+
OSFeatures: op.Platform.OSFeatures,
94+
}
8795
normalizedPlatform := platforms.Normalize(platform)
8896

8997
op.Platform = &pb.Platform{
9098
OS: normalizedPlatform.OS,
9199
Architecture: normalizedPlatform.Architecture,
92100
Variant: normalizedPlatform.Variant,
101+
OSVersion: normalizedPlatform.OSVersion,
102+
}
103+
if normalizedPlatform.OSFeatures != nil {
104+
op.Platform.OSFeatures = append([]string{}, normalizedPlatform.OSFeatures...)
93105
}
94106

95107
return nil

0 commit comments

Comments
 (0)