dockerfile: fix quoting of meta args
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>docker-18.09
parent
277037a77f
commit
4963ed7ea4
|
@ -81,12 +81,15 @@ func Dockerfile2LLB(ctx context.Context, dt []byte, opt ConvertOpt) (*llb.State,
|
|||
return nil, nil, err
|
||||
}
|
||||
|
||||
shlex := shell.NewLex(dockerfile.EscapeToken)
|
||||
|
||||
for _, metaArg := range metaArgs {
|
||||
if metaArg.Value != nil {
|
||||
*metaArg.Value, _ = shlex.ProcessWordWithMap(*metaArg.Value, metaArgsToMap(optMetaArgs))
|
||||
}
|
||||
optMetaArgs = append(optMetaArgs, setKVValue(metaArg.KeyValuePairOptional, opt.BuildArgs))
|
||||
}
|
||||
|
||||
shlex := shell.NewLex(dockerfile.EscapeToken)
|
||||
|
||||
metaResolver := opt.MetaResolver
|
||||
if metaResolver == nil {
|
||||
metaResolver = imagemetaresolver.Default()
|
||||
|
|
|
@ -74,11 +74,52 @@ func TestIntegration(t *testing.T) {
|
|||
testPlatformArgsImplicit,
|
||||
testPlatformArgsExplicit,
|
||||
testExportMultiPlatform,
|
||||
testQuotedMetaArgs,
|
||||
})
|
||||
}
|
||||
|
||||
func newContainerd(cdAddress string) (*containerd.Client, error) {
|
||||
return containerd.New(cdAddress, containerd.WithTimeout(60*time.Second))
|
||||
func testQuotedMetaArgs(t *testing.T, sb integration.Sandbox) {
|
||||
t.Parallel()
|
||||
|
||||
dockerfile := []byte(`
|
||||
ARG a1="box"
|
||||
ARG a2="$a1-foo"
|
||||
FROM busy$a1 AS build
|
||||
ARG a2
|
||||
ARG a3="bar-$a2"
|
||||
RUN echo -n $a3 > /out
|
||||
FROM scratch
|
||||
COPY --from=build /out .
|
||||
`)
|
||||
|
||||
dir, err := tmpdir(
|
||||
fstest.CreateFile("Dockerfile", dockerfile, 0600),
|
||||
)
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(dir)
|
||||
|
||||
c, err := client.New(context.TODO(), sb.Address())
|
||||
require.NoError(t, err)
|
||||
defer c.Close()
|
||||
|
||||
destDir, err := ioutil.TempDir("", "buildkit")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(destDir)
|
||||
|
||||
_, err = c.Solve(context.TODO(), nil, client.SolveOpt{
|
||||
Frontend: "dockerfile.v0",
|
||||
LocalDirs: map[string]string{
|
||||
builder.LocalNameDockerfile: dir,
|
||||
builder.LocalNameContext: dir,
|
||||
},
|
||||
Exporter: client.ExporterLocal,
|
||||
ExporterOutputDir: destDir,
|
||||
}, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
dt, err := ioutil.ReadFile(filepath.Join(destDir, "out"))
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "bar-box-foo", string(dt))
|
||||
}
|
||||
|
||||
func testExportMultiPlatform(t *testing.T, sb integration.Sandbox) {
|
||||
|
@ -2666,3 +2707,7 @@ func checkAllRemoved(t *testing.T, c *client.Client, sb integration.Sandbox) {
|
|||
break
|
||||
}
|
||||
}
|
||||
|
||||
func newContainerd(cdAddress string) (*containerd.Client, error) {
|
||||
return containerd.New(cdAddress, containerd.WithTimeout(60*time.Second))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue