Skip to content

Commit

Permalink
Merge pull request #1358 from vorburger/issue-304_s2i-native
Browse files Browse the repository at this point in the history
Native S2I Builder image
  • Loading branch information
cescoffier authored Mar 19, 2019
2 parents ee4472c + fafe896 commit 6c7c813
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 0 deletions.
61 changes: 61 additions & 0 deletions docker/centos-graal-maven-s2i/Dockerfile
Original file line number Diff line number Diff line change
@@ -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" ]
57 changes: 57 additions & 0 deletions docker/centos-graal-maven-s2i/README.md
Original file line number Diff line number Diff line change
@@ -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
14 changes: 14 additions & 0 deletions docker/centos-graal-maven-s2i/s2i/assemble
Original file line number Diff line number Diff line change
@@ -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}

7 changes: 7 additions & 0 deletions docker/centos-graal-maven-s2i/s2i/run
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 6c7c813

Please sign in to comment.