From fd85f9aa58d9299b25e04c4c0344eaf302787b9f Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Thu, 12 Nov 2020 16:01:34 -0500 Subject: [PATCH] enable launcher to run within docker container --- Dockerfile | 40 +++++++++++++++++ .../src/main/java/bubble/ApiConstants.java | 2 +- .../main/java/bubble/server/BubbleServer.java | 5 ++- docker/bubble.env | 0 docker/bubble.sh | 45 +++++++++++++++++++ docker/run_bubble.sh | 11 +++++ docker/run_postgresql.sh | 21 +++++++++ docker/run_redis.sh | 5 +++ 8 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 Dockerfile create mode 100644 docker/bubble.env create mode 100755 docker/bubble.sh create mode 100755 docker/run_bubble.sh create mode 100755 docker/run_postgresql.sh create mode 100755 docker/run_redis.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..0112e598 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,40 @@ +# +# Copyright (c) 2020 Bubble, Inc. All rights reserved. For personal (non-commercial) use, see license: https://getbubblenow.com/bubble-license/ +# +FROM phusion/baseimage:focal-1.0.0alpha1-amd64 +MAINTAINER jonathan@getbubblenow.com +LABEL maintainer="jonathan@getbubblenow.com" +LABEL license="https://getbubblenow.com/license" + +RUN apt update -y +RUN DEBIAN_FRONTEND=noninteractive apt upgrade -y --no-install-recommends +RUN DEBIAN_FRONTEND=noninteractive apt install openjdk-11-jre-headless postgresql redis-server jq python3 python3-pip curl unzip -y --no-install-recommends +RUN DEBIAN_FRONTEND=noninteractive apt install xtail -y --no-install-recommends +RUN pip3 install setuptools psycopg2-binary + +RUN bash -c "sed -i -e 's/daemonize yes/daemonize no/g' /etc/redis/redis.conf" + +RUN bash -c "sed -i -e 's/ md5/ trust/g' $(find /etc/postgresql -mindepth 1 -maxdepth 1 -type d | sort | tail -1)/main/pg_hba.conf" +RUN bash -c "service postgresql start && sleep 5s && service postgresql status && \ + su - postgres bash -c 'createuser -h 127.0.0.1 -U postgres --createdb --createrole --superuser root' && \ + su - postgres bash -c 'createuser -h 127.0.0.1 -U postgres --createdb bubble'" + +RUN mkdir /etc/service/postgresql +COPY docker/run_postgresql.sh /etc/service/postgresql/run + +RUN mkdir /etc/service/redis +COPY docker/run_redis.sh /etc/service/redis/run + +RUN mkdir /bubble +COPY bin/install_packer.sh /usr/local/bin/ +RUN /usr/local/bin/install_packer.sh + +COPY bubble-server/target/bubble-server-*.jar /bubble/bubble.jar +COPY docker/bubble.env /bubble/bubble.env + +RUN mkdir /etc/service/bubble +COPY docker/run_bubble.sh /etc/service/bubble/run + +EXPOSE 8090 + +CMD ["/sbin/my_init"] diff --git a/bubble-server/src/main/java/bubble/ApiConstants.java b/bubble-server/src/main/java/bubble/ApiConstants.java index bd54ac35..fbdfbb5c 100644 --- a/bubble-server/src/main/java/bubble/ApiConstants.java +++ b/bubble-server/src/main/java/bubble/ApiConstants.java @@ -119,7 +119,7 @@ public class ApiConstants { static { final String userHome = System.getProperty("user.home"); final String envHome = System.getenv("HOME"); - if (!userHome.equals(envHome)) { + if (envHome != null && !userHome.equals(envHome)) { log.warn("System.getProperty(\"user.home\") == "+userHome+" differs from System.getenv(\"HOME\") == "+envHome+", using HOME from environment: "+envHome); HOME_DIR = envHome; } else { diff --git a/bubble-server/src/main/java/bubble/server/BubbleServer.java b/bubble-server/src/main/java/bubble/server/BubbleServer.java index 47d8f311..40df8c41 100644 --- a/bubble-server/src/main/java/bubble/server/BubbleServer.java +++ b/bubble-server/src/main/java/bubble/server/BubbleServer.java @@ -37,6 +37,7 @@ import static org.cobbzilla.util.daemon.ZillaRuntime.die; import static org.cobbzilla.util.daemon.ZillaRuntime.empty; import static org.cobbzilla.util.io.FileUtil.abs; import static org.cobbzilla.util.json.JsonUtil.json; +import static org.cobbzilla.util.network.NetworkUtil.IPv4_ALL_ADDRS; import static org.cobbzilla.util.network.NetworkUtil.IPv4_LOCALHOST; import static org.cobbzilla.util.system.OutOfMemoryErrorUncaughtExceptionHandler.EXIT_ON_OOME; @@ -74,7 +75,9 @@ public class BubbleServer extends RestServerBase { restoreKey.set(null); } - @Override protected String getListenAddress() { return IPv4_LOCALHOST; } + @Override protected String getListenAddress() { return listenAll() ? IPv4_ALL_ADDRS : IPv4_LOCALHOST; } + + private boolean listenAll() { return Boolean.parseBoolean(System.getProperty("bubble.listenAll")); } // config is loaded from the classpath public static void main(String[] args) throws Exception { diff --git a/docker/bubble.env b/docker/bubble.env new file mode 100644 index 00000000..e69de29b diff --git a/docker/bubble.sh b/docker/bubble.sh new file mode 100755 index 00000000..70fa49b6 --- /dev/null +++ b/docker/bubble.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# +# Copyright (c) 2020 Bubble, Inc. All rights reserved. For personal (non-commercial) use, see license: https://getbubblenow.com/bubble-license/ +# +# Build or run a docker container for a Bubble launcher +# +# -- Building a Docker image: +# +# bubble.sh build [tag-name] +# +# tag-name : name of the docker tag to apply, default is bubble/bubble_launcher:X +# +# -- Running a Docker image: +# +# bubble.sh run [tag-name] +# +# tag-name : name of the docker tag to use, default is bubble/bubble_launcher:X +# + +function die { + echo 1>&2 "${1}" + exit 1 +} + +THISDIR="$(cd "$(dirname "${0}")" && pwd)" +cd "${THISDIR}/.." || die "Directory not found: ${THISDIR}/.." + +DEFAULT_TAG="bubble/bubble_launcher:0.2" + +MODE=${1:?no mode specified, use build or run} +TAG=${2:-${DEFAULT_TAG}} + +if [[ "${MODE}" == "build" ]] ; then + if [[ $(find bubble-server/target -type f -name "bubble-server-*.jar" | wc -l | tr -d ' ') -eq 0 ]] ; then + die "No bubble jar found in $(pwd)/bubble-server/target" + fi + docker build -t bubble/test:0.1 . + +elif [[ "${MODE}" == "run" ]] ; then + docker run --env-file <(cat "${HOME}/.bubble.env" | sed -e 's/export //' | tr -d '"' | tr -d "'") -p 8090:8090 -t bubble/test:0.1 + +else + die "Invalid mode (expected build or run): ${MODE}" +fi + diff --git a/docker/run_bubble.sh b/docker/run_bubble.sh new file mode 100755 index 00000000..29856008 --- /dev/null +++ b/docker/run_bubble.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# +# Copyright (c) 2020 Bubble, Inc. All rights reserved. For personal (non-commercial) use, see license: https://getbubblenow.com/bubble-license/ +# + +/usr/bin/java \ + -Dfile.encoding=UTF-8 -Djava.net.preferIPv4Stack=true -Dbubble.listenAll=true \ + -XX:+UseG1GC -XX:MaxGCPauseMillis=400 \ + -cp /bubble/bubble.jar \ + bubble.server.BubbleServer \ + /bubble/bubble.env diff --git a/docker/run_postgresql.sh b/docker/run_postgresql.sh new file mode 100755 index 00000000..01df51ad --- /dev/null +++ b/docker/run_postgresql.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# +# Copyright (c) 2020 Bubble, Inc. All rights reserved. For personal (non-commercial) use, see license: https://getbubblenow.com/bubble-license/ +# + +# +# adapted from https://stackoverflow.com/q/11092358 +# This script is run by Supervisor to start PostgreSQL in foreground mode +# +# If you have more than one PostgreSQL version installed, there could be problems. +# This script assumes you have only one version installed + +if [ -d /var/run/postgresql ]; then + chmod 2775 /var/run/postgresql +else + install -d -m 2775 -o postgres -g postgres /var/run/postgresql +fi + +exec su postgres -c "$(find $(find /usr/lib/postgresql -type d -name bin | head -1) -type f -name postgres | head -1) \ + -D $(find /usr/lib/postgresql -type d -name main | head -1) \ + -c config_file=$(find /etc/postgresql -type d -name main | head -1)/postgresql.conf" diff --git a/docker/run_redis.sh b/docker/run_redis.sh new file mode 100755 index 00000000..a9d1ea47 --- /dev/null +++ b/docker/run_redis.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# +# Copyright (c) 2020 Bubble, Inc. All rights reserved. For personal (non-commercial) use, see license: https://getbubblenow.com/bubble-license/ +# +redis-server