├── .gitignore ├── README.md ├── Dockerfile └── Makefile /.gitignore: -------------------------------------------------------------------------------- 1 | data/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Minecraft (Java) Server 2 | 3 | This is a dockerized version of the Minecraft (Java) Server for easy usage on Linux, MacOs or Windows. 4 | 5 | 6 | **Please note: This server setup is only compatible with Minecraft: Java Edition.** 7 | 8 | 9 | ## Build the server 10 | 11 | Build the default version 12 | ```bash 13 | make build 14 | ``` 15 | 16 | Build a specific version 17 | ```bash 18 | make build SERVER_VERSION=1.14.4 19 | ``` 20 | 21 | 22 | ## Start the server 23 | 24 | Start normally 25 | ```bash 26 | # Note, you must explicitly accept the EULA via the below shown argument 27 | make run ACCEPT_EULA=true 28 | ``` 29 | 30 | Adjust the listening port 31 | ```bash 32 | make run ACCEPT_EULA=true PORT=64000 33 | ``` 34 | 35 | Adjust Java XMX memory settings 36 | ```bash 37 | make run ACCEPT_EULA=true JAVA_XMX=1024M 38 | ``` 39 | 40 | 41 | ## Further reading 42 | 43 | https://www.minecraft.net/en-us/download/server/ 44 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG JAVA_VERSION=14 2 | # ------------------------------------------------------------------------------------------------- 3 | # Builder Docker image 4 | # ------------------------------------------------------------------------------------------------- 5 | FROM openjdk:${JAVA_VERSION}-alpine as builder 6 | ARG SERVER_VERSION=1.14 7 | 8 | ### 9 | ### Install Server 10 | ### 11 | RUN set -eux \ 12 | && apk add --no-cache curl \ 13 | && curl -L -o /usr/local/bin/server-${SERVER_VERSION}.jar \ 14 | 'https://launcher.mojang.com/v1/objects/f1a0073671057f01aa843443fef34330281333ce/server.jar' 15 | 16 | ### 17 | ### Create startup script 18 | ### 19 | RUN set -eux \ 20 | && ( \ 21 | echo '#!/bin/sh'; \ 22 | echo; \ 23 | echo 'echo "eula=${ACCEPT_EULA}" > "/data/eula.txt"'; \ 24 | echo; \ 25 | echo 'if [ ! -f "/data/server.properties" ]; then '; \ 26 | echo ' echo "online-mode=false" > "/data/server.properties"'; \ 27 | echo 'fi'; \ 28 | echo; \ 29 | echo 'exec java -Xmx${JAVA_XMX} -jar /usr/local/bin/server-${SERVER_VERSION}.jar --port ${PORT} nogui'; \ 30 | ) > /docker-start.sh \ 31 | && chmod +x /docker-start.sh 32 | 33 | 34 | # ------------------------------------------------------------------------------------------------- 35 | # Final Docker image 36 | # ------------------------------------------------------------------------------------------------- 37 | FROM openjdk:${JAVA_VERSION}-alpine as production 38 | ARG SERVER_VERSION=1.14 39 | 40 | ### 41 | ### Copy from builder 42 | ### 43 | COPY --from=builder /usr/local/bin/server-${SERVER_VERSION}.jar /usr/local/bin/server-${SERVER_VERSION}.jar 44 | COPY --from=builder /docker-start.sh /docker-start.sh 45 | 46 | ### 47 | ### Server default settings 48 | ### 49 | ENV SERVER_VERSION=${SERVER_VERSION} 50 | ENV PORT=25565 51 | ENV JAVA_XMX=4096M 52 | 53 | ### 54 | ### Persistant data 55 | ### 56 | VOLUME ["/data"] 57 | 58 | ### 59 | ### Startup 60 | ### 61 | WORKDIR /data 62 | CMD ["/docker-start.sh"] 63 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ifneq (,) 2 | .error This Makefile requires GNU Make. 3 | endif 4 | 5 | # ------------------------------------------------------------------------------------------------- 6 | # Default configuration 7 | # ------------------------------------------------------------------------------------------------- 8 | .PHONY: help build run enter exec _accept_eula $(DATA_DIR) 9 | 10 | 11 | # ------------------------------------------------------------------------------------------------- 12 | # Server Variables 13 | # ------------------------------------------------------------------------------------------------- 14 | 15 | # Build args 16 | IMAGE = cytopia/minecraft-server 17 | JAVA_VERSION = 14 18 | SERVER_VERSION = 1.14 19 | 20 | # Runtime args 21 | JAVA_XMX = 4096M 22 | PORT = 25565 23 | DATA_DIR = data 24 | CONT_NAME = $(subst /,-, $(IMAGE))-$(SERVER_VERSION) 25 | 26 | 27 | # ------------------------------------------------------------------------------------------------- 28 | # Default Target 29 | # ------------------------------------------------------------------------------------------------- 30 | help: 31 | @echo 32 | @echo "Minecraft Server Makefile" 33 | @echo 34 | @echo "Targets:" 35 | @echo "----------------------------------------------------------------------------------------" 36 | @echo "build Build the Docker image." 37 | @echo "run ACCEPT_EULA=true Accept EULA and start the server." 38 | @echo "enter Start the container and launch a shell instead of the server." 39 | @echo "exec Enter running container with a shell." 40 | @echo 41 | @echo "Additional run args:" 42 | @echo "----------------------------------------------------------------------------------------" 43 | @echo "JAVA_XMX Defaults to JAVA_XMX=4096M" 44 | @echo "PORT Defaults to PORT=25565" 45 | @echo "DATA_DIR Defaults to DATA_DIR=data" 46 | 47 | 48 | # ------------------------------------------------------------------------------------------------- 49 | # Main Targets 50 | # ------------------------------------------------------------------------------------------------- 51 | build: 52 | docker build \ 53 | --build-arg JAVA_VERSION=$(JAVA_VERSION) \ 54 | --build-arg SERVER_VERSION=$(SERVER_VERSION) \ 55 | -t $(IMAGE):$(SERVER_VERSION) \ 56 | -f Dockerfile . 57 | 58 | run: $(DATA_DIR) _accept_eula 59 | docker run --rm $$(tty -s && echo "-it" || echo) \ 60 | --name $(CONT_NAME) \ 61 | -v "$(PWD)/$(DATA_DIR)/$(SERVER_VERSION)":/data \ 62 | -p $(PORT):$(PORT)/tcp \ 63 | -p $(PORT):$(PORT)/udp \ 64 | -e PORT=$(PORT) \ 65 | -e JAVA_XMX=$(JAVA_XMX) \ 66 | -e ACCEPT_EULA=$(ACCEPT_EULA) \ 67 | $(IMAGE):$(SERVER_VERSION) \ 68 | $(ARGS) 69 | 70 | enter: $(DATA_DIR) 71 | docker run --rm -it \ 72 | --name $(CONT_NAME) \ 73 | -v "$(PWD)/$(DATA_DIR)/$(SERVER_VERSION)":/data \ 74 | -p $(PORT):$(PORT)/tcp \ 75 | -p $(PORT):$(PORT)/udp \ 76 | -e PORT=$(PORT) \ 77 | -e JAVA_XMX=$(JAVA_XMX) \ 78 | -e ACCEPT_EULA=$(ACCEPT_EULA) \ 79 | $(IMAGE):$(SERVER_VERSION) \ 80 | sh 81 | 82 | exec: 83 | docker exec -it $(CONT_NAME) sh 84 | 85 | 86 | # ------------------------------------------------------------------------------------------------- 87 | # Helper Targets 88 | # ------------------------------------------------------------------------------------------------- 89 | _accept_eula: 90 | ifneq ($(ACCEPT_EULA),true) 91 | $(error You must specify ACCEPT_EULA=true in order to accept the eula) 92 | endif 93 | 94 | # Ensure the data dir exists 95 | $(DATA_DIR): 96 | mkdir -p "$(DATA_DIR)/$(SERVER_VERSION)" 97 | --------------------------------------------------------------------------------