run-java-in-container.sh 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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%%:*}:8"
  14. "${image%%:*}:11-jdk-slim"
  15. "${image%%:*}:11-jdk"
  16. "${image%%:*}:11"
  17. "${image%%:*}:jdk-slim"
  18. "${image%%:*}:jdk"
  19. "${image%%:*}:latest"
  20. 'eclipse-temurin:8-jdk'
  21. 'eclipse-temurin:11-jdk'
  22. )
  23. jdk=
  24. for potentialJdk in "${tryJdks[@]}"; do
  25. if docker run --rm --pull=missing "$potentialJdk" javac -help &> /dev/null; then
  26. jdk="$potentialJdk"
  27. break
  28. fi
  29. done
  30. if [ -z "$jdk" ]; then
  31. echo >&2 "error: failed to find a suitable JDK image for '$image'!"
  32. exit 1
  33. fi
  34. if [ "$jdk" != "${tryJdks[0]}" ]; then
  35. echo >&2 "warning: using '$jdk' instead of '${tryJdks[0]}' (results may vary!)"
  36. fi
  37. # if possible, use "--release" in case $jdk and $image have mismatching Java versions
  38. javac='javac'
  39. if docker run --rm "$jdk" javac --help 2>&1 | grep -q -- '--release'; then
  40. javac='javac --release 8'
  41. fi
  42. newImage="$("$runDir/image-name.sh" librarytest/java-hello-world "$image")"
  43. "$runDir/docker-build.sh" "$testDir" "$newImage" <<EOD
  44. FROM $jdk AS jdk
  45. WORKDIR /container
  46. COPY dir/container.java ./
  47. RUN $javac ./container.java
  48. FROM $image
  49. COPY --from=jdk /container /container
  50. WORKDIR /container
  51. EOD
  52. docker run --rm "$newImage" java -cp . container