Compare commits
15 Commits
690301722c
...
openjdk11
Author | SHA1 | Date | |
---|---|---|---|
b4fc6a2654 | |||
7879f3b5e4 | |||
2e03a1faf8 | |||
bd2041a886 | |||
2fba83fd15 | |||
c50a4b4176 | |||
60943d2f82 | |||
c7328f43c2 | |||
0dd98315e5 | |||
5be6e30444 | |||
ed6fc1af16 | |||
df3c6166ac | |||
7bd0953dad | |||
8a78fd604a | |||
7a6404b861 |
6
.dockerignore
Normal file
6
.dockerignore
Normal file
@@ -0,0 +1,6 @@
|
||||
*.swp
|
||||
.git
|
||||
.gitignore
|
||||
.gitlab-ci.yml
|
||||
README.md
|
||||
build.sh
|
27
.gitlab-ci.yml
Normal file
27
.gitlab-ci.yml
Normal file
@@ -0,0 +1,27 @@
|
||||
#
|
||||
# This guy is awesome: https://dev.to/bzinoun/gitlab-ci-to-build-and-push-containers-to-registry-538a
|
||||
#
|
||||
|
||||
image: morlay/buildx:607a2ce
|
||||
variables:
|
||||
# DinD's vfs driver is pretty intensive; this is less so
|
||||
DOCKER_DRIVER: overlay2
|
||||
CI_HUB_USERNAME: rehashedsalt
|
||||
CI_PROJECT_NAME: minecraft-forge
|
||||
stages:
|
||||
- build
|
||||
services:
|
||||
- docker:dind
|
||||
before_script:
|
||||
- echo -n "$CI_LOGIN_PASSWORD" | docker login -u "$CI_LOGIN_USERNAME" --password-stdin
|
||||
- docker version
|
||||
- docker info
|
||||
- apk add bash
|
||||
after_script:
|
||||
- docker logout hub.docker.com
|
||||
|
||||
# BUILD
|
||||
Build:
|
||||
stage: build
|
||||
script:
|
||||
- bash build.sh
|
24
Dockerfile
Normal file
24
Dockerfile
Normal file
@@ -0,0 +1,24 @@
|
||||
# The first stage just builds up the modpack
|
||||
FROM alpine:latest AS build
|
||||
|
||||
# Args
|
||||
ARG MINECRAFT_VERSION="1.16.5"
|
||||
ARG FORGE_VERSION="36.2.22"
|
||||
|
||||
# The actual setup work
|
||||
COPY start-server.sh /minecraft/start-server.sh
|
||||
WORKDIR /minecraft
|
||||
RUN apk add curl openjdk11-jre &&\
|
||||
curl -L "https://files.minecraftforge.net/maven/net/minecraftforge/forge/${MINECRAFT_VERSION}-${FORGE_VERSION}/forge-${MINECRAFT_VERSION}-${FORGE_VERSION}-installer.jar" -o installer.jar &&\
|
||||
java -jar installer.jar --installServer &&\
|
||||
echo "eula=true" > eula.txt &&\
|
||||
rm installer.jar installer.jar.log && \
|
||||
ln -s "forge-${MINECRAFT_VERSION}-${FORGE_VERSION}.jar" server.jar
|
||||
|
||||
# The second stage is the actual container
|
||||
FROM openjdk:11
|
||||
RUN apt-get update && apt-get install rsync screen -y
|
||||
WORKDIR /minecraft
|
||||
COPY --from=build /minecraft .
|
||||
CMD [ "bash", "start-server.sh" ]
|
||||
EXPOSE 25565
|
72
README.md
Normal file
72
README.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# docker-minecraft
|
||||
|
||||
A Dockerfile and some assorted scripts to build a Minecraft Forge server container.
|
||||
|
||||
## Usage
|
||||
|
||||
Deploy as expected:
|
||||
|
||||
```bash
|
||||
docker run -p 25565:25565 rehashedsalt/minecraft-forge:1.16.5-36.1.4-1.0.0
|
||||
```
|
||||
|
||||
And badda bing, badda boom, you'll have a Minecraft Forge server of whatever the tag is.
|
||||
|
||||
The "latest" tag of each version of Minecraft is somewhere along the lines of "1.16.5-36.1.14-master". See Dockerhub for more info.
|
||||
|
||||
## Server Console
|
||||
|
||||
You can access the server console in a screen session pretty easily:
|
||||
|
||||
```bash
|
||||
docker exec -it mycontainer screen -r minecraft
|
||||
```
|
||||
|
||||
## Application State
|
||||
|
||||
For obvious reasons, you'll want to consult the documentation of any mods you have installed, but a majority of application state lives here-ish:
|
||||
|
||||
* `/minecraft/world`
|
||||
|
||||
* `/minecraft/ops.json`, `whitelist.json`, `banned-ips.json`, `banned-players.json`, etc.
|
||||
|
||||
* `/minecraft/logs`
|
||||
|
||||
## Environment Variables
|
||||
|
||||
variable|description
|
||||
---|---
|
||||
`JRE_XMX`|Maximum amount of heap passed to the main Minecraft process
|
||||
`JRE_XMS`|Minimum heap size passed to the main Minecraft process
|
||||
`FORGE_PACK_ZIP`|If provided, the URL to a zip or tar.gz file that contains the modpack that needs to be installed. Will be intelligently extracted into the server directory through the magic of `find`.
|
||||
`CONFIG_REPO`|If provided, the URI to a git repository that contains configuration to copy over top the pack. The root of the repo will be the root of the server directory.
|
||||
`ARGS`|Any additional arguments to be passed to the JVM
|
||||
|
||||
## Useful Arguments
|
||||
|
||||
The following arguments may be useful to pass through `$ARGS` from time to time:
|
||||
|
||||
* `-Dfml.queryResult=confirm` - Useful when confirming through world corruption
|
||||
|
||||
## Weird Defaults
|
||||
|
||||
The default `server.properties` contains the following changes to better facilitate usage in a modded environment:
|
||||
|
||||
```
|
||||
allow-flight=true
|
||||
difficulty=hard
|
||||
enable-command-block=true
|
||||
spawn-protection=0
|
||||
```
|
||||
|
||||
## FAQ
|
||||
|
||||
**Why do you download the pack at runtime?**
|
||||
|
||||
It allows for transparent upgrades without having to build a whole new container. You may lose container consistency, but you gain simplicity in definition.
|
||||
|
||||
Of course, nothing prevents you from just not using this magic variable and instead `FROM`ing this container and building your own pack.
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
31
build.sh
Executable file
31
build.sh
Executable file
@@ -0,0 +1,31 @@
|
||||
#! /bin/bash
|
||||
#
|
||||
# Build the Docker image for a series of different Forge versions
|
||||
#
|
||||
|
||||
# MC version list
|
||||
declare -a mcversions=(
|
||||
"1.16.5"
|
||||
)
|
||||
|
||||
# Forge version dictionary (we only support one version per)
|
||||
declare -A forgeversions=(
|
||||
["1.16.5"]="36.2.22"
|
||||
)
|
||||
|
||||
# Build images
|
||||
docker buildx create --use
|
||||
for mc in ${mcversions[@]}; do
|
||||
forge="${forgeversions[$mc]}"
|
||||
echo "Building image for Minecraft $mc, Forge $forge, CI_COMMIT_REF_NAME of $CI_COMMIT_REF_NAME"
|
||||
# --no-cache is required for clean builds
|
||||
docker buildx build \
|
||||
--build-arg MINECRAFT_VERSION="$mc" \
|
||||
--build-arg FORGE_VERSION="$forge" \
|
||||
--no-cache \
|
||||
--platform linux/amd64 \
|
||||
--tag "$CI_HUB_USERNAME/$CI_PROJECT_NAME:$mc-$forge-${CI_COMMIT_REF_NAME:=bleeding}" \
|
||||
--push \
|
||||
.
|
||||
done
|
||||
docker images
|
52
server.properties
Normal file
52
server.properties
Normal file
@@ -0,0 +1,52 @@
|
||||
#Minecraft server properties
|
||||
#Fri Apr 09 16:05:21 CDT 2021
|
||||
allow-flight=true
|
||||
allow-nether=true
|
||||
broadcast-console-to-ops=true
|
||||
broadcast-rcon-to-ops=true
|
||||
difficulty=hard
|
||||
enable-command-block=true
|
||||
enable-jmx-monitoring=false
|
||||
enable-query=false
|
||||
enable-rcon=false
|
||||
enable-status=true
|
||||
enforce-whitelist=false
|
||||
entity-broadcast-range-percentage=100
|
||||
force-gamemode=false
|
||||
function-permission-level=2
|
||||
gamemode=survival
|
||||
generate-structures=true
|
||||
generator-settings=
|
||||
hardcore=false
|
||||
level-name=world
|
||||
level-seed=
|
||||
level-type=default
|
||||
max-build-height=256
|
||||
max-players=20
|
||||
max-tick-time=60000
|
||||
max-world-size=29999984
|
||||
motd=A Minecraft Server
|
||||
network-compression-threshold=256
|
||||
online-mode=true
|
||||
op-permission-level=4
|
||||
player-idle-timeout=0
|
||||
prevent-proxy-connections=false
|
||||
pvp=true
|
||||
query.port=25565
|
||||
rate-limit=0
|
||||
rcon.password=
|
||||
rcon.port=25575
|
||||
resource-pack=
|
||||
resource-pack-sha1=
|
||||
server-ip=
|
||||
server-port=25565
|
||||
snooper-enabled=true
|
||||
spawn-animals=true
|
||||
spawn-monsters=true
|
||||
spawn-npcs=true
|
||||
spawn-protection=0
|
||||
sync-chunk-writes=true
|
||||
text-filtering-config=
|
||||
use-native-transport=true
|
||||
view-distance=10
|
||||
white-list=false
|
56
start-server.sh
Executable file
56
start-server.sh
Executable file
@@ -0,0 +1,56 @@
|
||||
#! /bin/bash
|
||||
#
|
||||
# start-server.sh
|
||||
# Copyright (C) 2021 Vintage Salt <rehashedsalt@cock.li>
|
||||
#
|
||||
# Distributed under terms of the MIT license.
|
||||
#
|
||||
set -e
|
||||
|
||||
# Download and extract a pack zip, if one is provided
|
||||
if [ -n "$FORGE_PACK_ZIP" ]; then
|
||||
echo "Downloading pack: $FORGE_PACK_ZIP"
|
||||
tmpdir="$(mktemp -d)"
|
||||
pushd "$tmpdir" > /dev/null 2>&1
|
||||
curl -L "$FORGE_PACK_ZIP" -o pack.zip
|
||||
unzip pack.zip
|
||||
directory="$(find . -type d -iname "mods" -execdir pwd \; | sort -n | head -n 1)"
|
||||
echo "Found modpack directory: $directory"
|
||||
rsync -av --ignore-existing "$directory"/ /minecraft/
|
||||
popd > /dev/null 2>&1
|
||||
fi
|
||||
|
||||
# Then also download and extract a config repo, if one exists
|
||||
if [ -n "$CONFIG_REPO" ]; then
|
||||
echo "Downloading config repo: $CONFIG_REPO"
|
||||
tmpdir="$(mktemp -d)"
|
||||
pushd "$tmpdir" > /dev/null 2>&1
|
||||
git clone "$CONFIG_REPO" .
|
||||
rm -rf .git
|
||||
rsync -av --delete ./ /minecraft/
|
||||
popd > /dev/null 2>&1
|
||||
fi
|
||||
|
||||
# Entrypoint will be server.jar
|
||||
args="-jar server.jar nogui"
|
||||
|
||||
# Memory configuration
|
||||
[ -n "$JRE_XMX" ] && args="-Xmx$JRE_XMX $args"
|
||||
[ -n "$JRE_XMS" ] && args="-Xms$JRE_XMS $args"
|
||||
[ -n "$ARGS" ] && args="$ARGS $args"
|
||||
|
||||
# Debugging info
|
||||
java -version
|
||||
echo "Invoking java with args: $args"
|
||||
echo
|
||||
echo "To see the server console, execute this command in the container:"
|
||||
echo " screen -r minecraft"
|
||||
|
||||
# Start 'er up
|
||||
cleanup() {
|
||||
screen -p 0 -S minecraft -X stuff save-all^M
|
||||
screen -p 0 -S minecraft -X stuff stop^M
|
||||
}
|
||||
trap cleanup EXIT
|
||||
screen -DmS minecraft java $args
|
||||
|
Reference in New Issue
Block a user