diff --git a/minecraft-server/Dockerfile b/minecraft-server/Dockerfile index 4120dd9b..e03f229d 100644 --- a/minecraft-server/Dockerfile +++ b/minecraft-server/Dockerfile @@ -14,7 +14,8 @@ RUN useradd -M -s /bin/false --uid 1000 minecraft \ && mkdir /data \ && mkdir /config \ && mkdir /mods \ - && chown minecraft:minecraft /data /config /mods + && mkdir /plugins + && chown minecraft:minecraft /data /config /mods /plugins EXPOSE 25565 @@ -24,6 +25,7 @@ COPY start-minecraft.sh /start-minecraft VOLUME ["/data"] VOLUME ["/mods"] VOLUME ["/config"] +VOLUME ["/plugins"] COPY server.properties /tmp/server.properties WORKDIR /data diff --git a/minecraft-server/README.md b/minecraft-server/README.md index bc80e7f6..3d6763e2 100644 --- a/minecraft-server/README.md +++ b/minecraft-server/README.md @@ -146,6 +146,57 @@ This works well if you want to have a common set of modules in a separate location, but still have multiple worlds with different server requirements in either persistent volumes or a downloadable archive. +## Running a Bukkit/Spigot server + +Enable Bukkit/Spigot server mode by adding a `-e TYPE=BUKKIT -e VERSION=1.8` or `-e TYPE=SPIGOT -e VERSION=1.8` to your command-line. + +The VERSION option should be set to 1.8, as this is the only version of CraftBukkit and Spigot currently +available. The latest build in this branch will be used. + + $ docker run -d -v /path/on/host:/data \ + -e TYPE=SPIGOT -e VERSION=1.8 \ + -p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server + +You can install Bukkit plugins in two ways. + +### Using the /data volume + +This is the easiest way if you are using a persistent `/data` mount. + +To do this, you will need to attach the container's `/data` directory +(see "Attaching data directory to host filesystem”). +Then, you can add plugins to the `/path/on/host/plugins` folder you chose. From the example above, +the `/path/on/host` folder contents look like: + +``` +/path/on/host +├── plugins +│   └── ... INSTALL PLUGINS HERE ... +├── ops.json +├── server.properties +├── whitelist.json +└── ... +``` + +If you add plugins while the container is running, you'll need to restart it to pick those +up: + + docker stop mc + docker start mc + +### Using separate mounts + +This is the easiest way if you are using an ephemeral `/data` filesystem, +or downloading a world with the `WORLD` option. + +There is one additional volume that can be mounted; `/plugins`. +Any files in this filesystem will be copied over to the main +`/data/plugins` filesystem before starting Minecraft. + +This works well if you want to have a common set of plugins in a separate +location, but still have multiple worlds with different server requirements +in either persistent volumes or a downloadable archive. + ## Using Docker Compose Rather than type the server options below, the port mappings above, etc diff --git a/minecraft-server/start-minecraft.sh b/minecraft-server/start-minecraft.sh index d7738344..05ecfabb 100755 --- a/minecraft-server/start-minecraft.sh +++ b/minecraft-server/start-minecraft.sh @@ -33,19 +33,35 @@ esac cd /data -echo "Checking minecraft / forge type information." +echo "Checking type information." case "$TYPE" in - VANILLA) - SERVER="minecraft_server.$VANILLA_VERSION.jar" + *BUKKIT|*bukkit|SPIGOT|spigot) + TYPE=SPIGOT + case "$TYPE" in + *BUKKIT|*bukkit) + echo "Downloading latest CraftBukkit 1.8 server ..." + SERVER=craftbukkit_server.jar + ;; + *) + echo "Downloading latest Spigot 1.8 server ..." + SERVER=spigot_server.jar + ;; + esac + case $VANILLA_VERSION in + 1.8*) + URL=/spigot18/$SERVER + ;; + *) + echo "That version of $SERVER is not available." + exit 1 + ;; + esac + wget -q https://getspigot.org$URL + ;; - if [ ! -e $SERVER ]; then - echo "Downloading $SERVER ..." - wget -q https://s3.amazonaws.com/Minecraft.Download/versions/$VANILLA_VERSION/$SERVER - fi - ;; - - FORGE) + FORGE|forge) # norm := the official Minecraft version as Forge is tracking it. dropped the third part starting with 1.8 + TYPE=FORGE case $VANILLA_VERSION in 1.7.*) norm=$VANILLA_VERSION @@ -56,16 +72,16 @@ case "$TYPE" in ;; esac - echo "Checking Forge version information." - case $FORGEVERSION in - RECOMMENDED) + echo "Checking Forge version information." + case $FORGEVERSION in + RECOMMENDED) FORGE_VERSION=`wget -O - http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json | jsawk -n "out(this.promos['$norm-recommended'])"` - ;; + ;; - *) + *) FORGE_VERSION=$FORGEVERSION - ;; - esac + ;; + esac # URL format changed for 1.7.10 from 10.13.2.1300 sorted=$((echo $FORGE_VERSION; echo 10.13.2.1300) | sort -V | head -1) @@ -87,12 +103,27 @@ case "$TYPE" in fi ;; + VANILLA|vanilla) + SERVER="minecraft_server.$VANILLA_VERSION.jar" + + if [ ! -e $SERVER ]; then + echo "Downloading $SERVER ..." + wget -q https://s3.amazonaws.com/Minecraft.Download/versions/$VANILLA_VERSION/$SERVER + fi + ;; + + *) + echo "Invalid type: '$TYPE'" + echo "Must be: VANILLA, FORGE, SPIGOT" + exit 1 + ;; + esac # If supplied with a URL for a world, download it and unpack if [[ "$WORLD" ]]; then case "X$WORLD" in - X[Hh][Tt][Tt][Pp]*[Zz][iI][pP]) + X[Hh][Tt][Tt][Pp]*) echo "Downloading world via HTTP" echo "$WORLD" wget -q -O - "$WORLD" > /data/world.zip @@ -109,6 +140,12 @@ case "X$WORLD" in fi done fi + if [ "$TYPE" = "SPIGOT" ]; then + # Reorganise if a Spigot server + echo "Moving End and Nether maps to Spigot location" + [ -d "/data/world/DIM1" ] && mv -f "/data/world/DIM1" "/data/world_the_end" + [ -d "/data/world/DIM-1" ] && mv -f "/data/world/DIM-1" "/data/world_nether" + fi ;; *) echo "Invalid URL given for world: Must be HTTP or HTTPS and a ZIP file" @@ -271,6 +308,11 @@ do cp -rf "$c" /data/config fi done - +if [ "$TYPE" = "SPIGOT" ]; then + echo Copying any Bukkit plugins over + if [ -d /plugins ]; then + cp -r /plugins /data + fi +fi exec java $JVM_OPTS -jar $SERVER