diff --git a/Dockerfile b/Dockerfile index 985ca84e..34e2e69f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,9 +2,6 @@ FROM adoptopenjdk/openjdk8-openj9:alpine LABEL org.opencontainers.image.authors="Geoff Bourne " -# upgrade all packages since alpine jre8 base image tops out at 8u212 -RUN apk -U --no-cache upgrade - RUN apk add --no-cache -U \ openssl \ imagemagick \ @@ -69,6 +66,8 @@ COPY server.properties /tmp/server.properties COPY log4j2.xml /tmp/log4j2.xml WORKDIR /data +STOPSIGNAL SIGTERM + ENV UID=1000 GID=1000 \ MEMORY="1G" \ TYPE=VANILLA VERSION=LATEST \ diff --git a/README.md b/README.md index 438e8533..b3861fed 100644 --- a/README.md +++ b/README.md @@ -317,9 +317,19 @@ A [Tuinity](https://github.com/Spottedleaf/Tuinity) server, which is a fork of P > **NOTE** only `VERSION=LATEST` is supported +## Running an Airplane server + +An [Airplane](https://github.com/TECHNOVE/Airplane) server, which is a fork of Tuinity aimed at further improving server performance at high playercounts. + + -e TYPE=AIRPLANE + +> **NOTE** only `VERSION=LATEST` is supported + +> **NOTE** only Java 8 and 11 are supported + ## Running a Purpur server -A [Purpur](https://purpur.pl3x.net/) server, which is "a fork of Paper and Tuinity with the goal of providing new and interesting configuration options". +A [Purpur](https://purpur.pl3x.net/) server, which is "a fork of Paper, Tuinity, Airplane with the goal of providing new and interesting configuration options". -e TYPE=PURPUR @@ -1097,6 +1107,35 @@ via a `JVM_XX_OPTS` environment variable. For some cases, if e.g. after removing mods, it could be necessary to startup minecraft with an additional `-D` parameter like `-Dfml.queryResult=confirm`. To address this you can use the environment variable `JVM_DD_OPTS`, which builds the params from a given list of values separated by space, but without the `-D` prefix. To make things running under systems (e.g. Plesk), which doesn't allow `=` inside values, a `:` (colon) could be used instead. The upper example would look like this: `JVM_DD_OPTS=fml.queryResult:confirm`, and will be converted to `-Dfml.queryResult=confirm`. +### Interactive and Color Console + +If you would like to attach to the Minecraft server console with color and interactive capabilities, then add + +``` + -e EXEC_DIRECTLY=true +``` + +> **NOTE** this will bypass graceful server shutdown handling when using `docker stop`, so be sure to use `rcon-cli` or console commands to `stop` the server. + +### OpenJ9 Specific Options + +The openj9 image tags include specific variables to simplify configuration: + +- `-e TUNE_VIRTUALIZED=TRUE` : enables the option to + [optimize for virtualized environments](https://www.eclipse.org/openj9/docs/xtunevirtualized/) +- `-e TUNE_NURSERY_SIZES=TRUE` : configures nursery sizes where the initial size is 50% + of the `MAX_MEMORY` and the max size is 80%. + +### Enabling rolling logs + +By default the vanilla log file will grow without limit. The logger can be reconfigured to use a rolling log files strategy by using: + +``` + -e ENABLE_ROLLING_LOGS=true +``` + +> **NOTE** this will interfere with interactive/color consoles [as described in the section above](#interactive-and-color-console) + ## Timezone Configuration You can configure the timezone to match yours by setting the `TZ` environment variable: diff --git a/start b/start index 43aff1e5..e91b7da5 100644 --- a/start +++ b/start @@ -5,7 +5,7 @@ umask 0002 chmod g+w /data -if [ $(id -u) = 0 ]; then +if ! isTrue "${SKIP_SUDO:-false}" && [ $(id -u) = 0 ]; then runAsUser=minecraft runAsGroup=minecraft diff --git a/start-configuration b/start-configuration index 1a689a1b..c02bce98 100644 --- a/start-configuration +++ b/start-configuration @@ -163,12 +163,16 @@ case "${TYPE^^}" in YATOPIA) exec ${SCRIPTS:-/}start-deployYatopia "$@" ;; + + AIRPLANE) + exec ${SCRIPTS:-/}start-deployAirplane "$@" + ;; *) log "Invalid type: '$TYPE'" log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA (multiarch-only)," log " CURSE_INSTANCE, CURSEFORGE, SPONGEVANILLA, TUINITY, PURPUR" - log " CUSTOM, MAGMA, MOHIST, CATSERVER, YATOPIA" + log " CUSTOM, MAGMA, MOHIST, CATSERVER, YATOPIA, AIRPLANE" exit 1 ;; diff --git a/start-deployAirplane b/start-deployAirplane new file mode 100644 index 00000000..69a4a6fd --- /dev/null +++ b/start-deployAirplane @@ -0,0 +1,37 @@ +#!/bin/bash +set -euo pipefail +IFS=$'\n\t' + +. ${SCRIPTS:-/}start-utils +isDebugging && set -x + +JAVA_VER=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1) + +if [ "${JAVA_VER}" != "8" ] && [ "${JAVA_VER}" != "11" ]; then + log "ERROR: Airplane server type only supports Java versions 8 and 11" + exit 1 +fi + +if [ "${VERSION}" != "LATEST" ]; then + log "ERROR: Airplane server type only supports VERSION=LATEST" + exit 1 +fi + +export SERVER=airplane-${VANILLA_VERSION}-jdk${JAVA_VER}.jar + +if [ ! -f "$SERVER" ] || [ -n "$FORCE_REDOWNLOAD" ]; then + downloadUrl="https://dl.airplane.gg/latest/Airplane-JDK${JAVA_VER}/launcher-airplane.jar" + log "Downloading Airplane from $downloadUrl ..." + curl -fsSL -o "$SERVER" "$downloadUrl" + if [ ! -f "$SERVER" ]; then + log "ERROR: failed to download from $downloadUrl (status=$?)" + exit 3 + fi +fi + +# Normalize on Spigot for later operations +export TYPE=SPIGOT +export SKIP_LOG4J_CONFIG=true + +# Continue to Final Setup +exec ${SCRIPTS:-/}start-finalSetupWorld $@ diff --git a/start-minecraftFinalSetup b/start-minecraftFinalSetup index 3777dd31..5c5d8647 100644 --- a/start-minecraftFinalSetup +++ b/start-minecraftFinalSetup @@ -38,16 +38,16 @@ if [ -n "$ICON" ]; then fi fi -if ! isTrue ${SKIP_LOG4J_CONFIG}; then -# Set up log configuration -LOGFILE="/data/log4j2.xml" -if [ ! -e "$LOGFILE" ]; then - log "Creating log4j2.xml in ${LOGFILE}" - cp /tmp/log4j2.xml "$LOGFILE" -else - log "log4j2.xml already created, skipping" -fi -JVM_OPTS="-Dlog4j.configurationFile=/data/log4j2.xml ${JVM_OPTS}" +if isTrue ${ENABLE_ROLLING_LOGS:-false}; then + # Set up log configuration + LOGFILE="/data/log4j2.xml" + if [ ! -e "$LOGFILE" ]; then + log "Creating log4j2.xml in ${LOGFILE}" + cp /tmp/log4j2.xml "$LOGFILE" + else + log "log4j2.xml already created, skipping" + fi + JVM_OPTS="-Dlog4j.configurationFile=/data/log4j2.xml ${JVM_OPTS}" fi # Make sure files exist and are valid JSON (for pre-1.12 to 1.12 upgrades) @@ -217,10 +217,19 @@ EOF cd "${FTB_DIR}" log "Running FTB ${FTB_SERVER_START} in ${FTB_DIR} ..." + + finalArgs=( + "${FTB_SERVER_START}" + ) + if isTrue ${DEBUG_EXEC}; then set -x fi - exec mc-server-runner ${mcServerRunnerArgs} "${FTB_SERVER_START}" + if isTrue ${EXEC_DIRECTLY:-false}; then + "${finalArgs[@]}" + else + exec mc-server-runner ${mcServerRunnerArgs} "${finalArgs[@]}" + fi else # If we have a bootstrap.txt file... feed that in to the server stdin if [ -f /data/bootstrap.txt ]; then @@ -228,8 +237,22 @@ else fi log "Starting the Minecraft server..." + + finalArgs=( + $JVM_XX_OPTS + $JVM_OPTS + $expandedDOpts + -jar $SERVER + "$@" $EXTRA_ARGS + ) + if isTrue ${DEBUG_EXEC}; then set -x fi - exec mc-server-runner ${bootstrapArgs} ${mcServerRunnerArgs} java $JVM_XX_OPTS $JVM_OPTS $expandedDOpts -jar $SERVER "$@" $EXTRA_ARGS + + if isTrue ${EXEC_DIRECTLY:-false}; then + exec java "${finalArgs[@]}" + else + exec mc-server-runner ${bootstrapArgs} ${mcServerRunnerArgs} java "${finalArgs[@]}" + fi fi