diff --git a/docker/centos-graal-maven-s2i/Dockerfile b/docker/centos-graal-maven-s2i/Dockerfile new file mode 100644 index 0000000000000..d24acd39ec711 --- /dev/null +++ b/docker/centos-graal-maven-s2i/Dockerfile @@ -0,0 +1,61 @@ +# [Quarkus.io](http://quarkus.io) *native* S2I builder +# Original Author: Michael Vorburger.ch + +# This part is heavily inspired by ../centos-graal/Dockerfile +FROM centos:latest + +ARG GRAAL_VERSION=1.0.0-rc13 +ARG MAVEN_VERSION=3.6.0 + +ARG GRAAL_CE_URL=https://github.com/oracle/graal/releases/download/vm-${GRAAL_VERSION}/graalvm-ce-${GRAAL_VERSION}-linux-amd64.tar.gz +ARG MAVEN_URL=https://archive.apache.org/dist/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz + +ENV JAVA_HOME=/opt/graalvm +ENV PATH=$PATH:$JAVA_HOME/bin +ENV GRAALVM_HOME=/opt/graalvm +ENV QUARKUS_HOME=/home/quarkus + +RUN yum update -y && \ + yum install -y --setopt=skip_missing_names_on_install=False \ + tar gzip gcc glibc-devel zlib-devel curl && \ + mkdir -p /opt/graalvm && \ + cd /opt/graalvm && \ + curl -fsSL $GRAAL_CE_URL | tar -xzC /opt/graalvm --strip-components=1 && \ + +# This part is inspired by ../centos-graal-maven/Dockerfile and fabric8io-images/s2i + + mkdir -p /usr/share/maven && \ + curl -fsSL ${MAVEN_URL} | tar -xzC /usr/share/maven --strip-components=1 && \ + ln -s /usr/share/maven/bin/mvn /usr/bin/mvn && \ + + adduser -u 1001 -g 0 quarkus --home-dir ${QUARKUS_HOME} && \ + chown -R 1001:0 ${QUARKUS_HOME} && \ + chmod -R ug+rwX ${QUARKUS_HOME} + +ENV MAVEN_HOME /usr/share/maven +ENV MAVEN_CONFIG ${QUARKUS_HOME}/.m2 +ENV MAVEN_OPTS="-XX:+TieredCompilation -XX:TieredStopAtLevel=1" + +# This part is firmly inspired by fabric8io-images/s2i + +LABEL io.openshift.s2i.scripts-url="image:///usr/local/s2i" \ + io.openshift.s2i.destination="/tmp" \ + + io.k8s.description="Quarkus.io S2I image for building Kubernetes Native Java GraalVM applications and running its Native Executables" \ + io.k8s.display-name="Quarkus.io S2I (GraalVM Native)" \ + io.openshift.tags="builder,java,quarkus,native" + +# S2I scripts + README +COPY s2i /usr/local/s2i +RUN chmod 755 /usr/local/s2i/* +ADD README.md /usr/local/s2i/usage.txt + +ENV PATH=$PATH:"/usr/local/s2i" + +USER 1001 + +EXPOSE 8080 + +# Use the run script as default since we are working as an hybrid image which can be +# used directly to. (If we were a plain s2i image we would print the usage info here.) +CMD [ "/usr/local/s2i/run" ] diff --git a/docker/centos-graal-maven-s2i/README.md b/docker/centos-graal-maven-s2i/README.md new file mode 100644 index 0000000000000..19bccf0377f9f --- /dev/null +++ b/docker/centos-graal-maven-s2i/README.md @@ -0,0 +1,57 @@ +# [Quarkus.io](http://quarkus.io) GraalVM Native S2I + +## OpenShift + +### Minishift 8 GB Set-Up recommendation + + minishift profile delete quarkus-s2i-native + minishift profile set quarkus-s2i-native + minishift config set memory 8192 + minishift start + +### OpenShift Build + + oc new-build https://github.com/quarkusio/quarkus.git --context-dir=docker/centos-graal-maven-s2i --name quarkus-native-s2i + oc logs -f bc/quarkus-native-s2i + +### OpenShift Use + + oc new-app quarkus-native-s2i~https://github.com/quarkusio/quarkus-quickstarts --context-dir=getting-started --name=getting-started-native + oc logs -f bc/getting-started-native + oc expose svc/getting-started-native + +Note that GraalVM-based native build are more memory & CPU intensive than regular pure Java builds. +[By default, builds are completed by pods using unbound resources, such as memory and CPU](https://docs.openshift.com/container-platform/3.11/dev_guide/builds/advanced_build_operations.html), +but note that [your OpenShift Project may have limit ranges defined](https://docs.openshift.com/container-platform/3.11/admin_guide/limits.html#admin-guide-limits). + +Testing indicates that the "hello, world" getting-started demo application builds in around 2 minutes on typical hardware when the build is given 4 GB of RAM and 4 (virtual) CPUs for concurrency. You therefore may need to increase the respective limits for OpenShift's S2I build containers like so: + + apiVersion: "v1" + kind: "BuildConfig" + metadata: + name: "getting-started-native" + spec: + resources: + limits: + cpu: '4' + memory: 4Gi + +The following `oc patch` command does this: + + oc patch bc/getting-started-native -p '{"spec":{"resources":{"limits":{"cpu":"4", "memory":"4Gi"}}}}' + +## Locally (only for testing) + +### Local Build + + docker build . -t quarkus-native-s2i + +### Local use + + sudo dnf install source-to-image + + s2i build --copy ../../../quarkus-quickstarts/getting-started quarkus-native-s2i getting-started-native + + docker run --rm -it -p 8080:8080 getting-started-native + + curl http://localhost:8080/hello/greeting/quarkus diff --git a/docker/centos-graal-maven-s2i/s2i/assemble b/docker/centos-graal-maven-s2i/s2i/assemble new file mode 100644 index 0000000000000..749398714d71c --- /dev/null +++ b/docker/centos-graal-maven-s2i/s2i/assemble @@ -0,0 +1,14 @@ +#!/bin/sh + +# This POC script is based on the openshift/source-to-image project documentation, +# and loosely inspired by fabric8io-images/s2i's assemble script, but **MUCH** simplified; +# a TODO future PRODUCTION version of this would probably want to re-use that script... + +set -ex + +cd /tmp/src/ +mvn package -Pnative -e -B \ + -DskipTests -Dmaven.javadoc.skip=true -Dmaven.site.skip=true -Dmaven.source.skip=true \ + -Djacoco.skip=true -Dcheckstyle.skip=true -Dfindbugs.skip=true -Dpmd.skip=true -Dfabric8.skip=true +cp -v target/*-runner ${QUARKUS_HOME} + diff --git a/docker/centos-graal-maven-s2i/s2i/run b/docker/centos-graal-maven-s2i/s2i/run new file mode 100644 index 0000000000000..3210c6cc433a9 --- /dev/null +++ b/docker/centos-graal-maven-s2i/s2i/run @@ -0,0 +1,7 @@ +#!/bin/sh + +# This POC script is (intentionally) overly trivial. +# a TODO future PRODUCTION version of this would probably want tomake it possible to +# e.g. pass additional parameters to the executable, as does fabric8io-images/s2i's run script. + +${QUARKUS_HOME}/*-runner -Dquarkus.http.host=0.0.0.0