run-java-in-container.sh 1.8 KB

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