|
1 | 1 | #!/bin/bash |
2 | 2 |
|
3 | | -set -o pipefail |
| 3 | +set -o pipefail |
4 | 4 |
|
5 | 5 | testDir="$(readlink -f "$(dirname "$BASH_SOURCE")")" |
6 | 6 | runDir="$(dirname "$(readlink -f "$BASH_SOURCE")")" |
7 | 7 |
|
8 | | -# Find Java major/minor/build/patch version |
9 | | -# |
10 | | -# https://stackoverflow.com/a/74459237/6460 |
11 | | -IFS='"' read -r _ java_version_string _ < <(docker run "$1" java -version 2>&1) |
12 | | -IFS='._' read -r \ |
13 | | - java_version_major \ |
14 | | - java_version_minor \ |
15 | | - java_version_build \ |
16 | | - java_version_patch \ |
17 | | - <<<"$java_version_string" |
18 | | - |
19 | 8 | # CMD1 in each run is just a `date` to make sure nothing is broken with or without the entrypoint |
20 | 9 | CMD1=date |
21 | 10 |
|
22 | | -# CMD2 in each run is to check for the `dockerbuilder` certificate in the Java keystore |
23 | | -if [ "$java_version_major" -lt 11 ]; then |
24 | | - # We are working with JDK/JRE 8 |
25 | | - # |
26 | | - # `keytool` from JDK/JRE 8 does not have the `-cacerts` option and also does not have standardized location for the |
27 | | - # `cacerts` file between the JDK and JRE, so we'd want to check both possible locations. |
28 | | - CACERTS=/opt/java/openjdk/lib/security/cacerts |
29 | | - CACERTS2=/opt/java/openjdk/jre/lib/security/cacerts |
30 | | - |
31 | | - CMD2=(sh -c "keytool -list -keystore $CACERTS -storepass changeit -alias dockerbuilder || keytool -list -keystore $CACERTS2 -storepass changeit -alias dockerbuilder") |
32 | | -else |
33 | | - CMD2=(keytool -list -cacerts -storepass changeit -alias dockerbuilder) |
34 | | -fi |
35 | | - |
36 | | -# |
37 | | -# We need to use `docker run`, since `run-in-container.sh` overwrites the entrypoint |
| 11 | +# CMD2 in each run is to check for the `dockerbuilder` certificate in the Java keystore. Entrypoint export $CACERT to |
| 12 | +# point to the Java keystore. |
| 13 | +CMD2=(sh -c "keytool -list -keystore \$CACERT -storepass changeit -alias dockerbuilder") |
| 14 | + |
| 15 | +# For a custom entrypoint test, we need to create a new image. This image will get cleaned up at the end of the script |
| 16 | +# by the `finish` trap function. |
| 17 | +TESTIMAGE=$1.test |
| 18 | + |
| 19 | +function finish { |
| 20 | + docker rmi "$TESTIMAGE" >&/dev/null |
| 21 | +} |
| 22 | +trap finish EXIT HUP INT TERM |
| 23 | + |
| 24 | +# But first, we need to create an image with an overridden entrypoint |
| 25 | +docker build -t "$1.test" "$runDir" -f - <<EOF >&/dev/null |
| 26 | +FROM $1 |
| 27 | +COPY custom-entrypoint.sh / |
| 28 | +ENTRYPOINT ["/custom-entrypoint.sh"] |
| 29 | +EOF |
| 30 | + |
| 31 | +# NB: In this script, we need to use `docker run` explicitely, since the normally used `run-in-container.sh` overwrites |
| 32 | +# the entrypoint. |
| 33 | + |
| 34 | +# |
| 35 | +# PHASE 1: Root containers |
38 | 36 | # |
39 | 37 |
|
40 | 38 | # Test run 1: No added certificates and environment variable is not set. We expect CMD1 to succeed and CMD2 to fail. |
@@ -63,24 +61,47 @@ echo -n $? |
63 | 61 | docker run --rm -e USE_SYSTEM_CA_CERTS=1 --volume=$testDir/certs:/certificates "$1" "${CMD2[@]}" >&/dev/null |
64 | 62 | echo -n $? |
65 | 63 |
|
66 | | -TESTIMAGE=$1.test |
| 64 | +# Test run 5: Certificates are mounted and the environment variable is set, but the entrypoint is overridden. We expect |
| 65 | +# CMD1 to succeed and CMD2 to fail. |
| 66 | +docker run --rm -e USE_SYSTEM_CA_CERTS=1 --volume=$testDir/certs:/certificates "$TESTIMAGE" $CMD1 >&/dev/null |
| 67 | +echo -n $? |
| 68 | +docker run --rm -e USE_SYSTEM_CA_CERTS=1 --volume=$testDir/certs:/certificates "$TESTIMAGE" "${CMD2[@]}" >&/dev/null |
| 69 | +echo -n $? |
67 | 70 |
|
68 | | -function finish { |
69 | | - docker rmi "$TESTIMAGE" >&/dev/null |
70 | | -} |
71 | | -trap finish EXIT HUP INT TERM |
| 71 | +# |
| 72 | +# PHASE 2: Non-root containers |
| 73 | +# |
| 74 | + |
| 75 | +# Test run 1: No added certificates and environment variable is not set. We expect CMD1 to succeed and CMD2 to fail. |
| 76 | +docker run --read-only --user 1000:1000 --rm "$1" $CMD1 >&/dev/null |
| 77 | +echo -n $? |
| 78 | +docker run --read-only --user 1000:1000 --rm "$1" "${CMD2[@]}" >&/dev/null |
| 79 | +echo -n $? |
| 80 | + |
| 81 | +# Test run 2: No added certificates, but the environment variable is set. Since there are no certificates, we still |
| 82 | +# expect CMD1 to succeed and CMD2 to fail. |
| 83 | +docker run --read-only --user 1000:1000 -v /tmp --rm -e USE_SYSTEM_CA_CERTS=1 "$1" $CMD1 >&/dev/null |
| 84 | +echo -n $? |
| 85 | +docker run --read-only --user 1000:1000 -v /tmp --rm -e USE_SYSTEM_CA_CERTS=1 "$1" "${CMD2[@]}" >&/dev/null |
| 86 | +echo -n $? |
| 87 | + |
| 88 | +# Test run 3: Certificates are mounted, but the environment variable is not set, i.e. certificate importing should not |
| 89 | +# be activated. We expect CMD1 to succeed and CMD2 to fail. |
| 90 | +docker run --read-only --user 1000:1000 --rm --volume=$testDir/certs:/certificates "$1" $CMD1 >&/dev/null |
| 91 | +echo -n $? |
| 92 | +docker run --read-only --user 1000:1000 --rm --volume=$testDir/certs:/certificates "$1" "${CMD2[@]}" >&/dev/null |
| 93 | +echo -n $? |
| 94 | + |
| 95 | +# Test run 4: Certificates are mounted and the environment variable is set. We expect both CMD1 and CMD2 to succeed. |
| 96 | +docker run --read-only --user 1000:1000 -v /tmp --rm -e USE_SYSTEM_CA_CERTS=1 --volume=$testDir/certs:/certificates "$1" $CMD1 >&/dev/null |
| 97 | +echo -n $? |
| 98 | +docker run --read-only --user 1000:1000 -v /tmp --rm -e USE_SYSTEM_CA_CERTS=1 --volume=$testDir/certs:/certificates "$1" "${CMD2[@]}" >&/dev/null |
| 99 | +echo -n $? |
72 | 100 |
|
73 | 101 | # Test run 5: Certificates are mounted and the environment variable is set, but the entrypoint is overridden. We expect |
74 | 102 | # CMD1 to succeed and CMD2 to fail. |
75 | 103 | # |
76 | | -# But first, we need to create an image with an overridden entrypoint |
77 | | -docker build -t "$1.test" "$runDir" -f - <<EOF >&/dev/null |
78 | | -FROM $1 |
79 | | -COPY custom-entrypoint.sh / |
80 | | -ENTRYPOINT ["/custom-entrypoint.sh"] |
81 | | -EOF |
82 | | - |
83 | | -docker run --rm -e USE_SYSTEM_CA_CERTS=1 --volume=$testDir/certs:/certificates "$TESTIMAGE" $CMD1 >&/dev/null |
| 104 | +docker run --read-only --user 1000:1000 -v /tmp --rm -e USE_SYSTEM_CA_CERTS=1 --volume=$testDir/certs:/certificates "$TESTIMAGE" $CMD1 >&/dev/null |
84 | 105 | echo -n $? |
85 | | -docker run --rm -e USE_SYSTEM_CA_CERTS=1 --volume=$testDir/certs:/certificates "$TESTIMAGE" "${CMD2[@]}" >&/dev/null |
| 106 | +docker run --read-only --user 1000:1000 -v /tmp --rm -e USE_SYSTEM_CA_CERTS=1 --volume=$testDir/certs:/certificates "$TESTIMAGE" "${CMD2[@]}" >&/dev/null |
86 | 107 | echo -n $? |
0 commit comments