13 Commits

6 changed files with 73 additions and 51 deletions

View File

@@ -3,3 +3,4 @@
.gitignore
.gitlab-ci.yml
README.md
build.sh

View File

@@ -10,14 +10,13 @@ variables:
CI_PROJECT_NAME: minecraft-forge
stages:
- build
# - test
- push
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
@@ -25,43 +24,4 @@ after_script:
Build:
stage: build
script:
- docker pull $CI_HUB_USERNAME/$CI_PROJECT_NAME:latest || true
- docker buildx create --use
- >
docker buildx build
--pull
--platform linux/amd64
--cache-from $CI_HUB_USERNAME/$CI_PROJECT_NAME:latest
--tag $CI_HUB_USERNAME/$CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA
--push
.
- docker images
# PUSH
Push_When_Tag:
stage: push
only:
- tags
script:
- docker pull $CI_HUB_USERNAME/$CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA
- >
docker tag
$CI_HUB_USERNAME/$CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA
$CI_HUB_USERNAME/$CI_PROJECT_NAME:$CI_COMMIT_REF_NAME
- >
docker tag
$CI_HUB_USERNAME/$CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA
$CI_HUB_USERNAME/$CI_PROJECT_NAME:latest
- docker images
- docker push $CI_HUB_USERNAME/$CI_PROJECT_NAME:$CI_COMMIT_REF_NAME
- docker push $CI_HUB_USERNAME/$CI_PROJECT_NAME:latest
Push_Bleeding:
stage: push
script:
- docker pull $CI_HUB_USERNAME/$CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA
- >
docker tag
$CI_HUB_USERNAME/$CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA
$CI_HUB_USERNAME/$CI_PROJECT_NAME:bleeding
- docker images
- docker push $CI_HUB_USERNAME/$CI_PROJECT_NAME:bleeding
- bash build.sh

View File

@@ -3,12 +3,12 @@ FROM alpine:latest AS build
# Args
ARG MINECRAFT_VERSION="1.16.5"
ARG FORGE_VERSION="36.1.4"
ARG FORGE_VERSION="36.2.22"
# The actual setup work
COPY start-server.sh /minecraft/start-server.sh
WORKDIR /minecraft
RUN apk add curl openjdk8-jre &&\
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 &&\
@@ -16,8 +16,8 @@ RUN apk add curl openjdk8-jre &&\
ln -s "forge-${MINECRAFT_VERSION}-${FORGE_VERSION}.jar" server.jar
# The second stage is the actual container
FROM openjdk:8
RUN apt-get update && apt-get install rsync -y
FROM openjdk:11
RUN apt-get update && apt-get install rsync screen -y
WORKDIR /minecraft
COPY --from=build /minecraft .
CMD [ "bash", "start-server.sh" ]

View File

@@ -7,10 +7,20 @@ A Dockerfile and some assorted scripts to build a Minecraft Forge server contain
Deploy as expected:
```bash
docker run -p 25565:25565 rehashedsalt/minecraft-forge
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 latest stable is.
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
@@ -29,6 +39,7 @@ 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

31
build.sh Executable file
View 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

View File

@@ -1,4 +1,4 @@
#! /bin/sh
#! /bin/bash
#
# start-server.sh
# Copyright (C) 2021 Vintage Salt <rehashedsalt@cock.li>
@@ -16,7 +16,18 @@ if [ -n "$FORGE_PACK_ZIP" ]; then
unzip pack.zip
directory="$(find . -type d -iname "mods" -execdir pwd \; | sort -n | head -n 1)"
echo "Found modpack directory: $directory"
rsync -av "$directory"/ /minecraft/
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
@@ -31,7 +42,15 @@ args="-jar server.jar nogui"
# 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
java $args
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