diff --git a/docker/Dockerfile.sakuli.ui b/docker/Dockerfile.sakuli.ui index 5c820263..a90d3fd8 100644 --- a/docker/Dockerfile.sakuli.ui +++ b/docker/Dockerfile.sakuli.ui @@ -25,14 +25,15 @@ ENV HTTP_PORT=8080 \ SAKULI_UI_DOCKER_USER_ID=1000 \ SAKULI_ROOT_DIR=/opt/sakuli-ui-root -# $INST_SCRIPTS is already set in FROM image ADD ./sakuli-ui/src/common/install/ $INST_SCRIPTS/ RUN find $INST_SCRIPTS -name '*.sh' -exec chmod a+x {} + +### Intsall basics for jvm & docker +RUN $INST_SCRIPTS/add_jvm_options.sh RUN $INST_SCRIPTS/docker.sh -#TODO TS add docker-compose -#TODO TS add JAVA HEAP options +RUN $INST_SCRIPTS/docker-compose.sh +### Install Sakuli UI ARG SAKULI_VERSION=1.2.0-SNAPSHOT-308-sakuli-ui RUN $INST_SCRIPTS/sakuli_ui.sh @@ -40,7 +41,7 @@ RUN $INST_SCRIPTS/sakuli_ui.sh ADD ./sakuli-ui/src/common/scripts/ $STARTUPDIR RUN $INST_SCRIPTS/set_user_permission.sh $STARTUPDIR $HOME -## Connection ports for Web Application: +## Connection port for Web Application: EXPOSE $HTTP_PORT USER $SAKULI_UI_USER_ID diff --git a/docker/sakuli-ui/src/common/install/add_jvm_options.sh b/docker/sakuli-ui/src/common/install/add_jvm_options.sh new file mode 100644 index 00000000..8bc6a357 --- /dev/null +++ b/docker/sakuli-ui/src/common/install/add_jvm_options.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +### every exit != 0 fails the script +set -e +set -u + +echo "Add JVM options" + +# add source jvm_options.sh script to set correct java JVM options on startup +echo 'source $STARTUPDIR/jvm_options.sh' >> $HOME/.bashrc \ No newline at end of file diff --git a/docker/sakuli-ui/src/common/install/docker-compose.sh b/docker/sakuli-ui/src/common/install/docker-compose.sh new file mode 100755 index 00000000..b97e443c --- /dev/null +++ b/docker/sakuli-ui/src/common/install/docker-compose.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -e + +version=1.19.0 +echo "install latest docker-compose $version" +curl -L https://github.com/docker/compose/releases/download/$version/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose +chmod +x /usr/local/bin/docker-compose + +echo "------------ docker-compose version -----------" +docker-compose version + +echo ".... done!" diff --git a/docker/sakuli-ui/src/common/install/docker.sh b/docker/sakuli-ui/src/common/install/docker.sh index d9296eee..eb30f4e6 100755 --- a/docker/sakuli-ui/src/common/install/docker.sh +++ b/docker/sakuli-ui/src/common/install/docker.sh @@ -7,3 +7,5 @@ echo "Install Docker CLI from Docker Inc. repositories." curl -sSL https://get.docker.com/ | sh \ && useradd $SAKULI_UI_DOCKER_USER_ID -m -s /bin/bash \ && usermod -aG docker $SAKULI_UI_DOCKER_USER_ID + +apt-get clean -y \ No newline at end of file diff --git a/docker/sakuli-ui/src/common/scripts/jvm_options.sh b/docker/sakuli-ui/src/common/scripts/jvm_options.sh new file mode 100755 index 00000000..29da8178 --- /dev/null +++ b/docker/sakuli-ui/src/common/scripts/jvm_options.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# Return reasonable JVM options to run inside a Docker container where memory and +# CPU can be limited with cgroups. +# https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html +# +# The script can be used in a custom CMD or ENTRYPOINT +# +# source jvm_options + +# Options: +# JVM_HEAP_RATIO=0.5 Ratio of heap size to available memory + +# If Xmx is not set the JVM will use by default 1/4th (in most cases) of the host memory +# This can cause the Kernel to kill the container if the JVM memory grows over the cgroups limit +# because the JVM is not aware of that limit and doesn't invoke the GC +# Setting it by default to 0.5 times the memory limited by cgroups, customizable with JVM_HEAP_RATIO + +echo "---------------------- Resolve _JAVA_OPTIONS -----------------------------------" +if [ -z "$JVM_HEAP_XMX" ] ; then + CGROUPS_MEM=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes) + echo CGROUPS_MEM: $CGROUPS_MEM bytes, $(($CGROUPS_MEM/1024/1024)) MB + + MEMINFO_MEM=$(($(awk '/MemTotal/ {print $2}' /proc/meminfo)*1024)) + echo MEMINFO_MEM: $MEMINFO_MEM bytes, $(($MEMINFO_MEM/1024/1024)) MB + + MEM_USABLE=$(($MEMINFO_MEM>$CGROUPS_MEM?$CGROUPS_MEM:$MEMINFO_MEM)) + # prevent float issue if $CGROUPS_MEM > bash max value, see https://github.com/ConSol/sakuli/issues/280 + MEM_USABLE=$(($CGROUPS_MEM>$MEMINFO_MEM?$MEMINFO_MEM:$MEMINFO_MEM)) + echo "" + echo MEM_USABLE: $MEM_USABLE bytes, $(($MEM_USABLE/1024/1024)) MB + + JVM_HEAP_RATIO=${JVM_HEAP_RATIO:-0.5} + echo "JVM_HEAP_RATIO $JVM_HEAP_RATIO of MEM $(($MEM_USABLE/1024/1024)) MB" + JVM_HEAP_XMX=$(awk '{printf("%d",$1*$2/1024^2)}' <<<" ${MEM_USABLE} ${JVM_HEAP_RATIO} ") + + JVM_HEAP_XMX_MAX=${JVM_HEAP_XMX_MAX:-300} + JVM_HEAP_XMX_MIN=${JVM_HEAP_XMX_MIN:-96} + if [ $JVM_HEAP_XMX -gt $JVM_HEAP_XMX_MAX ]; then + echo "calculated JVM_HEAP_XMX $JVM_HEAP_XMX MB is too high, choose JVM_HEAP_XMX_MAX: $JVM_HEAP_XMX_MAX MB" + JVM_HEAP_XMX=$JVM_HEAP_XMX_MAX + fi + if [ $JVM_HEAP_XMX -lt $JVM_HEAP_XMX_MIN ]; then + echo "calculated JVM_HEAP_XMX $JVM_HEAP_XMX MB is too small, try to use at the JVM_HEAP_XMX_MIN ($JVM_HEAP_XMX_MIN MB)" + if [ $MEM_USABLE -lt $JVM_HEAP_XMX_MIN ]; then + echo "Container need at least $JVM_HEAP_XMX_MIN MB memory for the JVM! Stop container starup!" + exit -1 + fi + JVM_HEAP_XMX=$JVM_HEAP_XMX_MIN + fi + +fi +echo "" +echo "JVM_HEAP_XMX: $JVM_HEAP_XMX MB" + +# set correct java startup +export _JAVA_OPTIONS="-Duser.home=$HOME -Xmx${JVM_HEAP_XMX}m" +# add docker jvm flags, can maybe removed with JDK9, see https://github.com/ConSol/sakuli/issues/291 +export _JAVA_OPTIONS="$_JAVA_OPTIONS -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap" + +echo "set _JAVA_OPTIONS: $_JAVA_OPTIONS" +echo "--------------------------------------------------------------------------------"