Merge pull request #299 from Silthus/master

feat(minecraft-server): replace environment variables in configs
This commit is contained in:
Geoff Bourne
2019-03-29 20:07:08 -05:00
committed by GitHub
31 changed files with 110 additions and 15 deletions

0
build Executable file → Normal file
View File

0
elasticsearch/Dockerfile Executable file → Normal file
View File

0
elasticsearch/README.md Executable file → Normal file
View File

0
elasticsearch/start Executable file → Normal file
View File

0
gitblit/start.sh Executable file → Normal file
View File

0
jekyll-github-pages/start.sh Executable file → Normal file
View File

0
jenkins/download-and-start.sh Executable file → Normal file
View File

0
kibana/Dockerfile Executable file → Normal file
View File

0
kibana/start.sh Executable file → Normal file
View File

0
logstash/Dockerfile Executable file → Normal file
View File

View File

@@ -3,19 +3,19 @@ FROM openjdk:8u171-jre-alpine
LABEL maintainer "itzg"
RUN apk add --no-cache -U \
openssl \
imagemagick \
lsof \
su-exec \
shadow \
bash \
curl iputils wget \
git \
jq \
mysql-client \
tzdata \
rsync \
python python-dev py2-pip
openssl \
imagemagick \
lsof \
su-exec \
shadow \
bash \
curl iputils wget \
git \
jq \
mysql-client \
tzdata \
rsync \
python python-dev py2-pip
RUN pip install mcstatus
@@ -71,7 +71,8 @@ ENV UID=1000 GID=1000 \
JVM_XX_OPTS="-XX:+UseG1GC" MEMORY="1G" \
TYPE=VANILLA VERSION=LATEST FORGEVERSION=RECOMMENDED SPONGEBRANCH=STABLE SPONGEVERSION= LEVEL=world \
PVP=true DIFFICULTY=easy ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
LEVEL_TYPE=DEFAULT GENERATOR_SETTINGS= WORLD= MODPACK= MODS= SERVER_PORT=25565 ONLINE_MODE=TRUE CONSOLE=true SERVER_NAME="Dedicated Server"
LEVEL_TYPE=DEFAULT GENERATOR_SETTINGS= WORLD= MODPACK= MODS= SERVER_PORT=25565 ONLINE_MODE=TRUE CONSOLE=true SERVER_NAME="Dedicated Server" \
REPLACE_ENV_VARIABLES="FALSE" ENV_VARIABLE_PREFIX="CFG_"
COPY start* /
RUN dos2unix /start* && chmod +x /start*

View File

@@ -202,6 +202,85 @@ 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.
### Replacing variables inside configs
Sometimes you have mods or plugins that require configuration information that is only available at runtime.
For example if you need to configure a plugin to connect to a database,
you don't want to include this information in your Git repository or Docker image.
Or maybe you have some runtime information like the server name that needs to be set
in your config files after the container starts.
For those cases there is the option to replace defined variables inside your configs
with environment variables defined at container runtime.
If you set the enviroment variable `REPLACE_ENV_VARIABLES` to `TRUE` the startup script
will go thru all files inside your `/data` volume and replace variables that match your
defined environment variables. Variables that you want to replace need to be wrapped
inside `${YOUR_VARIABLE}` curly brackets and prefixed with a dollar sign. This is the regular
syntax for enviromment variables inside strings or config files.
Optionally you can also define a prefix to only match predefined enviroment variables.
`ENV_VARIABLE_PREFIX="CFG_"` <-- this is the default prefix
There are some limitations to what characters you can use.
| Type | Allowed Characters |
| ----- | ------------------- |
| Name | `0-9a-zA-Z_-` |
| Value | `0-9a-zA-Z_-:/=?.+` |
Here is a full example where we want to replace values inside a `database.yml`.
```yml
...
database:
host: ${CFG_DB_HOST}
name: ${CFG_DB_NAME}
password: ${CFG_DB_PASSWORD}
```
This is how your `docker-compose.yml` file could look like:
```yml
version: '3'
# Other docker-compose examples in /examples
services:
minecraft:
image: itzg/minecraft-server
ports:
- "25565:25565"
volumes:
- "mc:/data"
environment:
EULA: "TRUE"
CONSOLE: "false"
ENABLE_RCON: "true"
RCON_PASSWORD: "testing"
RCON_PORT: 28016
# enable env variable replacement
REPLACE_ENV_VARIABLES: "TRUE"
# define an optional prefix for your env variables you want to replace
ENV_VARIABLE_PREFIX: "CFG_"
# and here are the actual variables
CFG_DB_HOST: "http://localhost:3306"
CFG_DB_NAME: "minecraft"
CFG_DB_PASSWORD: "ug23u3bg39o-ogADSs"
restart: always
rcon:
image: itzg/rcon
ports:
- "4326:4326"
- "4327:4327"
volumes:
- "rcon:/opt/rcon-web-admin/db"
volumes:
mc:
rcon:
```
## 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.

0
minecraft-server/start Executable file → Normal file
View File

0
minecraft-server/start-configuration Executable file → Normal file
View File

0
minecraft-server/start-deployBukkitSpigot Executable file → Normal file
View File

0
minecraft-server/start-deployFTB Executable file → Normal file
View File

0
minecraft-server/start-deployForge Executable file → Normal file
View File

0
minecraft-server/start-deployPaper Executable file → Normal file
View File

0
minecraft-server/start-deploySpongeVanilla Executable file → Normal file
View File

0
minecraft-server/start-deployVanilla Executable file → Normal file
View File

0
minecraft-server/start-finalSetup01World Executable file → Normal file
View File

0
minecraft-server/start-finalSetup02Modpack Executable file → Normal file
View File

0
minecraft-server/start-finalSetup03Modconfig Executable file → Normal file
View File

2
minecraft-server/start-finalSetup04ServerProperties Executable file → Normal file
View File

@@ -132,4 +132,4 @@ else
echo "server.properties already created, skipping"
fi
exec /start-minecraftFinalSetup $@
exec /start-finalSetup05EnvVariables $@

View File

@@ -0,0 +1,15 @@
#!/bin/bash
if [ "$REPLACE_ENV_VARIABLES" = "TRUE" ]; then
echo "Replacing env variables in configs that match the prefix $ENV_VARIABLE_PREFIX..."
while IFS='=' read -r name value ; do
# check if name of env variable matches the prefix
# sanity check environment variables to avoid code injections
if [[ "$name" = $ENV_VARIABLE_PREFIX* ]] && [[ $value =~ ^[0-9a-zA-Z_:/=?.+\-]*$ ]] && [[ $name =~ ^[0-9a-zA-Z_\-]*$ ]]; then
echo "Replacing $name with $value ..."
find /data/ -type f \( -name "*.yml" -or -name "*.yaml" -or -name "*.txt" -or -name "*.cfg" -or -name "*.properties" \) -exec sed -i 's#${'"$name"'}#'"$value"'#g' {} \;
fi
done < <(env)
fi
exec /start-minecraftFinalSetup $@

0
minecraft-server/start-minecraftFinalSetup Executable file → Normal file
View File

0
titan-gremlin/Dockerfile Executable file → Normal file
View File

0
titan-gremlin/start-gremlin.sh Executable file → Normal file
View File

0
titandb/gremlin Executable file → Normal file
View File

0
titandb/rexster Executable file → Normal file
View File

0
ubuntu-openjdk-7/Dockerfile Executable file → Normal file
View File