#!/bin/bash # Enable debug mode DEBUG="${DEBUG:-false}" if [ "$DEBUG" = "true" ]; then echo "[DEBUG] Running entrypoint script at $(which entrypoint.sh)" sleep 0.2 set -ux fi # Settings FILE="${FILE:-/app/server.properties}" EULAFILE="${EULAFILE:-/app/eula.txt}" PREFIX="${PREFIX:-SETTINGS_}" JVM_OPTS="${JVM_OPTS:--Xms1G -Xmx2G}" # Set EULA sed -i.bak "s/^eula=.*\$/eula=${EULA:-false}/" "$EULAFILE" diff --unified=1 "${EULAFILE}.bak" "$EULAFILE" rm "${EULAFILE}.bak" # Update server.properties using env while IFS='=' read -r ENVVAR VALUE ; do if echo "$ENVVAR" | grep -q "^${PREFIX}.*$"; then KEY="${ENVVAR#"$PREFIX"}" if ! grep -q "^${KEY}=" "$FILE"; then echo "[WARN]: \"$KEY\" does not exist in $FILE and was not updated" else [ "$DEBUG" = "true" ] && echo "[DEBUG] Updating \"$KEY\" to \"$VALUE\"" sed -i.bak "s/^${KEY}=.*/${KEY}=${VALUE}/" "$FILE" diff --unified=1 "${FILE}.bak" "$FILE" rm "${FILE}.bak" fi else [ "$DEBUG" = "true" ] && \ echo "[DEBUG] \"$ENVVAR\" doesn't have the prefix \"$PREFIX\"" fi done < <(env) # Show server.properties in DEBUG mode if [ "$DEBUG" = "true" ]; then echo "[DEBUG] Showing ${FILE}:" cat "$FILE" fi # Pre-create the screen log touch screenlog.0 # Set up a SIGTERM signal trap trap 'kill ${TAIL_PID}' SIGTERM # Run server in screen (without attaching) /usr/bin/screen -dmS minecraft -L \ bash -c " sleep 0.5 [ $DEBUG = true ] && echo '[DEBUG] Starting server' /usr/bin/java $JVM_OPTS -jar server.jar --nogui " # Get screen PID SCREEN_PID="$( screen -ls | grep -oE '[0-9]+\.minecraft' | cut -d. -f1 )" # Check screen PID if ! ps -p "$SCREEN_PID" > /dev/null; then echo "[ERROR] Could not obtain screen PID: \"$SCREEN_PID\"" screen -ls echo now testing: screen -ls | grep -oE '[0-9]+\.minecraft' | cut -d. -f1 exit 1 fi # Tail screen log to container stdout [ "$DEBUG" = "true" ] && echo "[DEBUG] Tailing screenlog.0" tail -f screenlog.0 & TAIL_PID=$! wait "$TAIL_PID" if screen -ls | grep -q minecraft; then echo "[INFO] Stopping minecraft" /usr/bin/screen -p 0 -S minecraft -X eval 'stuff "stop"\015' else echo "[WARN]: 'minecraft' screen not found attempting to stop server" return 1 fi wait "$SCREEN_PID"