Per design/runtime.md §13.2: prefer BuildKit if available, fall back to classic. Today runtime/docker/build.go calls ImageBuild without setting Version, so we get whatever the daemon defaults to.
Plan
- Probe
Info.BuilderVersion (or check for buildkit capabilities) at docker.New()
- Cache result on
*Runtime
- In
BuildImage, set opts.Version = build.BuilderBuildKit when supported
- Fall back to classic with a warning if a buildkit-only construct (e.g.
# syntax=...) appears in the user's Dockerfile but the daemon has no buildkit
Why now
Our generated feature dockerfile starts with # syntax=docker/dockerfile:1.4. Classic ignores this as a comment so today's flow works, but cache mounts and other syntax-1.4 features won't apply unless buildkit is on.
Per design/runtime.md §13.2: prefer BuildKit if available, fall back to classic. Today
runtime/docker/build.gocallsImageBuildwithout settingVersion, so we get whatever the daemon defaults to.Plan
Info.BuilderVersion(or check forbuildkitcapabilities) atdocker.New()*RuntimeBuildImage, setopts.Version = build.BuilderBuildKitwhen supported# syntax=...) appears in the user's Dockerfile but the daemon has no buildkitWhy now
Our generated feature dockerfile starts with
# syntax=docker/dockerfile:1.4. Classic ignores this as a comment so today's flow works, but cache mounts and other syntax-1.4 features won't apply unless buildkit is on.