Merge pull request #277 from tonistiigi/copy-fix

dockerfile: fix issues with duplicate copy instructions
docker-18.09
Akihiro Suda 2018-02-09 11:18:35 +09:00 committed by GitHub
commit da21a0d1ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 1 deletions

View File

@ -378,7 +378,7 @@ func dispatchWorkdir(d *dispatchState, c *instructions.WorkdirCommand, commit bo
func dispatchCopy(d *dispatchState, c instructions.SourcesAndDest, sourceState llb.State, isAddCommand bool, cmdToPrint interface{}, chown string) error { func dispatchCopy(d *dispatchState, c instructions.SourcesAndDest, sourceState llb.State, isAddCommand bool, cmdToPrint interface{}, chown string) error {
// TODO: this should use CopyOp instead. Current implementation is inefficient // TODO: this should use CopyOp instead. Current implementation is inefficient
img := llb.Image("tonistiigi/copy@sha256:9e6b90a83acc95831c81a0c9c6e45e27b439c19e7974f34f258971e454c8b793") img := llb.Image("tonistiigi/copy@sha256:476e0a67a1e4650c6adaf213269a2913deb7c52cbc77f954026f769d51e1a14e")
dest := path.Join("/dest", pathRelativeToWorkingDir(d.state, c.Dest())) dest := path.Join("/dest", pathRelativeToWorkingDir(d.state, c.Dest()))
if c.Dest() == "." || c.Dest()[len(c.Dest())-1] == filepath.Separator { if c.Dest() == "." || c.Dest()[len(c.Dest())-1] == filepath.Separator {

View File

@ -47,6 +47,7 @@ func TestIntegration(t *testing.T) {
testDockerfileFromGit, testDockerfileFromGit,
testCopyChown, testCopyChown,
testCopyWildcards, testCopyWildcards,
testCopyOverrideFiles,
}) })
} }
@ -804,6 +805,60 @@ COPY --from=base /out /
require.Equal(t, string(dt), "1000 nogroup\n") require.Equal(t, string(dt), "1000 nogroup\n")
} }
func testCopyOverrideFiles(t *testing.T, sb integration.Sandbox) {
t.Parallel()
dockerfile := []byte(`
FROM scratch AS base
COPY sub sub
COPY sub sub
COPY files/foo.go dest/foo.go
COPY files/foo.go dest/foo.go
COPY files dest
`)
dir, err := tmpdir(
fstest.CreateFile("Dockerfile", dockerfile, 0600),
fstest.CreateDir("sub", 0700),
fstest.CreateDir("sub/dir1", 0700),
fstest.CreateDir("sub/dir1/dir2", 0700),
fstest.CreateFile("sub/dir1/dir2/foo", []byte(`foo-contents`), 0600),
fstest.CreateDir("files", 0700),
fstest.CreateFile("files/foo.go", []byte(`foo.go-contents`), 0600),
)
require.NoError(t, err)
defer os.RemoveAll(dir)
c, err := client.New(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",
Exporter: client.ExporterLocal,
ExporterAttrs: map[string]string{
"output": destDir,
},
LocalDirs: map[string]string{
builder.LocalNameDockerfile: dir,
builder.LocalNameContext: dir,
},
}, nil)
require.NoError(t, err)
dt, err := ioutil.ReadFile(filepath.Join(destDir, "sub/dir1/dir2/foo"))
require.NoError(t, err)
require.Equal(t, string(dt), "foo-contents")
dt, err = ioutil.ReadFile(filepath.Join(destDir, "dest/foo.go"))
require.NoError(t, err)
require.Equal(t, string(dt), "foo.go-contents")
}
func testCopyWildcards(t *testing.T, sb integration.Sandbox) { func testCopyWildcards(t *testing.T, sb integration.Sandbox) {
t.Parallel() t.Parallel()