Skip to content

Commit 609aa14

Browse files
authored
Merge pull request moby#5593 from tonistiigi/fix-onbuild-stage-propagation
dockerfile: fix onbuild propagation for child stages
2 parents d4992d5 + 8bf1d78 commit 609aa14

File tree

3 files changed

+94
-0
lines changed

3 files changed

+94
-0
lines changed

frontend/dockerfile/dockerfile2llb/convert.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,8 @@ func (ds *dispatchState) init() {
10661066
ds.state = ds.base.state
10671067
ds.platform = ds.base.platform
10681068
ds.image = clone(ds.base.image)
1069+
// onbuild triggers to not carry over from base stage
1070+
ds.image.Config.OnBuild = nil
10691071
ds.baseImg = cloneX(ds.base.baseImg)
10701072
// Utilize the same path index as our base image so we propagate
10711073
// the paths we use back to the base image.

frontend/dockerfile/dockerfile2llb/image.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ func clone(src dockerspec.DockerOCIImage) dockerspec.DockerOCIImage {
1212
img.Config.Env = append([]string{}, src.Config.Env...)
1313
img.Config.Cmd = append([]string{}, src.Config.Cmd...)
1414
img.Config.Entrypoint = append([]string{}, src.Config.Entrypoint...)
15+
img.Config.OnBuild = append([]string{}, src.Config.OnBuild...)
1516
return img
1617
}
1718

frontend/dockerfile/dockerfile_test.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ var allTests = integration.TestFuncs(
127127
testEnvEmptyFormatting,
128128
testCacheMultiPlatformImportExport,
129129
testOnBuildCleared,
130+
testOnBuildWithChildStage,
130131
testOnBuildInheritedStageRun,
131132
testOnBuildInheritedStageWithFrom,
132133
testOnBuildNewDeps,
@@ -5013,6 +5014,96 @@ ONBUILD RUN mkdir \out && echo 11>> \out\foo
50135014
require.Equal(t, integration.UnixOrWindows("11", "11\r\n"), string(dt))
50145015
}
50155016

5017+
// testOnBuildWithChildStage tests that ONBUILD rules from the parent image do
5018+
// not run again if another stage inherits from current stage.
5019+
// moby/buildkit#5578
5020+
func testOnBuildWithChildStage(t *testing.T, sb integration.Sandbox) {
5021+
integration.SkipOnPlatform(t, "windows")
5022+
workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush)
5023+
f := getFrontend(t, sb)
5024+
5025+
registry, err := sb.NewRegistry()
5026+
if errors.Is(err, integration.ErrRequirements) {
5027+
t.Skip(err.Error())
5028+
}
5029+
require.NoError(t, err)
5030+
5031+
dockerfile := []byte(`
5032+
FROM busybox
5033+
ONBUILD RUN mkdir -p /out && echo -n yes >> /out/didrun
5034+
`)
5035+
5036+
dir := integration.Tmpdir(
5037+
t,
5038+
fstest.CreateFile("Dockerfile", dockerfile, 0600),
5039+
)
5040+
5041+
c, err := client.New(sb.Context(), sb.Address())
5042+
require.NoError(t, err)
5043+
defer c.Close()
5044+
5045+
target := registry + "/buildkit/testonbuildstage:base"
5046+
5047+
_, err = f.Solve(sb.Context(), c, client.SolveOpt{
5048+
Exports: []client.ExportEntry{
5049+
{
5050+
Type: client.ExporterImage,
5051+
Attrs: map[string]string{
5052+
"push": "true",
5053+
"name": target,
5054+
},
5055+
},
5056+
},
5057+
LocalMounts: map[string]fsutil.FS{
5058+
dockerui.DefaultLocalNameDockerfile: dir,
5059+
dockerui.DefaultLocalNameContext: dir,
5060+
},
5061+
}, nil)
5062+
require.NoError(t, err)
5063+
5064+
dockerfile = []byte(fmt.Sprintf(`
5065+
FROM %s AS base
5066+
RUN [ -f /out/didrun ] && touch /step1
5067+
RUN rm /out/didrun
5068+
RUN [ ! -f /out/didrun ] && touch /step2
5069+
5070+
FROM base AS child
5071+
RUN [ ! -f /out/didrun ] && touch /step3
5072+
5073+
FROM scratch
5074+
COPY --from=child /step* /
5075+
`, target))
5076+
5077+
dir = integration.Tmpdir(
5078+
t,
5079+
fstest.CreateFile("Dockerfile", dockerfile, 0600),
5080+
)
5081+
destDir := t.TempDir()
5082+
5083+
_, err = f.Solve(sb.Context(), c, client.SolveOpt{
5084+
Exports: []client.ExportEntry{
5085+
{
5086+
Type: client.ExporterLocal,
5087+
OutputDir: destDir,
5088+
},
5089+
},
5090+
LocalMounts: map[string]fsutil.FS{
5091+
dockerui.DefaultLocalNameDockerfile: dir,
5092+
dockerui.DefaultLocalNameContext: dir,
5093+
},
5094+
}, nil)
5095+
require.NoError(t, err)
5096+
5097+
_, err = os.Stat(filepath.Join(destDir, "step1"))
5098+
require.NoError(t, err)
5099+
5100+
_, err = os.Stat(filepath.Join(destDir, "step2"))
5101+
require.NoError(t, err)
5102+
5103+
_, err = os.Stat(filepath.Join(destDir, "step3"))
5104+
require.NoError(t, err)
5105+
}
5106+
50165107
func testOnBuildNamedContext(t *testing.T, sb integration.Sandbox) {
50175108
integration.SkipOnPlatform(t, "windows")
50185109
workers.CheckFeatureCompat(t, sb, workers.FeatureOCIExporter, workers.FeatureOCILayout)

0 commit comments

Comments
 (0)