Dockerfile
1 # syntax=docker/dockerfile:1 2 3 ### Builds the final Java runtime image 4 FROM docker.io/library/eclipse-temurin:21.0.7_6-jdk-alpine-3.21 AS builder_c 5 RUN apk add --no-cache binutils 6 # Build small JRE image 7 WORKDIR /artefacts 8 RUN $JAVA_HOME/bin/jlink \ 9 --verbose \ 10 #--add-modules ALL-MODULE-PATH \ 11 --add-modules java.base,java.desktop,java.instrument,java.management,java.net.http,java.sql,jdk.jfr,jdk.unsupported,jdk.zipfs,jdk.crypto.ec,java.compiler,jdk.httpserver,java.naming \ 12 --strip-debug \ 13 --no-man-pages \ 14 --no-header-files \ 15 --compress zip-9 \ 16 --output /artefacts/optimized-jdk-21 17 18 ### Downloads all selected mods and datapacks from Modrinth 19 FROM ghcr.io/nausicaea/nema:v0.4.0 AS downloader 20 ARG MINECRAFT_VERSION 21 ARG FABRIC_LOADER_VERSION 22 ARG FABRIC_LOADER_CHECKSUM 23 ARG FABRIC_INSTALLER_VERSION 24 ARG OTEL_JAVAAGENT_VERSION 25 ARG OTEL_JAVAAGENT_CHECKSUM 26 ARG OTEL_MOD_VERSION 27 ARG OTEL_MOD_CHECKSUM 28 ARG PARABURDOO_VERSION 29 ARG PARABURDOO_CHECKSUM 30 ADD --link --checksum=${FABRIC_LOADER_CHECKSUM} https://meta.fabricmc.net/v2/versions/loader/${MINECRAFT_VERSION}/${FABRIC_LOADER_VERSION}/${FABRIC_INSTALLER_VERSION}/server/jar /artefacts/lib/fabric-launcher.jar 31 ADD --link --checksum=${OTEL_JAVAAGENT_CHECKSUM} https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v${OTEL_JAVAAGENT_VERSION}/opentelemetry-javaagent.jar /artefacts/lib/opentelemetry-javaagent.jar 32 ADD --link --checksum=${OTEL_MOD_CHECKSUM} https://github.com/nausicaea/opentelemetry-fabric/releases/download/v${OTEL_MOD_VERSION}/otel-${OTEL_MOD_VERSION}.jar /artefacts/fabric/otel-${OTEL_MOD_VERSION}.jar 33 ADD --link --checksum=${PARABURDOO_CHECKSUM} https://github.com/nausicaea/paraburdoo/releases/download/v${PARABURDOO_VERSION}/paraburdoo-${PARABURDOO_VERSION}.jar /artefacts/fabric/paraburdoo-${PARABURDOO_VERSION}.jar 34 RUN --mount=type=secret,id=MODRINTH_PAT,env=MODRINTH_PAT --mount=type=bind,target=/tmp/Modrinth.toml,source=./Modrinth.toml --mount=type=bind,target=/tmp/Modrinth.lock,source=./Modrinth.lock <<-EOC 35 set -xe; 36 /usr/local/bin/nema -o /artefacts -s --lockfile /tmp/Modrinth.lock --manifest /tmp/Modrinth.toml; 37 EOC 38 39 ### Builds and runs the final image 40 FROM docker.io/library/alpine:3.22 41 LABEL org.opencontainers.image.title="Dvergr" 42 LABEL org.opencontainers.image.description="A Minecraft server with an opinionated set of mods" 43 LABEL org.opencontainers.image.authors="developer@nausicaea.net" 44 LABEL org.opencontainers.image.source="https://github.com/nausicaea/dvergr" 45 LABEL org.opencontainers.image.version="0.2.2+1-21-4" 46 LABEL org.opencontainers.image.licenses="GPL-3.0-only" 47 EXPOSE 25565/tcp 25565/udp 48 VOLUME ["/var/lib/minecraft/persistent", "/etc/minecraft", "/var/cache/minecraft", "/var/log/minecraft"] 49 ARG MINECRAFT_VERSION 50 ENV MINECRAFT_SERVER_ID=minecraft 51 ENV JAVA_INITIAL_MEM=256M 52 ENV JAVA_MAX_MEM=2G 53 ENV OPENTELEMETRY_AGENT=0 54 ENV MAINTENANCE_MODE=0 55 COPY --from=builder_c /artefacts/optimized-jdk-21 /opt/java/customjdk 56 RUN <<-EOC 57 set -xe; 58 addgroup -S -g 10001 minecraft; 59 adduser -S -u 10001 -G minecraft -h /var/lib/minecraft -g "Minecraft Server" -s /bin/sh minecraft; 60 EOC 61 COPY --link --chmod=0755 bin/docker-entrypoint.sh /usr/local/bin/docker-entrypoint 62 COPY --link --chmod=0755 bin/healthcheck.sh /usr/local/bin/healthcheck 63 COPY --link --from=downloader --chmod=0644 /artefacts/lib/*.jar /usr/local/lib/ 64 65 # Provision config files 66 WORKDIR /etc/minecraft 67 COPY --link --chown=10001:10001 config/ . 68 RUN <<-EOF 69 set -xe; 70 mkdir default; 71 chown -vR minecraft:minecraft .; 72 chmod -vR u=rwX,go=rX .; 73 EOF 74 75 # Provision the cache 76 WORKDIR /var/cache/minecraft 77 RUN <<-EOF 78 set -xe; 79 mkdir -v .cache .fabric .polydex cache libraries polymer stackdeobf_mappings versions; 80 chown -vR minecraft:minecraft .; 81 chmod -vR u=rwX,go=rX .; 82 EOF 83 84 # Provision logs 85 WORKDIR /var/log/minecraft 86 RUN <<-EOF 87 set -xe; 88 mkdir -v crash-reports; 89 chown -vR minecraft:minecraft .; 90 chmod -vR u=rwX,go=rX .; 91 EOF 92 93 # Provision the server home directory 94 WORKDIR /var/lib/minecraft 95 COPY --from=downloader --chown=10001:10001 /artefacts/fabric/*.jar ./mods/ 96 COPY --from=downloader --chown=10001:10001 /artefacts/datapack/*.zip ./persistent/universe/world/datapacks/ 97 RUN <<-EOF 98 set -xe; 99 # Create directories for volume mounts 100 mkdir -vp persistent/backups persistent/luckperms persistent/universe; 101 102 # Create symlinks for files and directories with hard-coded paths 103 # Persistent data (read-write) 104 ln -s /var/lib/minecraft/persistent/backups backups; 105 ln -s /var/lib/minecraft/persistent/luckperms mods/luckperms; 106 ln -s /var/lib/minecraft/persistent/universe universe; 107 # Configuration files (read-only) 108 ln -s /etc/minecraft/server/server-icon.png server-icon.png; 109 ln -s /etc/minecraft/server/eula.txt eula.txt; 110 ln -s /etc/minecraft/server/server.properties server.properties; 111 ln -s /etc/minecraft/player/whitelist.json whitelist.json; 112 ln -s /etc/minecraft/player/ops.json ops.json; 113 ln -s /etc/minecraft/player/banned-ips.json banned-ips.json; 114 ln -s /etc/minecraft/player/banned-players.json banned-players.json; 115 ln -s /etc/minecraft/mods config; 116 ln -s /etc/minecraft/default defaultconfigs; 117 # Caches (ephemeral) 118 ln -s /var/cache/minecraft/.cache ./.cache; 119 ln -s /var/cache/minecraft/.fabric ./.fabric; 120 ln -s /var/cache/minecraft/.polydex ./.polydex; 121 ln -s /var/cache/minecraft/cache ./cache; 122 ln -s /var/cache/minecraft/libraries ./libraries; 123 ln -s /var/cache/minecraft/polymer ./polymer; 124 ln -s /var/cache/minecraft/stackdeobf_mappings ./stackdeobf_mappings; 125 ln -s /var/cache/minecraft/versions ./versions; 126 # Logs (ephemeral) 127 ln -s /var/log/minecraft/crash-reports ./crash-reports; 128 129 # Fix ownership and permissions 130 chown -vR minecraft:minecraft .; 131 chmod -vR u=rwX,go=rX .; 132 EOF 133 134 USER minecraft:minecraft 135 ENTRYPOINT ["/usr/local/bin/docker-entrypoint"]