dockerfile: regression test for existing dest dir perms
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>docker-19.03
parent
369f7482de
commit
c4ef668f62
|
@ -85,6 +85,7 @@ var allTests = []integration.Test{
|
|||
testEmptyWildcard,
|
||||
testWorkdirCreatesDir,
|
||||
testDockerfileAddArchiveWildcard,
|
||||
testCopyChownExistingDir,
|
||||
}
|
||||
|
||||
var opts []integration.TestOpt
|
||||
|
@ -222,6 +223,100 @@ ENV foo bar
|
|||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func testCopyChownExistingDir(t *testing.T, sb integration.Sandbox) {
|
||||
f := getFrontend(t, sb)
|
||||
|
||||
dockerfile := []byte(`
|
||||
# Set up files and directories with known ownership
|
||||
FROM busybox AS source
|
||||
RUN touch /file && chown 100:200 /file \
|
||||
&& mkdir -p /dir/subdir \
|
||||
&& touch /dir/subdir/nestedfile \
|
||||
&& chown 100:200 /dir \
|
||||
&& chown 101:201 /dir/subdir \
|
||||
&& chown 102:202 /dir/subdir/nestedfile
|
||||
|
||||
FROM busybox AS test_base
|
||||
RUN mkdir -p /existingdir/existingsubdir \
|
||||
&& touch /existingdir/existingfile \
|
||||
&& chown 500:600 /existingdir \
|
||||
&& chown 501:601 /existingdir/existingsubdir \
|
||||
&& chown 501:601 /existingdir/existingfile
|
||||
|
||||
|
||||
# Copy files from the source stage
|
||||
FROM test_base AS copy_from
|
||||
COPY --from=source /file .
|
||||
# Copy to a non-existing target directory creates the target directory (as root), then copies the _contents_ of the source directory into it
|
||||
COPY --from=source /dir /dir
|
||||
# Copying to an existing target directory will copy the _contents_ of the source directory into it
|
||||
COPY --from=source /dir/. /existingdir
|
||||
|
||||
RUN e="100:200"; p="/file" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="0:0"; p="/dir" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="101:201"; p="/dir/subdir" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="102:202"; p="/dir/subdir/nestedfile" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
# Existing files and directories ownership should not be modified
|
||||
&& e="500:600"; p="/existingdir" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="501:601"; p="/existingdir/existingsubdir" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="501:601"; p="/existingdir/existingfile" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
# But new files and directories should maintain their ownership
|
||||
&& e="101:201"; p="/existingdir/subdir" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="102:202"; p="/existingdir/subdir/nestedfile"; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi
|
||||
|
||||
|
||||
# Copy files from the source stage and chown them.
|
||||
FROM test_base AS copy_from_chowned
|
||||
COPY --from=source --chown=300:400 /file .
|
||||
# Copy to a non-existing target directory creates the target directory (as root), then copies the _contents_ of the source directory into it
|
||||
COPY --from=source --chown=300:400 /dir /dir
|
||||
# Copying to an existing target directory copies the _contents_ of the source directory into it
|
||||
COPY --from=source --chown=300:400 /dir/. /existingdir
|
||||
|
||||
RUN e="300:400"; p="/file" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="300:400"; p="/dir" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="300:400"; p="/dir/subdir" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="300:400"; p="/dir/subdir/nestedfile" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
# Existing files and directories ownership should not be modified
|
||||
&& e="500:600"; p="/existingdir" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="501:601"; p="/existingdir/existingsubdir" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="501:601"; p="/existingdir/existingfile" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
# But new files and directories should be chowned
|
||||
&& e="300:400"; p="/existingdir/subdir" ; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi \
|
||||
&& e="300:400"; p="/existingdir/subdir/nestedfile"; a=` + "`" + `stat -c "%u:%g" "$p"` + "`" + `; if [ "$a" != "$e" ]; then echo "incorrect ownership on $p. expected $e, got $a"; exit 1; fi
|
||||
`)
|
||||
|
||||
dir, err := tmpdir(
|
||||
fstest.CreateFile("Dockerfile.web", dockerfile, 0600),
|
||||
fstest.Symlink("Dockerfile.web", "Dockerfile"),
|
||||
)
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(dir)
|
||||
|
||||
c, err := client.New(context.TODO(), sb.Address())
|
||||
require.NoError(t, err)
|
||||
defer c.Close()
|
||||
|
||||
_, err = f.Solve(context.TODO(), c, client.SolveOpt{
|
||||
LocalDirs: map[string]string{
|
||||
builder.DefaultLocalNameDockerfile: dir,
|
||||
builder.DefaultLocalNameContext: dir,
|
||||
},
|
||||
}, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = f.Solve(context.TODO(), c, client.SolveOpt{
|
||||
FrontendAttrs: map[string]string{
|
||||
"target": "copy_from",
|
||||
},
|
||||
LocalDirs: map[string]string{
|
||||
builder.DefaultLocalNameDockerfile: dir,
|
||||
builder.DefaultLocalNameContext: dir,
|
||||
},
|
||||
}, nil)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func testEmptyWildcard(t *testing.T, sb integration.Sandbox) {
|
||||
f := getFrontend(t, sb)
|
||||
|
||||
|
|
Loading…
Reference in New Issue