Server and Docker are best friends now!
This mod makes dedicated server more friendly for docker usecases, allowing easily create isolated server setup within seconds without using bloated third-party images and pieces of software.
It can:
Note, entrypoint must exec java binary in order to handle signals properly and have nice graceful shutdown.
FROM eclipse-temurin:25-jre-alpine-3.23 AS server-build
RUN mkdir /server && apk update && apk add wget
WORKDIR /server
RUN wget -O /installer.jar https://maven.neoforged.net/releases/net/neoforged/neoforge/21.1.217/neoforge-21.1.217-installer.jar
RUN java -jar /installer.jar --installServer
RUN echo "eula=true" > eula.txt
FROM eclipse-temurin:25-jre-alpine-3.23
COPY --from=server-build /server /server
RUN cat <<'EOF' > /server/entrypoint.sh
#/usr/bin/env sh
set -e
USER_ID=${USER_ID:-1000}
GROUP_ID=${GROUP_ID:-1000}
USERNAME=${USERNAME:-appuser}
if ! getent group "$GROUP_ID" >/dev/null 2>&1; then
addgroup -g "$GROUP_ID" "$USERNAME"
fi
if ! id -u "$USER_ID" >/dev/null 2>&1; then
adduser -D -u "$USER_ID" -G "$USERNAME" -s /bin/bash "$USERNAME"
fi
echo "$SERVER_JAVA_OPTS" > user_jvm_args.txt
chown -R "$USER_ID":"$GROUP_ID" .
exec su-exec "$USERNAME" sh -c 'exec java @user_jvm_args.txt @libraries/net/neoforged/neoforge/21.1.217/unix_args.txt'
EOF
RUN chmod +x /server/entrypoint.sh
RUN apk add --no-cache su-exec
WORKDIR /server
CMD ["/server/entrypoint.sh"]
services:
minecraft-server:
build: ./container
container_name: minecraft-server
stdin_open: true
tty: true
ports:
- "25565:25565"
volumes:
- ./data/mods:/server/mods
- ./data/world:/server/world
environment:
SERVER_JAVA_OPTS: |2
-Xms2G
-Xmx10G
-XX:+UseZGC
-XX:+ZGenerational
-XX:+AlwaysPreTouch
-XX:+UseStringDeduplication
SERVER_OPERATORS: |2
op-player-uuid
another-op-player-uuid
SERVER_PROPERTIES: |2
max-players=20
motd=Welcome to the Minecraft Server!
online-mode=false
difficulty=normal
gamemode=survival
spawn-monsters=true
view-distance=10
white-list=false
pvp=true
generate-structures=true
max-world-size=29999984
enable-query=false
enable-rcon=false
enable-status=false
restart: unless-stopped
Conversation