{"id":9124,"date":"2022-06-23T22:23:31","date_gmt":"2022-06-23T20:23:31","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=9124"},"modified":"2022-12-12T14:39:35","modified_gmt":"2022-12-12T12:39:35","slug":"spigot-minecraft-server-auf-docker-mit-docker-compose-wir-containerisieren-eine-java-anwendung-x86-server-und-raspberry-pi","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/spigot-minecraft-server-auf-docker-mit-docker-compose-wir-containerisieren-eine-java-anwendung-x86-server-und-raspberry-pi\/","title":{"rendered":"Spigot Minecraft Server auf Docker mit Docker-Compose: Wir containerisieren eine (Java) Anwendung (X86 Server und Raspberry Pi)"},"content":{"rendered":"<p>In <a href=\"https:\/\/u-labs.de\/portal\/minecraft-server-auf-dem-raspberry-pi-installieren-spigot-und-performance-test-wie-gut-lauft-minecraft-auf-dem-raspberry-pi-4\/\" title=\"Minecraft Server auf dem Raspberry Pi installieren (Spigot) und Performance-Test: Wie gut l\u00e4uft Minecraft auf dem Raspberry Pi 4?\">einem vorherigen Beitrag haben wir bereits einen Minecraft-Server nativ auf dem Raspberry Pi installiert<\/a> &#8211; dies funktioniert auch auf einem X86 Server mit Debian. Dieser Beitrag erkl\u00e4rt, wie man Spigot mit Docker und Docker Compose containerisiert. Aus lizenztechnischen Gr\u00fcnden d\u00fcrfen keine fertig erstellten Jar-Dateien bereitgestellt werden, weswegen fertige Images problematisch sind. Doch das ist mit Docker kein Problem: Wir nutzen dies als praktisches Beispiel, um eine Java-Anwendung selbst mit eigens erstelltem Dockerfile zu containerisieren. Die grunds\u00e4tzlichen Vorteile von Containern\/Docker habe ich <a href=\"https:\/\/u-labs.de\/portal\/raspberry-pi-einstieg-in-docker-container-fuer-anfaenger-theorie-praxis\/\" title=\"Raspberry Pi: Einstieg in Docker-Container f\u00fcr Anf\u00e4nger (Theorie + Praxis)\">in diesem Beitrag bereits aufgezeigt<\/a>.<\/p>\n<h2 class=\"wp-block-heading\">Das brauchst du<\/h2>\n<ul class=\"wp-block-list\">\n<li>Einen Raspberry Pi 4 oder X86 VM\/Server mit Debian oder Raspberry Pi OS<\/li>\n<li><a href=\"https:\/\/u-labs.de\/portal\/docker-auf-dem-raspberry-pi-installieren-erste-container-starten-einfach-erklaert\/\" title=\"Docker auf dem Raspberry Pi installieren &amp; erste Container starten einfach erkl\u00e4rt\">Docker <\/a>mit installiertem <a href=\"https:\/\/u-labs.de\/portal\/einfuehrung-das-ist-docker-compose-und-so-installierst-du-es-auf-dem-raspberry-pi\/\" title=\"Einf\u00fchrung: Das ist Docker-Compose und so installierst du es auf dem Raspberry Pi!\">Docker Compose Plugin<\/a><\/li>\n<li>Hardwaretechnisch sollten es mindestens 4 Prozessorkerne mit 2 GB Arbeitsspeicher sein &#8211; wobei das eher unten angesiedelt ist, besser sind 4 GB RAM oder mehr.<\/li>\n<li>Port <strong>25565 <\/strong>muss erreichbar sein (ggf. in der Firewall freischalten, falls eine verwendet wird, z.B. beim Hoster)<\/li>\n<li>Zum Testen (und sp\u00e4teren Spielen) einen PC\/Laptop mit entsprechender Minecraft Client-Lizenz (der Server ben\u00f6tigt keine Lizenz, nur die Clients)<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\">#1 Welche Basis-Image?<\/h2>\n<p>Theoretisch kann man sein eigenes Docker-Image von null auf selbst erstellen, d.H. jegliche ben\u00f6tigte Software gezielt installieren. Dieser minimalistische Ansatz ist allerdings aufw\u00e4ndiger &#8211; sowohl zu Beginn als auch in der sp\u00e4teren Wartung. Es macht mehr Sinn, nach einem vertrauensw\u00fcrdigen Basis-Image zu suchen, dass die gew\u00fcnschten Komponenten bereits enth\u00e4lt. F\u00fcr Minecraft ist dies eine freie Java-Implementierung, etwa von OpenJDK. Diese wurde k\u00fcrzlich Teil von Eclipse und stellt offizielle Images unter <strong><a href=\"https:\/\/hub.docker.com\/_\/eclipse-temurin\" title=\"eclipse-temurin\" target=\"_blank\" rel=\"nofollow\">eclipse-temurin<\/a><\/strong> bereit.<\/p>\n<p>Spigot ben\u00f6tigt f\u00fcr 1.18.x derzeit mindestens Java 17 LTS, f\u00fcr neuere Versionen sollten die Anforderungen in der Dokumentation gepr\u00fcft werden. Wir ben\u00f6tigen nicht nur die Laufzeitumgebung JRE, sondern zum Erstellen der Jar-Datei auch das Developer Kit (JDK). Der Tag <strong><a href=\"https:\/\/hub.docker.com\/layers\/eclipse-temurin\/library\/eclipse-temurin\/17-jdk-jammy\/images\/sha256-f7b969d455abeefb9cad0280477e067d8340c22a081347a94c6fe22d0c67d420?context=explore\" title=\"17-jdk-jammy\" target=\"_blank\" rel=\"nofollow\">17-jdk-jammy<\/a><\/strong> ist f\u00fcr x86 in der 64-Bit Edition eben so wie ARM v7\/8 und damit auch dem Raspberry verf\u00fcgbar. Etwas effizienter w\u00e4re <strong>17-jdk-alpine<\/strong>, er basiert<a href=\"https:\/\/u-labs.de\/portal\/nur-103-mb-alpine-linux-getestet-kleine-simple-und-sichere-linux-distribution-fuer-den-raspberry-pi\/\" title=\"Nur 103 MB \u2013 Alpine Linux getestet: Kleine, simple und sichere Linux-Distribution f\u00fcr den Raspberry Pi\"> auf dem schlanken Alpine Linux<\/a>. Hier k\u00f6nnte es eventuell zu Problemen kommen, da Alpine musk statt libc verwendet. In beiden F\u00e4llen haben wir Java mit den Entwicklertools und damit alles, was wir an Abh\u00e4ngigkeiten f\u00fcr Minecraft ben\u00f6tigen.<\/p>\n<h2 class=\"wp-block-heading\">#2 Das Dockerfile<\/h2>\n<p>Beim Containerisieren einer Anwendung halten wir uns an deren Anforderungen. Im Kern wird dabei nichts anderes gemacht, wie bei einer nativen Installation. Als generelle Checkliste kann man sich folgende Schritte vormerken:<\/p>\n<ol class=\"wp-block-list\">\n<li>Auswahl des Basis-Images mit passendem Versions-Tag<\/li>\n<li>Installation von zus\u00e4tzlichen Abh\u00e4ngigkeiten (falls notwendig)<\/li>\n<li>Setzen von bestimmten Einstellungen\/Parametern, die von der Anwendung ben\u00f6tigt werden<\/li>\n<li>Anlegen eines Benutzers, damit das Programm nicht als root mit privilegierten Rechten l\u00e4uft inklusive dem setzen der notwendigen Rechte<\/li>\n<li>Aufr\u00e4umen (z.B. tempor\u00e4re Dateien entfernen)<\/li>\n<li>Erstellung eines Einstiegspunkt, der die Anwendung startet<\/li>\n<\/ol>\n<p>Konkret brauchen wir in Schritt #2 git und wget f\u00fcr Spigot. Das Paket <a href=\"https:\/\/github.com\/tianon\/gosu\" title=\"gosu \" target=\"_blank\" rel=\"nofollow\">gosu <\/a>dient zum Wechsel des Benutzers, dazu sp\u00e4ter mehr. Anschlie\u00dfend wird sichergestellt, dass die Git-Einstellung <strong>core.autocrlf<\/strong> nicht gesetzt ist, wie in den Anforderungen dokumentiert. Zur eigentlichen Installation laden wir uns die BuildTools, erstellen daraus die Jar-Datei des Minecraft-Servers, setzen passende Rechte f\u00fcr den Nutzer, r\u00e4umen auf und starten Spigot. F\u00fcr alles was man ggf. anpassen m\u00f6chte, kommen Argumente zum Einsatz. So kann man etwa <strong>MC_VERSION <\/strong>von <strong>1.18.2<\/strong> auf <strong>1.19.0<\/strong> setzen, um die derzeit neueste Version zu nutzen.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">FROM eclipse-temurin:17-jdk-jammy\n# Infos zu neuen Versionen https:\/\/www.spigotmc.org\/\nARG MC_VERSION=1.18.2\nARG MEM_LIMIT=1G\nARG USER=minecraft-docker\nARG GROUP=minecraft-docker\nARG UID=2000\nARG GID=2000\nARG PLUGIN_DIR=\/plugins\nARG WORLD_DIR=\/world\nARG EULA=true\nENV MC_VERSION=$MC_VERSION\nENV USER=$USER\nENV GROUP=$GROUP\nENV MEM_LIMIT=$MEM_LIMIT\nENV PLUGIN_DIR=$PLUGIN_DIR\nENV WORLD_DIR=$WORLD_DIR\n\nRUN apt-get update \\\n    &amp;&amp; apt-get install -y git wget gosu\n\n# Git liefert den Exitcode 5, wenn der Parameter in der Konfiguration nicht gesetzt ist (Erkennt Docker als fehlerhaft)\n# Wird nicht benoetigt, da im Standard unter Ubuntu 22 LTS nicht gesetzt\n#RUN git config --global --unset &#039;core.autocrlf&#039; || exit 0\n\nVOLUME ${WORLD_DIR}\nVOLUME ${PLUGIN_DIR}\nWORKDIR \/minecraft\nRUN mkdir -p ${WORLD_DIR} ${PLUGIN_DIR}\n# Die Eula-Datei wird erst beim ersten Start angelegt, sofern nicht bereits eine mit eula=true existiert\nRUN wget https:\/\/hub.spigotmc.org\/jenkins\/job\/BuildTools\/lastSuccessfulBuild\/artifact\/target\/BuildTools.jar \\\n    &amp;&amp; java -jar BuildTools.jar --rev $MC_VERSION \\\n    &amp;&amp; echo &quot;eula=${EULA}&quot; &gt; eula.txt\n\nRUN apt-get remove -y git wget \\\n    &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*\n\nRUN groupadd -g ${GID} ${GROUP} \\\n    &amp;&amp; useradd -u ${UID} -g ${GROUP} -s \/bin\/sh -m ${USER} \\\n    &amp;&amp; chown ${USER}:${GROUP} . -R \\\n    &amp;&amp; chown ${USER}:${GROUP} ${WORLD_DIR} -R \\\n    &amp;&amp; chown ${USER}:${GROUP} ${PLUGIN_DIR} -R\n#USER ${UID}:${GID}\n\nCOPY docker-entrypoint.sh .\nRUN chmod +x .\/docker-entrypoint.sh\n\n# CMD wird nicht genutzt, da in der Shell-Form ein Kindprozess gestartet wird -&gt; Signale werden nicht weitergereicht\n# Exec-Form loest Variablen nicht auf, die wir z.B. fuer das RAM Limit brauchen\nENTRYPOINT [&quot;.\/docker-entrypoint.sh&quot;]<\/code><\/pre>\n<p>Die beiden Volumes sind zum einen f\u00fcr die <em>Minecraft Welt<\/em> &#8211; sie enth\u00e4lt alle Daten zum Spielstand eures Servers und m\u00fcssen daher unbedingt persistent in einem eigenen Volume gespeichert werden. Ansonsten w\u00fcrdet ihr mit einem frischen Server ohne eigene Inhalte starten, sobald der Container neu erstellt wird. \u00dcber das Plugins-Volume kann man eigene Plugins installiern &#8211; beispielsweise <a href=\"https:\/\/u-labs.de\/portal\/wie-kann-ich-rechte-und-berechtigung-im-eigenen-minecraft-server-verteilen-installation-einrichtung-von-luckperms-plugin\/\" title=\"Wie kann ich Rechte und Berechtigung im eigenen Minecraft Server verteilen? Installation + Einrichtung von LuckPerms Plugin\">LuckPerms zur Rechteverwaltung<\/a>.<\/p>\n<p>Der Einstiegspunkt (<strong>ENTRYPOINT<\/strong>) f\u00fchrt das Skript <strong>docker-entrypoint.sh<\/strong> beim Start des Containers aus. Dies m\u00fcssen wir noch erstellen. Es soll sicherstellen, dass die Berechtigungen beim Start korrekt sind &#8211; beispielsweise, wenn ein Plugin in das dazugeh\u00f6rige Volume verschoben wird. Au\u00dferdem starten wir hier den Server mit unserem Benutzer. Theoretisch k\u00f6nnte man dies auch mit der <strong>USER<\/strong> Direktive im <strong>Dockerfile <\/strong>festlegen. Das Problem: Die Berechtigungen w\u00fcrden sich dann nicht setzen lassen, da unser Nutzer hierzu nicht berechtigt ist. Daher wird das Skript als root ausgef\u00fchrt und wir wechseln mit gosu f\u00fcr den Programmstart auf einen weniger privilegierten Benutzer:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">#!\/bin\/bash\nchown $USER:$GROUP $PLUGIN_DIR -R\necho &quot;Verf\u00fcgbare Plugins in ${PLUGIN_DIR}&quot;\nls -lha $PLUGIN_DIR\n\n# https:\/\/www.spigotmc.org\/wiki\/start-up-parameters\nexec gosu $USER:$GROUP java -Xms${MEM_LIMIT} -Xmx${MEM_LIMIT} -XX:+UseG1GC -jar spigot-${MC_VERSION}.jar nogui --world-dir ${WORLD_DIR} --plugins ${PLUGIN_DIR} --bukkit-settings ${WORLD_DIR}\/bukkit.yml --commands-settings ${WORLD_DIR}\/commands.yml --config ${WORLD_DIR}\/server.properties --spigot-settings ${WORLD_DIR}\/spigot.yml<\/code><\/pre>\n<p>Um aus dieser Dockerfile ein Image erstellen und starten zu k\u00f6nnen, erstellen wir eine <strong>docker-compose.yml<\/strong> im gleichen Ordner:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-yaml\" data-line=\"\">services:\n  spigot:\n    build: .\n    container_name: spigot\n    mem_limit: 1.5G\n    stdin_open: true\n    tty: true\n    ports:\n      - 25565:25565\n    volumes:\n      - world:\/world\n      - plugins:\/plugins\n\nvolumes:\n  world:\n  plugins:<\/code><\/pre>\n<p>Je nachdem wie viel Arbeitsspeicher zur Verf\u00fcgung steht, sollte dies entsprechend angepasst werden &#8211; auch im <strong>Dockerfile<\/strong>.<\/p>\n<h2 class=\"wp-block-heading\">Starten und Minecraft-Konsolenbefehle ausf\u00fchren<\/h2>\n<p>Zu empfehlen ist, den Container mit dem Argument <strong>&#8211;build<\/strong> zu starten. Dadurch pr\u00fcft Compose, ob das <strong>Dockerfile <\/strong>ver\u00e4ndert wurde und baut den Container neu. Beim ersten Mal geschieht dies automatisch, da noch kein Image vorhanden ist. Bei sp\u00e4teren \u00c4nderungen (z.B. Upgrade auf eine neue Minecraft-Version)<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">docker compose up --build -d<\/code><\/pre>\n<p>Um Konsolenbefehle auszuf\u00fchren, verwendet nach dem vollst\u00e4ndigen Start des Servers <em>attach<\/em>:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">docker attach spigot<\/code><\/pre>\n<p>Anschlie\u00dfend die gew\u00fcnschten Befehle (z.B. <strong>help<\/strong>) eingeben, der Befehl wird ganz normal ausgef\u00fchrt. Mit <strong>[STRG] + [P]<\/strong> gefolgt von <strong>[STRG] + [Q]<\/strong> schlie\u00dft ihr die Konsole, ohne den Minecraft-Server zu beenden.<\/p>\n<h2 class=\"wp-block-heading\">Plugins installieren<\/h2>\n<p>Damit haben wir einen Vanilla-Minecraftserver auf Basis von Spigot. Wer diesen mit Erweiterungen anpassen m\u00f6chte, kann daf\u00fcr das zuvor bereits erstellte Volume verwenden. Volumes liegen im gleichnamigen Unterordner. \u00dcber <strong>docker info<\/strong> bekommt man das Docker-Wurzelverzeichnis heraus, meist <strong>\/var\/lib\/docker<\/strong>. Mit grep auf den Name des Ordners (minecraft-docker) filtern, da dieser bei Compose als Pr\u00e4fix f\u00fcr die Volumes dient. Anschlie\u00dfend kann man die gew\u00fcnschten Daten (z.B. Jar-Datei eines Plugins) in dessen Unterordner <strong>_data <\/strong>verschieben:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ docker info | grep &quot;Root Dir&quot;\n Docker Root Dir: \/var\/lib\/docker\n\n$ sudo ls -lh \/var\/lib\/docker\/volumes | grep minecraft\ndrwx-----x 3 root root 4,0K Jun 20 23:38 minecraft-docker_plugins\ndrwx-----x 3 root root 4,0K Jun 20 22:03 minecraft-docker_world\n\n$ wget https:\/\/download.luckperms.net\/1438\/bukkit\/loader\/LuckPerms-Bukkit-5.4.30.jar\n$ sudo mv LuckPerms-Bukkit-5.4.30.jar \/var\/lib\/docker\/volumes\/minecraft-docker_plugins\/_data\n$ docker compose up --build -d; docker compose logs -f<\/code><\/pre>\n<p>Im Protokoll des Servers, welches mit <strong>docker-compose logs -f<\/strong> aufgerufen wird, solltet ihr sehen k\u00f6nnen, dass euer Plugin geladen wird:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">[09:44:30] [Server thread\/INFO]: [LuckPerms] Loading LuckPerms v5.4.30\n[09:44:33] [Server thread\/INFO]: [LuckPerms] Enabling LuckPerms v5.4.30\n[09:44:33] [Server thread\/INFO]:         __    \n[09:44:33] [Server thread\/INFO]:   |    |__)   LuckPerms v5.4.30\n[09:44:33] [Server thread\/INFO]:   |___ |      Running on Bukkit - CraftBukkit<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Upgrades auf neuere Minecraft-Versionen durchf\u00fchren<\/h2>\n<p>Im <strong>Dockerfile <\/strong>habe ich f\u00fcr die Version ein Argument namens <strong>MC_VERSION <\/strong>festgelegt. Es steht bewusst auf Version 1.18.2, obwohl beim Erstellzeitpunkt dieses Artikels bereits 1.19 verf\u00fcgbar ist. So k\u00f6nnen wir ein Upgrade testen. Wie grunds\u00e4tzlich vor einem Upgrade solltet ihr den Server herunterfahren und die Daten sichern &#8211; ein Downgrade wird von Minecraft nicht unterst\u00fctzt.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\"># Falls noch nicht installiert\n$ sudo apt install zip\n\n$ docker compose down\n$ sudo zip -r minecraft-world-backup-23.06.2022.zip \/var\/lib\/docker\/volumes\/minecraft-docker_world\n$ sudo zip -r minecraft-plugins-backup-23.06.2022.zip \/var\/lib\/docker\/volumes\/minecraft-docker_plugins<\/code><\/pre>\n<p>Die Version im Dockerfile auf die aktuellste\/gew\u00fcnschte erh\u00f6hen, etwa 1.19. Am besten vorher <a href=\"https:\/\/www.spigotmc.org\" title=\"auf die Homepage von Spigot\" target=\"_blank\" rel=\"nofollow\">auf die Homepage von Spigot<\/a> nach der neuesten schauen.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">ARG MC_VERSION=1.19<\/code><\/pre>\n<p>Anschlie\u00dfend das Image bauen und den Container neu erstellen. Dies kann man in einzelnen Schritten machen (<strong>docker compose build<\/strong> und <strong>docker compose up<\/strong>) oder in letzterem Befehl mit dem Parameter <strong>&#8211;build<\/strong> vereinen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ docker compose up -d --build\n$ docker compose logs -f<\/code><\/pre>\n<p>Abh\u00e4ngig von der Leistung eures Servers wird dieser Vorgang einige Zeit dauern. Es werden die aktuellsten Build-Tools heruntergeladen, die eine neue JAR-Datei in der gew\u00fcnschten Version erstellen. Danach erstellt Compose mit dem aktualisierten Image einen neuen Container. An dieser Stelle w\u00e4re es zudem sinnvoll, die Plugins auf Aktualit\u00e4t zu pr\u00fcfen, falls ihr welche installiert habt. Sobald der Server in den Protokollen den vollst\u00e4ndigen Start mitteilt (<em>Done<\/em>), kann man sich mit einem Client verbinden. Vergesst vorher nicht, die neue Version im Client auszuw\u00e4hlen!<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-28.png\"><img loading=\"lazy\" decoding=\"async\" width=\"290\" height=\"236\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-28.png\" alt=\"\" class=\"wp-image-9128\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-28.png 290w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-28-70x57.png 70w\" sizes=\"auto, (max-width: 290px) 100vw, 290px\" \/><\/a><\/figure>\n<\/div>\n<p>Im Spiel kann man mit <strong>F3<\/strong> die Version einsehen:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-29.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"467\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-29-1024x467.png\" alt=\"\" class=\"wp-image-9129\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-29-1024x467.png 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-29-300x137.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-29-768x350.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-29-1536x700.png 1536w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-29-2048x934.png 2048w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/06\/grafik-29-70x32.png 70w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<p>Auch die Serverkonsole (<strong>docker compose logs -f<\/strong>) zeigt diese an. Allerdings muss man hier etwas suchen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">...\n[10:42:13] [Server thread\/INFO]: Starting minecraft server version 1.19\n...<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>In einem vorherigen Beitrag haben wir bereits einen Minecraft-Server nativ auf dem Raspberry Pi installiert &#8211; dies funktioniert auch auf einem X86 Server mit Debian. Dieser Beitrag erkl\u00e4rt, wie man Spigot mit Docker und Docker Compose containerisiert. Aus lizenztechnischen Gr\u00fcnden d\u00fcrfen keine fertig erstellten Jar-Dateien bereitgestellt werden, weswegen fertige Images problematisch sind. Doch das ist &#8230;<\/p>\n","protected":false},"author":5,"featured_media":9133,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[671],"tags":[1050],"class_list":["post-9124","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","tag-minecraft"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/9124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=9124"}],"version-history":[{"count":10,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/9124\/revisions"}],"predecessor-version":[{"id":16503,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/9124\/revisions\/16503"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/9133"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=9124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=9124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=9124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}