/ minecraft / Dockerfile
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"]