buildah/tests/copy.bats

497 lines
18 KiB
Bash

#!/usr/bin/env bats
load helpers
@test "copy-flags-order-verification" {
run_buildah 125 copy container1 -q /tmp/container1
check_options_flag_err "-q"
run_buildah 125 copy container1 --chown /tmp/container1 --quiet
check_options_flag_err "--chown"
run_buildah 125 copy container1 /tmp/container1 --quiet
check_options_flag_err "--quiet"
}
@test "copy-local-multiple" {
createrandom ${TEST_SCRATCH_DIR}/randomfile
createrandom ${TEST_SCRATCH_DIR}/other-randomfile
createrandom ${TEST_SCRATCH_DIR}/third-randomfile
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah mount $cid
root=$output
run_buildah config --workingdir / $cid
# copy ${TEST_SCRATCH_DIR}/randomfile to a file of the same name in the container's working directory
run_buildah copy --retry 4 --retry-delay 4s $cid ${TEST_SCRATCH_DIR}/randomfile
# copy ${TEST_SCRATCH_DIR}/other-randomfile and ${TEST_SCRATCH_DIR}/third-randomfile to a new directory named ${TEST_SCRATCH_DIR}/randomfile in the container
run_buildah copy $cid ${TEST_SCRATCH_DIR}/other-randomfile ${TEST_SCRATCH_DIR}/third-randomfile ${TEST_SCRATCH_DIR}/randomfile
# try to copy ${TEST_SCRATCH_DIR}/other-randomfile and ${TEST_SCRATCH_DIR}/third-randomfile to a /randomfile, which already exists and is a file
run_buildah 125 copy $cid ${TEST_SCRATCH_DIR}/other-randomfile ${TEST_SCRATCH_DIR}/third-randomfile /randomfile
# copy ${TEST_SCRATCH_DIR}/other-randomfile and ${TEST_SCRATCH_DIR}/third-randomfile to previously-created directory named ${TEST_SCRATCH_DIR}/randomfile in the container
run_buildah copy $cid ${TEST_SCRATCH_DIR}/other-randomfile ${TEST_SCRATCH_DIR}/third-randomfile ${TEST_SCRATCH_DIR}/randomfile
run_buildah rm $cid
_prefetch alpine
run_buildah from --quiet --pull=false $WITH_POLICY_JSON alpine
cid=$output
run_buildah mount $cid
root=$output
run_buildah config --workingdir / $cid
run_buildah copy $cid ${TEST_SCRATCH_DIR}/randomfile
run_buildah copy $cid ${TEST_SCRATCH_DIR}/other-randomfile ${TEST_SCRATCH_DIR}/third-randomfile ${TEST_SCRATCH_DIR}/randomfile /etc
run_buildah rm $cid
run_buildah from --quiet --pull=false $WITH_POLICY_JSON alpine
cid=$output
run_buildah mount $cid
root=$output
run_buildah config --workingdir / $cid
run_buildah copy $cid "${TEST_SCRATCH_DIR}/*randomfile" /etc
(cd ${TEST_SCRATCH_DIR}; for i in *randomfile; do cmp $i ${root}/etc/$i; done)
}
@test "copy-local-plain" {
createrandom ${TEST_SCRATCH_DIR}/randomfile
createrandom ${TEST_SCRATCH_DIR}/other-randomfile
createrandom ${TEST_SCRATCH_DIR}/third-randomfile
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah mount $cid
root=$output
run_buildah config --workingdir / $cid
run_buildah copy $cid ${TEST_SCRATCH_DIR}/randomfile
run_buildah copy $cid ${TEST_SCRATCH_DIR}/other-randomfile
run_buildah unmount $cid
run_buildah commit $WITH_POLICY_JSON $cid containers-storage:new-image
run_buildah rm $cid
run_buildah from --quiet $WITH_POLICY_JSON new-image
newcid=$output
run_buildah mount $newcid
newroot=$output
test -s $newroot/randomfile
cmp ${TEST_SCRATCH_DIR}/randomfile $newroot/randomfile
test -s $newroot/other-randomfile
cmp ${TEST_SCRATCH_DIR}/other-randomfile $newroot/other-randomfile
}
@test "copy-local-subdirectory" {
mkdir -p ${TEST_SCRATCH_DIR}/subdir
createrandom ${TEST_SCRATCH_DIR}/subdir/randomfile
createrandom ${TEST_SCRATCH_DIR}/subdir/other-randomfile
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config --workingdir /container-subdir $cid
run_buildah copy $cid ${TEST_SCRATCH_DIR}/subdir
run_buildah mount $cid
root=$output
test -s $root/container-subdir/randomfile
cmp ${TEST_SCRATCH_DIR}/subdir/randomfile $root/container-subdir/randomfile
test -s $root/container-subdir/other-randomfile
cmp ${TEST_SCRATCH_DIR}/subdir/other-randomfile $root/container-subdir/other-randomfile
run_buildah copy $cid ${TEST_SCRATCH_DIR}/subdir /other-subdir
test -s $root/other-subdir/randomfile
cmp ${TEST_SCRATCH_DIR}/subdir/randomfile $root/other-subdir/randomfile
test -s $root/other-subdir/other-randomfile
cmp ${TEST_SCRATCH_DIR}/subdir/other-randomfile $root/other-subdir/other-randomfile
}
@test "copy-local-force-directory" {
createrandom ${TEST_SCRATCH_DIR}/randomfile
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config --workingdir / $cid
run_buildah copy $cid ${TEST_SCRATCH_DIR}/randomfile /randomfile
run_buildah mount $cid
root=$output
test -s $root/randomfile
cmp ${TEST_SCRATCH_DIR}/randomfile $root/randomfile
run_buildah rm $cid
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config --workingdir / $cid
run_buildah copy $cid ${TEST_SCRATCH_DIR}/randomfile /randomsubdir/
run_buildah mount $cid
root=$output
test -s $root/randomsubdir/randomfile
cmp ${TEST_SCRATCH_DIR}/randomfile $root/randomsubdir/randomfile
}
@test "copy-url-mtime" {
# Create a file with random content and a non-now timestamp (so we can
# can trust that buildah correctly set mtime on copy)
createrandom ${TEST_SCRATCH_DIR}/randomfile
touch -t 201910310123.45 ${TEST_SCRATCH_DIR}/randomfile
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah config --workingdir / $cid
starthttpd ${TEST_SCRATCH_DIR}
run_buildah copy $cid http://0.0.0.0:${HTTP_SERVER_PORT}/randomfile /urlfile
stophttpd
run_buildah mount $cid
root=$output
test -s $root/urlfile
cmp ${TEST_SCRATCH_DIR}/randomfile $root/urlfile
# Compare timestamps. Display them in human-readable form, so if there's
# a mismatch it will be shown in the test log.
mtime_randomfile=$(stat --format %y ${TEST_SCRATCH_DIR}/randomfile)
mtime_urlfile=$(stat --format %y $root/urlfile)
expect_output --from="$mtime_randomfile" "$mtime_urlfile" "mtime[randomfile] == mtime[urlfile]"
}
@test "copy --chown" {
mkdir -p ${TEST_SCRATCH_DIR}/subdir
mkdir -p ${TEST_SCRATCH_DIR}/other-subdir
createrandom ${TEST_SCRATCH_DIR}/subdir/randomfile
createrandom ${TEST_SCRATCH_DIR}/subdir/other-randomfile
createrandom ${TEST_SCRATCH_DIR}/randomfile
createrandom ${TEST_SCRATCH_DIR}/other-subdir/randomfile
createrandom ${TEST_SCRATCH_DIR}/other-subdir/other-randomfile
_prefetch alpine
run_buildah from --quiet $WITH_POLICY_JSON alpine
cid=$output
run_buildah config --workingdir / $cid
run_buildah copy --chown 1:1 $cid ${TEST_SCRATCH_DIR}/randomfile
run_buildah copy --chown root:1 $cid ${TEST_SCRATCH_DIR}/randomfile /randomfile2
run_buildah copy --chown nobody $cid ${TEST_SCRATCH_DIR}/randomfile /randomfile3
run_buildah copy --chown nobody:root $cid ${TEST_SCRATCH_DIR}/subdir /subdir
run_buildah run $cid stat -c "%u:%g" /randomfile
expect_output "1:1" "stat ug /randomfile"
run_buildah run $cid stat -c "%U:%g" /randomfile2
expect_output "root:1" "stat Ug /randomfile2"
run_buildah run $cid stat -c "%U" /randomfile3
expect_output "nobody" "stat U /randomfile3"
for i in randomfile other-randomfile ; do
run_buildah run $cid stat -c "%U:%G" /subdir/$i
expect_output "nobody:root" "stat UG /subdir/$i"
done
# subdir will have been implicitly created, and the --chown should have had an effect
run_buildah run $cid stat -c "%U:%G" /subdir
expect_output "nobody:root" "stat UG /subdir"
run_buildah copy --chown root:root $cid ${TEST_SCRATCH_DIR}/other-subdir /subdir
for i in randomfile other-randomfile ; do
run_buildah run $cid stat -c "%U:%G" /subdir/$i
expect_output "root:root" "stat UG /subdir/$i (after chown)"
done
# subdir itself will have not been copied (the destination directory was created implicitly), so its permissions should not have changed
run_buildah run $cid stat -c "%U:%G" /subdir
expect_output "nobody:root" "stat UG /subdir"
}
@test "copy --chmod" {
mkdir -p ${TEST_SCRATCH_DIR}/subdir
mkdir -p ${TEST_SCRATCH_DIR}/other-subdir
createrandom ${TEST_SCRATCH_DIR}/subdir/randomfile
createrandom ${TEST_SCRATCH_DIR}/subdir/other-randomfile
createrandom ${TEST_SCRATCH_DIR}/randomfile
createrandom ${TEST_SCRATCH_DIR}/other-subdir/randomfile
createrandom ${TEST_SCRATCH_DIR}/other-subdir/other-randomfile
_prefetch alpine
run_buildah from --quiet $WITH_POLICY_JSON alpine
cid=$output
run_buildah config --workingdir / $cid
run_buildah copy --chmod 777 $cid ${TEST_SCRATCH_DIR}/randomfile
run_buildah copy --chmod 700 $cid ${TEST_SCRATCH_DIR}/randomfile /randomfile2
run_buildah copy --chmod 755 $cid ${TEST_SCRATCH_DIR}/randomfile /randomfile3
run_buildah copy --chmod 660 $cid ${TEST_SCRATCH_DIR}/subdir /subdir
run_buildah run $cid ls -l /randomfile
expect_output --substring rwxrwxrwx
run_buildah run $cid ls -l /randomfile2
expect_output --substring rwx------
run_buildah run $cid ls -l /randomfile3
expect_output --substring rwxr-xr-x
for i in randomfile other-randomfile ; do
run_buildah run $cid ls -l /subdir/$i
expect_output --substring rw-rw----
done
run_buildah run $cid ls -l /subdir
expect_output --substring rw-rw----
run_buildah copy --chmod 600 $cid ${TEST_SCRATCH_DIR}/other-subdir /subdir
for i in randomfile other-randomfile ; do
run_buildah run $cid ls -l /subdir/$i
expect_output --substring rw-------
done
}
@test "copy-symlink" {
createrandom ${TEST_SCRATCH_DIR}/randomfile
ln -s ${TEST_SCRATCH_DIR}/randomfile ${TEST_SCRATCH_DIR}/link-randomfile
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah mount $cid
root=$output
run_buildah config --workingdir / $cid
run_buildah copy $cid ${TEST_SCRATCH_DIR}/link-randomfile
run_buildah unmount $cid
run_buildah commit $WITH_POLICY_JSON $cid containers-storage:new-image
run_buildah rm $cid
run_buildah from --quiet $WITH_POLICY_JSON new-image
newcid=$output
run_buildah mount $newcid
newroot=$output
test -s $newroot/link-randomfile
test -f $newroot/link-randomfile
cmp ${TEST_SCRATCH_DIR}/randomfile $newroot/link-randomfile
}
@test "ignore-socket" {
createrandom ${TEST_SCRATCH_DIR}/randomfile
# This seems to be the least-worst way to create a socket: run and kill nc
nc -lkU ${TEST_SCRATCH_DIR}/test.socket &
nc_pid=$!
# This should succeed fairly quickly. We test with a timeout in case of
# failure (likely reason: 'nc' not installed.)
retries=50
while ! test -e ${TEST_SCRATCH_DIR}/test.socket; do
sleep 0.1
retries=$((retries - 1))
if [[ $retries -eq 0 ]]; then
die "Timed out waiting for ${TEST_SCRATCH_DIR}/test.socket (is nc installed?)"
fi
done
kill $nc_pid
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah mount $cid
root=$output
run_buildah config --workingdir / $cid
run_buildah unmount $cid
run_buildah commit $WITH_POLICY_JSON $cid containers-storage:new-image
run_buildah rm $cid
run_buildah from --quiet $WITH_POLICY_JSON new-image
newcid=$output
run_buildah mount $newcid
newroot=$output
test \! -e $newroot/test.socket
}
@test "copy-symlink-archive-suffix" {
createrandom ${TEST_SCRATCH_DIR}/randomfile.tar.gz
ln -s ${TEST_SCRATCH_DIR}/randomfile.tar.gz ${TEST_SCRATCH_DIR}/link-randomfile.tar.gz
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah mount $cid
root=$output
run_buildah config --workingdir / $cid
run_buildah copy $cid ${TEST_SCRATCH_DIR}/link-randomfile.tar.gz
run_buildah unmount $cid
run_buildah commit $WITH_POLICY_JSON $cid containers-storage:new-image
run_buildah rm $cid
run_buildah from --quiet $WITH_POLICY_JSON new-image
newcid=$output
run_buildah mount $newcid
newroot=$output
test -s $newroot/link-randomfile.tar.gz
test -f $newroot/link-randomfile.tar.gz
cmp ${TEST_SCRATCH_DIR}/randomfile.tar.gz $newroot/link-randomfile.tar.gz
}
@test "copy-detect-missing-data" {
_prefetch busybox
: > ${TEST_SCRATCH_DIR}/Dockerfile
echo FROM busybox AS builder >> ${TEST_SCRATCH_DIR}/Dockerfile
echo FROM scratch >> ${TEST_SCRATCH_DIR}/Dockerfile
echo COPY --from=builder /bin/-no-such-file-error- /usr/bin >> ${TEST_SCRATCH_DIR}/Dockerfile
run_buildah 125 build-using-dockerfile $WITH_POLICY_JSON ${TEST_SCRATCH_DIR}
expect_output --substring "no such file or directory"
}
@test "copy --ignorefile" {
mytest=${TEST_SCRATCH_DIR}/mytest
mkdir -p ${mytest}
touch ${mytest}/mystuff
touch ${mytest}/source.go
mkdir -p ${mytest}/notmystuff
touch ${mytest}/notmystuff/notmystuff
cat > ${mytest}/.ignore << _EOF
*.go
.ignore
notmystuff
_EOF
expect="
stuff
stuff/mystuff"
run_buildah from $WITH_POLICY_JSON scratch
cid=$output
run_buildah 125 copy --ignorefile ${mytest}/.ignore $cid ${mytest} /stuff
expect_output -- "Error: --ignorefile option requires that you specify a context dir using --contextdir" "container file list"
run_buildah copy --contextdir=${mytest} --ignorefile ${mytest}/.ignore $cid ${mytest} /stuff
run_buildah mount $cid
mnt=$output
run find $mnt -printf "%P\n"
filelist=$(LC_ALL=C sort <<<"$output")
run_buildah umount $cid
expect_output --from="$filelist" "$expect" "container file list"
}
@test "copy-quiet" {
createrandom ${TEST_SCRATCH_DIR}/randomfile
_prefetch alpine
run_buildah from --quiet --pull=false $WITH_POLICY_JSON alpine
cid=$output
run_buildah mount $cid
root=$output
run_buildah copy --quiet $cid ${TEST_SCRATCH_DIR}/randomfile /
expect_output ""
cmp ${TEST_SCRATCH_DIR}/randomfile $root/randomfile
run_buildah umount $cid
run_buildah rm $cid
}
@test "copy-from-container" {
_prefetch busybox
createrandom ${TEST_SCRATCH_DIR}/randomfile
run_buildah from --quiet $WITH_POLICY_JSON busybox
from=$output
run_buildah from --quiet $WITH_POLICY_JSON busybox
cid=$output
run_buildah copy --quiet $from ${TEST_SCRATCH_DIR}/randomfile /tmp/random
expect_output ""
run_buildah copy --quiet $WITH_POLICY_JSON --from $from $cid /tmp/random /tmp/random # absolute path
expect_output ""
run_buildah copy --quiet $WITH_POLICY_JSON --from $from $cid tmp/random /tmp/random2 # relative path
expect_output ""
run_buildah mount $cid
croot=$output
cmp ${TEST_SCRATCH_DIR}/randomfile ${croot}/tmp/random
cmp ${TEST_SCRATCH_DIR}/randomfile ${croot}/tmp/random2
}
@test "copy-container-root" {
_prefetch busybox
createrandom ${TEST_SCRATCH_DIR}/randomfile
run_buildah from --quiet $WITH_POLICY_JSON busybox
from=$output
run_buildah from --quiet $WITH_POLICY_JSON busybox
cid=$output
run_buildah copy --quiet $from ${TEST_SCRATCH_DIR}/randomfile /tmp/random
expect_output ""
run_buildah copy --quiet $WITH_POLICY_JSON --from $from $cid / /tmp/
expect_output "" || \
expect_output --substring "copier: file disappeared while reading"
run_buildah mount $cid
croot=$output
cmp ${TEST_SCRATCH_DIR}/randomfile ${croot}/tmp/tmp/random
}
@test "add-from-image" {
_prefetch busybox
run_buildah from --quiet $WITH_POLICY_JSON busybox
cid=$output
run_buildah add $WITH_POLICY_JSON --quiet --from ubuntu $cid /etc/passwd /tmp/passwd # should pull the image, absolute path
expect_output ""
run_buildah add --quiet $WITH_POLICY_JSON --from ubuntu $cid etc/passwd /tmp/passwd2 # relative path
expect_output ""
run_buildah from --quiet $WITH_POLICY_JSON ubuntu
ubuntu=$output
run_buildah mount $cid
croot=$output
run_buildah mount $ubuntu
ubuntu=$output
cmp $ubuntu/etc/passwd ${croot}/tmp/passwd
cmp $ubuntu/etc/passwd ${croot}/tmp/passwd2
}
@test "copy with .dockerignore" {
_prefetch alpine busybox
run_buildah from --quiet $WITH_POLICY_JSON alpine
from=$output
run_buildah copy --contextdir=$BUDFILES/dockerignore $from $BUDFILES/dockerignore ./
run_buildah 1 run $from ls -l test1.txt
run_buildah run $from ls -l test2.txt
run_buildah 1 run $from ls -l sub1.txt
run_buildah 1 run $from ls -l sub2.txt
run_buildah 1 run $from ls -l subdir/
}
@test "copy-preserving-extended-attributes" {
createrandom ${TEST_SCRATCH_DIR}/randomfile
# if we need to change which image we use, any image that can provide a working setattr/setcap/getfattr will do
image="quay.io/libpod/fedora-minimal:34"
if ! which setfattr > /dev/null 2> /dev/null; then
skip "setfattr not available, unable to check if it'll work in filesystem at ${TEST_SCRATCH_DIR}"
fi
run setfattr -n user.yeah -v butno ${TEST_SCRATCH_DIR}/root
if [ "$status" -ne 0 ] ; then
if [[ "$output" =~ "not supported" ]] ; then
skip "setfattr not supported in filesystem at ${TEST_SCRATCH_DIR}"
fi
skip "$output"
fi
_prefetch $image
run_buildah from --quiet $WITH_POLICY_JSON $image
first="$output"
run_buildah run $first microdnf -y install /usr/bin/setfattr /usr/sbin/setcap
run_buildah copy $first ${TEST_SCRATCH_DIR}/randomfile /
# set security.capability
run_buildah run $first setcap cap_setuid=ep /randomfile
# set user.something
run_buildah run $first setfattr -n user.yeah -v butno /randomfile
# copy the file to a second container
run_buildah from --quiet $WITH_POLICY_JSON $image
second="$output"
run_buildah run $second microdnf -y install /usr/bin/getfattr
run_buildah copy --from $first $second /randomfile /
# compare what the extended attributes look like. if we're on a system with SELinux, there's a label in here, too
run_buildah run $first sh -c "getfattr -d -m . --absolute-names /randomfile | grep -v ^security.selinux | sort"
expected="$output"
run_buildah run $second sh -c "getfattr -d -m . --absolute-names /randomfile | grep -v ^security.selinux | sort"
expect_output "$expected"
}
@test "copy-relative-context-dir" {
image=busybox
_prefetch $image
mkdir -p ${TEST_SCRATCH_DIR}/context
createrandom ${TEST_SCRATCH_DIR}/context/excluded_test_file
createrandom ${TEST_SCRATCH_DIR}/context/test_file
echo excluded_test_file | tee ${TEST_SCRATCH_DIR}/context/.containerignore | tee ${TEST_SCRATCH_DIR}/context/.dockerignore
run_buildah from --quiet $WITH_POLICY_JSON $image
ctr="$output"
cd ${TEST_SCRATCH_DIR}/context
run_buildah copy --contextdir . $ctr / /opt/
run_buildah run $ctr ls -1 /opt/
expect_line_count 1
assert "$output" = "test_file" "only contents of copied directory"
}