Compare commits

...

60 Commits

Author SHA1 Message Date
Geoff Bourne
83f1398eb4 [es] Introduce 2.2.0 series 2016-12-28 13:57:38 -06:00
Geoff Bourne
21c9be4ec1 [es] upgrade to 2.3.0 and switch to Java 8 2016-04-01 21:54:54 -05:00
Geoff Bourne
786192e4b7 Added docker pulls badge with link to hub 2016-03-26 08:47:01 -05:00
Geoff Bourne
8610e7d621 Merge pull request #65 from jtcressy/master
[mc] resolved issues with downloading new server executable
2016-03-18 11:57:38 -05:00
jtcressy
a195583990 Cleaned Up Code per itzg's suggestion
Replaced hardcoded spigot_server.jar with $SERVER and broke up the line
to make it more readable.
2016-03-16 21:18:31 -06:00
jtcressy
a1ead0634e [mc] New method of downloading newer spigot server executable.
using double pipe "||", bash will continue to the next statement if the
first statement returns false or has an error. Using the -N option, wget
will overwrite the file if it is newer. So, if the -O option was used,
and both wget commands failed (both http and https were down) then wget
would overwrite the file with a 0 byte copy and effectively delete it.
-N works better in this case, since wget will not overwrite it with an
empty file if it can't download it.
2016-03-15 13:09:28 -06:00
jtcressy
b23fb93366 Undid method of pulling spigot_server.jar
rm -f $SERVER was a bad idea, as it deletes the server file regardless
of whether wget is able to download a new one. If you keep a copy of
spigot_server in the server directory, wget will fail if it's unable to
pull the file and it wont delete what you already have.
2016-03-15 01:05:37 -06:00
Geoff Bourne
68d731c096 [mc] Ensure a fresh Bukkit/Spigot jar is downloaded every time 2016-03-06 15:34:02 -06:00
Geoff Bourne
a4bd241be6 [mc] Adding Spigot/Bukkit 1.9 support
fixes #62
2016-03-04 22:13:02 -06:00
Geoff Bourne
5f104a32db [mc] Adding back text editors (vim and nano) 2016-03-03 22:32:22 -06:00
Geoff Bourne
03d9064b35 [mc] Putting back usermod solution 2016-02-27 17:10:11 -06:00
Geoff Bourne
b15ad9e799 Merge pull request #60 from itzg/mc/java8
Mc/java8
2016-02-21 20:02:37 -06:00
Geoff Bourne
17bfedd137 [cassandra] Upgrade to 2.2.5 2016-02-20 18:26:04 -06:00
Geoff Bourne
afa25e582d [mc] Upgrade base image to java:8 2016-02-20 18:05:41 -06:00
Geoff Bourne
7651cc658e [jenkins] Upgrade base to java:8-jdk 2016-02-04 21:19:42 -06:00
Geoff Bourne
dd0bcda23c Fixes #58 by allowing FML versions 1.8.8+ to be 3-part 2016-01-31 09:13:22 -06:00
Geoff Bourne
afa710455d Merge pull request #57 from Jadaw1n/master
[minecraft] Pass GID as docker option
2016-01-29 15:56:18 -06:00
Piero Steinger
70a55e3be1 [minecraft] Pass GID as docker option 2016-01-29 20:50:53 +01:00
Geoff Bourne
13ee106dac Merge pull request #51 from nlloyd/master
Adding gamerule.txt configuration file handling (optional)
2016-01-06 15:53:16 -06:00
Nick Lloyd
6253d5ddc0 Merge branch 'itzg-master' 2016-01-06 15:56:50 -05:00
Nick Lloyd
63e3123ab0 gamerules.txt is now bootstrap.txt 2016-01-06 15:55:45 -05:00
Geoff Bourne
1be18346ce [mc] Add Bukkit/Spigot support to MODPACK download-install 2016-01-03 09:37:27 -06:00
Geoff Bourne
9a90acab23 [mc] Fixed typo in Dockerfile 2016-01-01 22:23:26 -06:00
Geoff Bourne
edd69c40f6 Merge pull request #52 from sshipway/master
Add Spigot support, and non-zip URLs
2016-01-01 22:00:14 -06:00
Steve Shipway
582c60cd03 Add /plugins mount for external bukkit plugins
Add TYPE=BUKKIT documentation
2016-01-02 13:11:07 +13:00
Steve Shipway
13a6d91295 Fix typo 2016-01-02 12:20:39 +13:00
Steve Shipway
d0263f31d6 Add bukkit/spigot type download 2016-01-02 12:12:20 +13:00
Steve Shipway
4ab31a049b Allow non-ZIP urls for download
Add directory rename for Spigot
2016-01-02 11:33:05 +13:00
Nick Lloyd
4b74d13f08 removing old exec java call 2016-01-01 17:11:10 -05:00
Nick Lloyd
2afbdc959e added special handling for on startup gamerules (/gamerule commands), unfortunately will clobber stdin for the running server process 2016-01-01 17:06:56 -05:00
Geoff Bourne
9fa27b9a3d [mc] Adding MODPACK download option similar to WORLD 2016-01-01 12:39:43 -06:00
Geoff Bourne
16b3f18400 Merge pull request #49 from sshipway/master
Add WORLD env var to download save via HTTP, and other fixes
2015-12-22 10:42:54 -06:00
Geoff Bourne
79f9e02446 [cassandra] Upgrade to 2.2.4 2015-12-22 10:19:48 -06:00
Steve Shipway
a313c03fff Verify source URL and log if not working 2015-12-22 20:39:53 +13:00
Steve Shipway
e76068e63e Many improvements to help it work with automated schedulers
- Allow -e WORLD=http://xxxx/world.zip to download archived world and unpack
- Allow 'adventure' and 'spectator' game modes
- Allow /mods and /config mounts for shared Forge mods without using /data
- Quote many strings in case of blank values
- Let VERSION take lowercase options, and set to LATEST if blank or invalid
- Enable command blocks by default (needed for adventure worlds)
- Allow DIFFICULTY to be given numerically
- default to empty banned-players and banned-ip files to avoid error message
2015-12-22 19:53:29 +13:00
root
2427cae5a2 Quote pathnames in case of spaces and such 2015-12-19 21:50:44 +13:00
root
e902c6f40f Set command blocks enabled on servers by default; improved use of
http world download.
2015-12-19 21:48:09 +13:00
Steve
ef34025dd8 Add support for download of world in zipfile
WORLD=http://hostname/world.zip
Zipfile should contain world/ directory, and optionally any required mods in mods/ as well as optionally
a default server.properties file (overwritten by any env vars)
Also export volumes /mods and /config, the contents of which are copied to /data/mods and /data/config.  This
allows shared read-only mounts for modules without affecting world.
2015-12-19 15:32:29 +13:00
Geoff Bourne
0acedd04b9 Merge remote-tracking branch 'refs/remotes/origin/mc-issue-47' 2015-12-01 21:47:02 -06:00
Geoff Bourne
2f5402195c Merge remote-tracking branch 'refs/remotes/origin/master' into mc-issue-47 2015-11-30 21:51:19 -06:00
Geoff Bourne
764ae807e0 Avoid text file busy prior to exec sudo 2015-11-30 20:56:25 -06:00
Geoff Bourne
32cb5f44e4 [mc] also apply to white-list property 2015-11-28 23:02:43 -06:00
Geoff Bourne
a6e32f0ea9 Merge pull request #46 from everett-toews/whitelist
Whitelist players
2015-11-28 22:37:18 -06:00
Everett Toews
111883e0d5 Whitelist players 2015-11-28 22:11:01 -06:00
Geoff Bourne
847f403bd3 [es] Fixed #45 with corrected binding and re-worked example
* also upgraded to 2.1.0
* added a MULTICAST env var for supporting networks
2015-11-28 11:35:59 -06:00
Geoff Bourne
39bb0d75e2 [cassandra] Upgrade to 2.1.11 2015-11-04 18:24:02 -06:00
Geoff Bourne
01473c4e43 Fixes #44 : use 2.0 plugin install syntax 2015-11-04 18:21:46 -06:00
Geoff Bourne
b3a79d6b08 [es] Upgrade to 2.0.0 2015-10-29 19:58:28 -05:00
Geoff Bourne
5484f50659 [es] Upgrade to 1.7.3 2015-10-29 19:35:20 -05:00
Geoff Bourne
53e727298e Refreshing apt baseline 2015-10-29 19:17:34 -05:00
Geoff Bourne
a4aa177d6e Merge pull request #43 from everett-toews/patch-1
Consistent use of name "mc" everywhere
2015-10-09 08:01:13 -05:00
Everett Toews
a412cfddad Missed one... 2015-10-08 21:01:24 -05:00
Everett Toews
594c9873c4 Consistent use of name "mc" everywhere 2015-10-08 20:57:03 -05:00
Geoff Bourne
94442458e3 [cassandra] Upgrade to 2.1.9 2015-10-03 07:19:36 -05:00
Geoff Bourne
f75d735540 Merge branch 'master' of github.com:itzg/dockerfiles 2015-10-03 07:07:19 -05:00
Geoff Bourne
fec75cb117 Add support for level type and generator settings 2015-10-03 07:05:01 -05:00
Geoff Bourne
007fca149c Adding info about using Docker Compose 2015-08-15 10:06:32 -05:00
Geoff Bourne
ac608b7abb Refreshed devbox versions and run with non-root user 2015-07-24 15:21:01 -05:00
Geoff Bourne
7f048c5e8b [es] Adding CLUSTER_FROM feature for migrating cluster data directories 2015-07-24 12:51:21 -04:00
Geoff Bourne
53932e64f2 [es] Upgrade to 1.7.0 and add /conf/env override feature
fixes #39 and #40
2015-07-23 20:46:06 -05:00
15 changed files with 516 additions and 93 deletions

17
.gitattributes vendored Normal file
View File

@@ -0,0 +1,17 @@
# Auto detect text files and perform LF normalization
* text=auto
# Custom for Visual Studio
*.cs diff=csharp
# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain

3
.gitignore vendored
View File

@@ -1 +1,2 @@
.idea/
*.iml
.idea

View File

@@ -2,7 +2,7 @@ FROM itzg/ubuntu-openjdk-7
MAINTAINER itzg
ENV CASSANDRA_VERSION 2.1.8
ENV CASSANDRA_VERSION 2.2.5
RUN wget -qO /tmp/apache-cassandra.tgz http://mirrors.ibiblio.org/apache/cassandra/$CASSANDRA_VERSION/apache-cassandra-$CASSANDRA_VERSION-bin.tar.gz
RUN tar -C /opt -zxvf /tmp/apache-cassandra.tgz && \

View File

@@ -1,12 +1,12 @@
FROM itzg/ubuntu-openjdk-7
RUN apt-get update
RUN apt-get install -yq git curl wget unzip openjdk-7-jdk
RUN DEBIAN_FRONTEND=noninteractive \
apt-get install -yq git curl wget unzip openjdk-7-jdk && \
apt-get clean
ENV MAVEN_VER 3.2.2
ENV NODEJS_VER 0.10.29
WORKDIR /opt
ENV MAVEN_VER 3.3.3
ENV NODEJS_VER 0.12.7
RUN wget -O /tmp/maven.tgz http://apache.mirrors.pair.com/maven/maven-3/$MAVEN_VER/binaries/apache-maven-$MAVEN_VER-bin.tar.gz
RUN tar xvf /tmp/maven.tgz && rm /tmp/maven.tgz
@@ -17,13 +17,14 @@ RUN curl -s https://raw.githubusercontent.com/isaacs/nave/master/nave.sh > /usr/
RUN chmod +x /usr/local/bin/nave
RUN nave usemain latest
WORKDIR /root
env HOME /root
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
VOLUME ["/shared"]
RUN useradd -m -d /home/developer developer
USER developer
RUN curl -s get.gvmtool.net | bash
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
WORKDIR /home/developer
CMD bash

8
elasticsearch/Dockerfile Normal file → Executable file
View File

@@ -1,10 +1,10 @@
FROM itzg/ubuntu-openjdk-7
FROM java:openjdk-8u111-jdk
MAINTAINER itzg
ENV ES_VERSION 1.6.0
ENV ES_VERSION 2.2.0
RUN wget -qO /tmp/es.tgz https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-$ES_VERSION.tar.gz && \
RUN wget -qO /tmp/es.tgz https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/$ES_VERSION/elasticsearch-$ES_VERSION.tar.gz && \
cd /usr/share && \
tar xf /tmp/es.tgz && \
rm /tmp/es.tgz
@@ -23,4 +23,6 @@ USER elasticsearch
EXPOSE 9200 9300
ENV OPTS=-Dnetwork.host=_non_loopback_
CMD ["/start"]

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

@@ -31,21 +31,16 @@ http://DOCKERHOST:9200/
Where `DOCKERHOST` would be the actual hostname of your host running
Docker.
# Basic multi-node cluster
# Simple, multi-node cluster
Running a multi-node cluster (3-node in this example) is almost as easy:
To run a multi-node cluster (3-node in this example) on a single Docker machine use:
docker run -d -p 9200:9200 -p 9300:9300 itzg/elasticsearch
docker run -d -p 9201:9200 -p 9301:9300 itzg/elasticsearch
docker run -d -p 9202:9200 -p 9302:9300 itzg/elasticsearch
docker run -d --name es0 -p 9200:9200 es
docker run -d --name es1 --link es0 -e UNICAST_HOSTS=es0 es
docker run -d --name es2 --link es0 -e UNICAST_HOSTS=es0 es
where the only difference was the host port binding of `9200:`/`9300:`,
`9201:`/`9301:`, and `9202:`/`9302:`. By default, Elasticsearch uses
[Zen Discovery](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html), so the three nodes find each other and form a cluster. You
can confirm that by checking the cluster health for the presence of
three nodes (`number_of_nodes`):
http://DOCKERHOST:9200/_cluster/health?pretty
and then check the cluster health, such as http://192.168.99.100:9200/_cluster/health?pretty
{
"cluster_name" : "elasticsearch",
@@ -67,6 +62,29 @@ environment variables (`-e`) like
docker run ... -e NAME=VALUE ... itzg/elasticsearch
Since Docker's `-e` settings are baked into the container definition, this image provides an
extra feature to change any of the settings below for an existing container. Either
create/edit the file `env` in the `/conf` volume mapping or edit within the running container's
context using:
docker exec -it CONTAINER_ID vi /conf/env
replacing `CONTAINER_ID` with the container's ID or name.
The contents of the `/conf/env` file are standard shell
NAME=VALUE
entries where `NAME` is one of the variables described below.
Configuration options not explicitly supported below can be specified via the `OPTS` environment variable. For
example, by default `OPTS` is set with
OPTS=-Dnetwork.bind_host=_non_loopback_
_NOTE: That option is a default since `bind_host` defaults to `localhost` as of 2.0, which isn't helpful for
port mapping out from the container_.
## Cluster Name
If joining a pre-existing cluster, then you may need to specify a cluster name

View File

@@ -1,5 +1,9 @@
#!/bin/sh
if [ -f /conf/env ]; then
. /conf/env
fi
if [ ! -e /conf/elasticsearch.* ]; then
cp $ES_HOME/config/elasticsearch.yml /conf
fi
@@ -8,7 +12,7 @@ if [ ! -e /conf/logging.* ]; then
cp $ES_HOME/config/logging.yml /conf
fi
OPTS="-Des.path.conf=/conf \
OPTS="$OPTS -Des.path.conf=/conf \
-Des.path.data=/data \
-Des.path.logs=/data \
-Des.transport.tcp.port=9300 \
@@ -16,12 +20,22 @@ OPTS="-Des.path.conf=/conf \
if [ -n "$CLUSTER" ]; then
OPTS="$OPTS -Des.cluster.name=$CLUSTER"
if [ -n "$CLUSTER_FROM" ]; then
if [ -d /data/$CLUSTER_FROM -a ! -d /data/$CLUSTER ]; then
echo "Performing cluster data migration from $CLUSTER_FROM to $CLUSTER"
mv /data/$CLUSTER_FROM /data/$CLUSTER
fi
fi
fi
if [ -n "$NODE_NAME" ]; then
OPTS="$OPTS -Des.node.name=$NODE_NAME"
fi
if [ -n "$MULTICAST" ]; then
OPTS="$OPTS -Des.discovery.zen.ping.multicast.enabled=$MULTICAST"
fi
if [ -n "$UNICAST_HOSTS" ]; then
OPTS="$OPTS -Des.discovery.zen.ping.unicast.hosts=$UNICAST_HOSTS"
fi
@@ -35,7 +49,7 @@ if [ -n "$PLUGINS" ]; then
for p in $(echo $PLUGINS | awk -v RS=, '{print}')
do
echo "Installing the plugin $p"
$ES_HOME/bin/plugin --install $p
$ES_HOME/bin/plugin install $p
done
fi

View File

@@ -1,9 +1,7 @@
FROM itzg/ubuntu-openjdk-7
FROM java:openjdk-8u72-jdk
MAINTAINER itzg
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install curl && apt-get clean
ADD download-and-start.sh /download-and-start
ENV JENKINS_HOME /data

View File

@@ -1,18 +1,28 @@
FROM itzg/ubuntu-openjdk-7
FROM java:8
MAINTAINER itzg
ENV APT_GET_UPDATE 2015-03-28
ENV APT_GET_UPDATE 2015-10-03
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y libmozjs-24-bin imagemagick && apt-get clean
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y \
libmozjs-24-bin \
imagemagick \
lsof \
nano \
sudo \
vim \
&& apt-get clean
RUN update-alternatives --install /usr/bin/js js /usr/bin/js24 100
RUN wget -O /usr/bin/jsawk https://github.com/micha/jsawk/raw/master/jsawk
RUN chmod +x /usr/bin/jsawk
RUN useradd -M -s /bin/false --uid 1000 minecraft \
&& mkdir /data \
&& chown minecraft:minecraft /data
&& mkdir /config \
&& mkdir /mods \
&& mkdir /plugins \
&& chown minecraft:minecraft /data /config /mods /plugins
EXPOSE 25565
@@ -20,6 +30,9 @@ COPY start.sh /start
COPY start-minecraft.sh /start-minecraft
VOLUME ["/data"]
VOLUME ["/mods"]
VOLUME ["/config"]
VOLUME ["/plugins"]
COPY server.properties /tmp/server.properties
WORKDIR /data
@@ -28,7 +41,8 @@ CMD [ "/start" ]
# Special marker ENV used by MCCY management tool
ENV MC_IMAGE=YES
ENV UID=1000
ENV UID=1000 GID=1000
ENV MOTD A Minecraft Server Powered by Docker
ENV JVM_OPTS -Xmx1024M -Xms1024M
ENV TYPE=VANILLA VERSION=LATEST FORGEVERSION=RECOMMENDED LEVEL=world PVP=true DIFFICULTY=easy
ENV TYPE=VANILLA VERSION=LATEST FORGEVERSION=RECOMMENDED LEVEL=world PVP=true DIFFICULTY=easy \
LEVEL_TYPE=DEFAULT GENERATOR_SETTINGS= WORLD= MODPACK=

View File

@@ -1,10 +1,14 @@
[![Docker Pulls](https://img.shields.io/docker/pulls/itzg/minecraft-server.svg)](https://hub.docker.com/r/itzg/minecraft-server/)
This docker image provides a Minecraft Server that will automatically download the latest stable
version at startup. You can also run/upgrade to any specific version or the
latest snapshot. See the *Versions* section below for more information.
To simply use the latest stable version, run
docker run -d -p 25565:25565 itzg/minecraft-server
docker run -d -p 25565:25565 --name mc itzg/minecraft-server
where the standard server port, 25565, will be exposed on your host machine.
@@ -56,7 +60,7 @@ Mojang now requires accepting the [Minecraft EULA](https://account.mojang.com/do
such as
docker run -d -it -e EULA=TRUE -p 25565:25565 itzg/minecraft-server
docker run -d -it -e EULA=TRUE -p 25565:25565 --name mc itzg/minecraft-server
## Attaching data directory to host filesystem
@@ -68,15 +72,16 @@ to map a directory on your host machine to the container's `/data` directory, su
When attached in this way you can stop the server, edit the configuration under your attached `/path/on/host`
and start the server again with `docker start CONTAINERID` to pick up the new configuration.
**NOTE**: By default, the files in the attached directory will be owned by the host user with UID of 1000.
You can use an different UID by passing the option:
**NOTE**: By default, the files in the attached directory will be owned by the host user with UID of 1000 and host group with GID of 1000.
You can use an different UID and GID by passing the options:
-e UID=1000
-e UID=1000 -e GID=1000
replacing 1000 with a UID that is present on the host.
Here is one way to find the UID given a username:
replacing 1000 with a UID and GID that is present on the host.
Here is one way to find the UID and GID:
grep some_host_user /etc/passwd|cut -d: -f3
id some_host_user
getent group some_host_group
## Versions
@@ -102,9 +107,15 @@ but you can also choose to run a specific version with `-e FORGEVERSION=10.13.4.
$ docker run -d -v /path/on/host:/data -e VERSION=1.7.10 \
-e TYPE=FORGE -e FORGEVERSION=10.13.4.1448 \
-p 25565:25565 -e EULA=TRUE itzg/minecraft-server
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
In order to add mods, you will need to attach the container's `/data` directory
In order to add mods, you have two options.
### 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 mods to the `/path/on/host/mods` folder you chose. From the example above,
the `/path/on/host` folder contents look like:
@@ -124,8 +135,103 @@ the `/path/on/host` folder contents look like:
If you add mods while the container is running, you'll need to restart it to pick those
up:
docker stop $ID
docker start $ID
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 are two additional volumes that can be mounted; `/mods` and `/config`.
Any files in either of these filesystems will be copied over to the main
`/data` filesystem before starting Minecraft.
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
every time you want to create new Minecraft server, you can now use
[Docker Compose](https://docs.docker.com/compose/). Start with a
`docker-compose.yml` file like the following:
```
minecraft-server:
ports:
- "25565:25565"
environment:
EULA: TRUE
image: itzg/minecraft-server
container_name: mc
tty: true
stdin_open: true
restart: always
```
and in the same directory as that file run
docker-compose -d up
Now, go play...or adjust the `environment` section to configure
this server instance.
## Server configuration
@@ -133,12 +239,20 @@ up:
The difficulty level (default: `easy`) can be set like:
docker run -d -e DIFFICULTY=hard
docker run -d -e DIFFICULTY=hard ...
Valid values are: `peaceful`, `easy`, `normal`, and `hard`, and an
error message will be output in the logs if it's not one of these
values.
### Whitelist Players
To whitelist players for your Minecraft server, pass the Minecraft usernames separated by commas via the `WHITELIST` environment variable, such as
docker run -d -e WHITELIST=user1,user2 ...
If the `WHITELIST` environment variable is not used, any user can join your Minecraft server if it's publicly accessible.
### Op/Administrator Players
To add more "op" (aka adminstrator) users to your Minecraft server, pass the Minecraft usernames separated by commas via the `OPS` environment variable, such as
@@ -167,6 +281,8 @@ shortcut values:
* creative
* survival
* adventure
* spectator (only for Minecraft 1.8 or later)
For example:
@@ -176,28 +292,83 @@ For example:
The message of the day, shown below each server entry in the UI, can be changed with the `MOTD` environment variable, such as
docker run -d -e 'MOTD=My Server' ...
docker run -d -e 'MOTD=My Server' ...
If you leave it off, the last used or default message will be used. _The example shows how to specify a server
message of the day that contains spaces by putting quotes around the whole thing._
### PVP Mode
By default servers are created with player-vs-player (PVP) mode enabled. You can disable this with the `PVP`
By default, servers are created with player-vs-player (PVP) mode enabled. You can disable this with the `PVP`
environment variable set to `false`, such as
docker run -d -e PVP=false ...
### Level Type and Generator Settings
By default, a standard world is generated with hills, valleys, water, etc. A different level type can
be configured by setting `LEVEL_TYPE` to
* DEFAULT
* FLAT
* LARGEBIOMES
* AMPLIFIED
* CUSTOMIZED
Descriptions are available at the [gamepedia](http://minecraft.gamepedia.com/Server.properties).
When using a level type of `FLAT` and `CUSTOMIZED`, you can further configure the world generator
by passing [custom generator settings](http://minecraft.gamepedia.com/Superflat).
**Since generator settings usually have ;'s in them, surround the -e value with a single quote, like below.**
For example (just the `-e` bits):
-e LEVEL_TYPE=flat -e 'GENERATOR_SETTINGS=3;minecraft:bedrock,3*minecraft:stone,52*minecraft:sandstone;2;'
### World Save Name
You can either switch between world saves or run multiple containers with different saves by using the `LEVEL` option,
where the default is "world":
docker run -d -e LEVEL=bonus ...
docker run -d -e LEVEL=bonus ...
**NOTE:** if running multiple containers be sure to either specify a different `-v` host directory for each
`LEVEL` in use or don't use `-v` and the container's filesystem will keep things encapsulated.
### Downloadable world
Instead of mounting the `/data` volume, you can instead specify the URL of
a ZIP file containing an archived world. This will be downloaded, and
unpacked in the `/data` directory; if it does not contain a subdirectory
called `world/` then it will be searched for a file `level.dat` and the
containing subdirectory renamed to `world`. This means that most of the
archived Minecraft worlds downloadable from the Internet will already be in
the correct format.
The ZIP file may also contain a `server.properties` file and `modules`
directory, if required.
docker run -d -e WORLD=http://www.example.com/worlds/MySave.zip ...
**NOTE:** Unless you also mount `/data` as an external volume, this world
will be deleted when the container is deleted.
**NOTE:** This URL must be accessible from inside the container. Therefore,
you should use an IP address or a globally resolveable FQDN, or else the
name of a linked container.
### Downloadable mod/plugin pack for Forge, Bukkit, and Spigot Servers
Like the `WORLD` option above, you can specify the URL of a "mod pack"
to download and install into `mods` for Forge or `plugins` for Bukkit/Spigot.
To use this option pass the environment variable `MODPACK`, such as
docker run -d -e MODPACK=http://www.example.com/mods/modpack.zip ...
**NOTE:** The referenced URL must be a zip file with one or more jar files at the
top level of the zip archive. Make sure the jars are compatible with the
particular `TYPE` of server you are running.
## JVM Configuration
### Memory Limit

View File

@@ -0,0 +1,14 @@
minecraft-server:
ports:
- "25565:25565"
environment:
EULA: TRUE
image: itzg/minecraft-server
container_name: minecraft-server
tty: true
stdin_open: true
restart: always

View File

@@ -21,7 +21,7 @@ online-mode=true
resource-pack=
pvp=true
difficulty=1
enable-command-block=false
enable-command-block=true
player-idle-timeout=0
gamemode=0
max-players=20
@@ -30,4 +30,4 @@ generate-structures=true
view-distance=10
spawn-protection=16
motd=A Minecraft Server powered by Docker
generator-settings=

View File

@@ -1,5 +1,7 @@
#!/bin/bash
umask 002
if [ ! -e /data/eula.txt ]; then
if [ "$EULA" != "" ]; then
echo "# Generated via Docker on $(date)" > eula.txt
@@ -16,53 +18,72 @@ if [ ! -e /data/eula.txt ]; then
fi
echo "Checking version information."
case $VERSION in
LATEST)
case "X$VERSION" in
X|XLATEST|Xlatest)
VANILLA_VERSION=`wget -O - https://s3.amazonaws.com/Minecraft.Download/versions/versions.json | jsawk -n 'out(this.latest.release)'`
;;
SNAPSHOT)
XSNAPSHOT|Xsnapshot)
VANILLA_VERSION=`wget -O - https://s3.amazonaws.com/Minecraft.Download/versions/versions.json | jsawk -n 'out(this.latest.snapshot)'`
;;
*)
X[1-9]*)
VANILLA_VERSION=$VERSION
;;
*)
VANILLA_VERSION=`wget -O - https://s3.amazonaws.com/Minecraft.Download/versions/versions.json | jsawk -n 'out(this.latest.release)'`
;;
esac
cd /data
echo "Checking minecraft / forge type information."
case $TYPE in
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
;;
FORGE)
# norm := the official Minecraft version as Forge is tracking it. dropped the third part starting with 1.8
case $VANILLA_VERSION in
1.7.*)
norm=$VANILLA_VERSION
;;
echo "Checking type information."
case "$TYPE" in
*BUKKIT|*bukkit|SPIGOT|spigot)
TYPE=SPIGOT
case "$TYPE" in
*BUKKIT|*bukkit)
echo "Downloading latest CraftBukkit $VANILLA_VERSION server ..."
SERVER=craftbukkit_server.jar
;;
*)
norm=`echo $VANILLA_VERSION | sed 's/^\([0-9]\+\.[0-9]\+\).*/\1/'`
echo "Downloading latest Spigot $VANILLA_VERSION server ..."
SERVER=spigot_server.jar
;;
esac
case $VANILLA_VERSION in
1.8*)
URL=/spigot18/$SERVER
;;
1.9*)
URL=/spigot19/$SERVER
;;
*)
echo "That version of $SERVER is not available."
exit 1
;;
esac
echo "Checking Forge version information."
case $FORGEVERSION in
RECOMMENDED)
#attempt https, and if it fails, fallback to http and download that way. Display error if neither works.
wget -q -N $SERVER https://getspigot.org$URL || \
(echo "Falling back to http, unable to contact server using https..." && \
wget -q -N $SERVER http://getspigot.org$URL) || \
echo "Unable to download new copy of spigot server"
;;
FORGE|forge)
TYPE=FORGE
norm=$VANILLA_VERSION
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)
@@ -76,7 +97,7 @@ case $TYPE in
FORGE_INSTALLER="forge-$normForgeVersion-installer.jar"
SERVER="forge-$normForgeVersion-universal.jar"
if [ ! -e $SERVER ]; then
if [ ! -e "$SERVER" ]; then
echo "Downloading $FORGE_INSTALLER ..."
wget -q http://files.minecraftforge.net/maven/net/minecraftforge/forge/$normForgeVersion/$FORGE_INSTALLER
echo "Installing $SERVER"
@@ -84,11 +105,86 @@ 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]*)
echo "Downloading world via HTTP"
echo "$WORLD"
wget -q -O - "$WORLD" > /data/world.zip
echo "Unzipping word"
unzip -q /data/world.zip
rm -f /data/world.zip
if [ ! -d /data/world ]; then
echo World directory not found
for i in /data/*/level.dat; do
if [ -f "$i" ]; then
d=`dirname "$i"`
echo Renaming world directory from $d
mv -f "$d" /data/world
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"
;;
esac
fi
# If supplied with a URL for a modpack (simple zip of jars), download it and unpack
if [[ "$MODPACK" ]]; then
case "X$MODPACK" in
X[Hh][Tt][Tt][Pp]*[Zz][iI][pP])
echo "Downloading mod/plugin pack via HTTP"
echo "$MODPACK"
wget -q -O /tmp/modpack.zip "$MODPACK"
if [ "$TYPE" = "SPIGOT" ]; then
mkdir -p /data/plugins
unzip -d /data/plugins /tmp/modpack.zip
else
mkdir -p /data/mods
unzip -d /data/mods /tmp/modpack.zip
fi
rm -f /tmp/modpack.zip
;;
*)
echo "Invalid URL given for modpack: Must be HTTP or HTTPS and a ZIP file"
;;
esac
fi
if [ ! -e server.properties ]; then
cp /tmp/server.properties .
if [ -n "$WHITELIST" ]; then
sed -i "/whitelist\s*=/ c whitelist=true" /data/server.properties
sed -i "/white-list\s*=/ c white-list=true" /data/server.properties
fi
if [ -n "$MOTD" ]; then
sed -i "/motd\s*=/ c motd=$MOTD" /data/server.properties
fi
@@ -105,18 +201,37 @@ if [ ! -e server.properties ]; then
sed -i "/pvp\s*=/ c pvp=$PVP" /data/server.properties
fi
if [ -n "$LEVEL_TYPE" ]; then
# normalize to uppercase
LEVEL_TYPE=${LEVEL_TYPE^^}
# check for valid values and only then set
case $LEVEL_TYPE in
DEFAULT|FLAT|LARGEBIOMES|AMPLIFIED|CUSTOMIZED)
sed -i "/level-type\s*=/ c level-type=$LEVEL_TYPE" /data/server.properties
;;
*)
echo "Invalid LEVEL_TYPE: $LEVEL_TYPE"
exit 1
;;
esac
fi
if [ -n "$GENERATOR_SETTINGS" ]; then
sed -i "/generator-settings\s*=/ c generator-settings=$GENERATOR_SETTINGS" /data/server.properties
fi
if [ -n "$DIFFICULTY" ]; then
case $DIFFICULTY in
peaceful)
peaceful|0)
DIFFICULTY=0
;;
easy)
easy|1)
DIFFICULTY=1
;;
normal)
normal|2)
DIFFICULTY=2
;;
hard)
hard|3)
DIFFICULTY=3
;;
*)
@@ -137,6 +252,12 @@ if [ ! -e server.properties ]; then
c*)
MODE=1
;;
a*)
MODE=2
;;
s*)
MODE=3
;;
*)
echo "ERROR: Invalid game mode: $MODE"
exit 1
@@ -152,6 +273,10 @@ if [ -n "$OPS" -a ! -e ops.txt.converted ]; then
echo $OPS | awk -v RS=, '{print}' >> ops.txt
fi
if [ -n "$WHITELIST" -a ! -e white-list.txt.converted ]; then
echo $WHITELIST | awk -v RS=, '{print}' >> white-list.txt
fi
if [ -n "$ICON" -a ! -e server-icon.png ]; then
echo "Using server icon from $ICON..."
# Not sure what it is yet...call it "img"
@@ -165,4 +290,45 @@ if [ -n "$ICON" -a ! -e server-icon.png ]; then
fi
fi
# Make sure files exist to avoid errors
if [ ! -e banned-players.json ]; then
echo '' > banned-players.json
fi
if [ ! -e banned-ips.json ]; then
echo '' > banned-ips.json
fi
# If any modules have been provided, copy them over
[ -d /data/mods ] || mkdir /data/mods
for m in /mods/*.jar
do
if [ -f "$m" ]; then
echo Copying mod `basename "$m"`
cp -f "$m" /data/mods
fi
done
[ -d /data/config ] || mkdir /data/config
for c in /config/*
do
if [ -f "$c" ]; then
echo Copying configuration `basename "$c"`
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
# If we have a bootstrap.txt file... feed that in to the server stdin
if [ -f /data/bootstrap.txt ];
then
exec java $JVM_OPTS -jar $SERVER < /data/bootstrap.txt
else
exec java $JVM_OPTS -jar $SERVER
fi
exec java $JVM_OPTS -jar $SERVER

View File

@@ -2,7 +2,14 @@
set -e
usermod --uid $UID minecraft
chown -R minecraft /data /start-minecraft
groupmod --gid $GID minecraft
chown -R minecraft:minecraft /data /start-minecraft
chmod -R g+wX /data /start-minecraft
while lsof -- /start-minecraft; do
echo -n "."
sleep 1
done
echo "...switching to user 'minecraft'"
exec sudo -E -u minecraft /start-minecraft

View File

@@ -2,7 +2,7 @@ FROM ubuntu:trusty
MAINTAINER itzg
ENV APT_GET_UPDATE 2015-07-16
ENV APT_GET_UPDATE 2015-10-29
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive \
apt-get -q -y install openjdk-7-jre-headless wget unzip \