run-java-in-container.sh 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/usr/bin/env bash
  2. set -Eeuo pipefail
  3. testDir="$(readlink -f "$(dirname "$BASH_SOURCE")")"
  4. runDir="$(dirname "$(readlink -f "$BASH_SOURCE")")"
  5. image="$1"
  6. # do a little extra work to try and find a suitable JDK image (when "xyzjava:1.2.3-jre" first builds, "xyzjava:1.2.3-jdk" isn't published yet :D)
  7. tryJdks=(
  8. # ideally, we'd just swap the current JRE image to JDK, but that might not exist yet (see above)
  9. "${image/jre/jdk}"
  10. # try progressively less specific versions to try and find something that can compile an appropriate ".class" object for use in $image (working our way out from "Java 8" because that's going to be the most compatible)
  11. "${image%%:*}:8-jdk-slim"
  12. "${image%%:*}:8-jdk"
  13. "${image%%:*}:jdk-slim"
  14. "${image%%:*}:jdk"
  15. "${image%%:*}:latest"
  16. 'eclipse-temurin:8-jdk'
  17. )
  18. jdk=
  19. for potentialJdk in "${tryJdks[@]}"; do
  20. if docker run --rm --pull=missing "$potentialJdk" javac -help &> /dev/null; then
  21. jdk="$potentialJdk"
  22. break
  23. fi
  24. done
  25. if [ -z "$jdk" ]; then
  26. echo >&2 "error: failed to find a suitable JDK image for '$image'!"
  27. exit 1
  28. fi
  29. if [ "$jdk" != "${tryJdks[0]}" ]; then
  30. echo >&2 "warning: using '$jdk' instead of '${tryJdks[0]}' (results may vary!)"
  31. fi
  32. # if possible, use "--release" in case $jdk and $image have mismatching Java versions
  33. javac='javac'
  34. if docker run --rm "$jdk" javac --help 2>&1 | grep -q -- '--release'; then
  35. javac='javac --release 8'
  36. fi
  37. newImage="$("$runDir/image-name.sh" librarytest/java-hello-world "$image")"
  38. "$runDir/docker-build.sh" "$testDir" "$newImage" <<EOD
  39. FROM $jdk AS jdk
  40. WORKDIR /container
  41. COPY dir/container.java ./
  42. RUN $javac ./container.java
  43. FROM $image
  44. COPY --from=jdk /container /container
  45. WORKDIR /container
  46. EOD
  47. docker run --rm "$newImage" java -cp . container