Docker

如果你想要在 Docker 里运行 MCDR,你可以看看下面的这些官方 Docker 镜像

你可以在 mcdreforged 这个 Docker 组织的页面里找到完整镜像列表:https://hub.docker.com/r/mcdreforged

备注

在 Docker 容器中运行 MCDR 的时候,由 MCDR 启动的服务端将不可避免地也在同一个容器中运行。因此,为了让 MCDR 和服务端正确地在 Docker 容器中运行,你需要确保容器中已安装好服务端的各种运行时依赖项

例如,如果你想在 Docker 容器中用 MCDR 启动一个 Minecraft 服务端,则需要在容器里配置好 Minecraft 服务端所需要的 Java 运行环境

镜像用法

下述的镜像用法对本文列出的所有镜像都适用

基础信息

  • 操作系统发行版:debian(与 Docker 官方 python 镜像的默认值保持一致)

  • 镜像的用户:root

  • 工作路径:/mcdr

  • Python 包安装位置: /root/.local/lib/python${PYTHON_VERSION}/site-packages

快速测试

用于测试验证 mcdreforged 的镜像是否可以正常运行的一条快速测试命令

docker run -it --rm mcdreforged/mcdreforged:latest-slim

输出示例:

MCDReforged 2.13.0 is starting up
MCDReforged is open source, u can find it here: https://github.com/MCDReforged/MCDReforged
[MCDR] [13:05:59] [MainThread/INFO]: Language is set to en_us
[MCDR] [13:05:59] [MainThread/INFO]: Encoding / Decoding method is set to utf8 / utf8
[MCDR] [13:05:59] [MainThread/INFO]: Plugin directory list:
[MCDR] [13:05:59] [MainThread/INFO]: - plugins
[MCDR] [13:05:59] [MainThread/INFO]: Handler has set to vanilla_handler
[MCDR] [13:05:59] [MainThread/INFO]: MCDReforged is running on Python 3.11.9 environment
[MCDR] [13:05:59] [TaskExecutor/INFO]: Refreshing all plugins
[MCDR] [13:05:59] [TaskExecutor/INFO]: No plugin has changed; Active plugin amount: 2
[MCDR] [13:05:59] [MainThread/INFO]: Starting the server with command "echo Hello world from MCDReforged"
[MCDR] [13:05:59] [MainThread/INFO]: Server is running at PID 10
[Server] Hello world from MCDReforged
[MCDR] [13:05:59] [MainThread/INFO]: Server process stopped with code 0
[MCDR] [13:05:59] [MainThread/INFO]: Server stopped
[MCDR] [13:05:59] [MainThread/INFO]: Stopping MCDR
[MCDR] [13:05:59] [MainThread/INFO]: Stopping advanced console
[MCDR] [13:05:59] [MainThread/INFO]: bye

持久化服务端的数据

在生产环境中,你需要持久化镜像的工作路径 /mcdr。该路径将包含 MCDR 和服务端相关的所有运行时数据

docker run -it --name my_mcdr_container -v /path/to/my/server:/mcdr mcdreforged/mcdreforged

Python 包安装

如果你需要安装一些自定义的 python 包,你可以按照下述步骤进行操作:

  1. 将路径 /root/.local/lib/python${PYTHON_VERSION}/site-packages/ 挂载至一个卷或本地文件夹中,以进行数据持久化

    • 这一步是可选的。如果不执行这一步操作,容器移除后,容器里曾安装过的 Python 包将会丢失

    • PYTHON_VERSION 是 python 解释器的主 + 次版本号,如 3.11

    • 你可以用下述命令来确认这一挂载路径

      docker run -it --rm mcdreforged/mcdreforged:latest-slim ls -l /root/.local/lib
      
  2. 使用 pip3 命令安装你想装的任何 Python 包。--user 参数将会自动设置,以确保 Python 包将被安装到上面提到的路径中

    docker exec -it my_mcdr_container pip3 install apscheduler
    

镜像变体

基础镜像

该进行包含了运行 MCDReforged 所需的基础环境。基于官方 python 镜像构建

它可以作为构建你的自定义 MCDR 运行环境的基础镜像

FROM mcdreforged/mcdreforged

RUN <<EOT
# Install system packages you need
apt-get update
apt-get install -y curl

# Install Python packages you need
pip3 install apscheduler

# Do whatever you want for customization
# ./do_something.sh
EOT

镜像 tag 前缀说明:

  • latest 表示使用最新的 MCDR 版本

  • 2.13.02.13 表示手动指定 MCDR 版本

  • masterdev 表示从给定 GitHub 的 git 分支构建的开发版本

镜像 tag 后缀说明:

  • -slim 表示该镜像是基于官方 python 镜像的 -slim 变体构建的

  • -py3.13 表示镜像所使用的 python 版本,精确到次版本号。默认值:3.13,通常是次新的那个 python 版本

mcdreforged/mcdreforged:latest
mcdreforged/mcdreforged:latest-slim
mcdreforged/mcdreforged:dev
mcdreforged/mcdreforged:dev-slim
mcdreforged/mcdreforged:dev-py3.11
mcdreforged/mcdreforged:dev-py3.11-slim
mcdreforged/mcdreforged:2.13.0
mcdreforged/mcdreforged:2.13.0-slim
mcdreforged/mcdreforged:2.13.0-py3.11
mcdreforged/mcdreforged:2.13.0-py3.11-slim

拓展版镜像

安装有额外 python 包依赖的镜像变体

这些额外的 Python 包是从 插件仓库 中收集得到的,涵盖了插件仓库中几乎所有插件所依赖的 Python 包

备注

为了确保在镜像构建过程中,Python 包的可安装性,拓展版镜像中实际安装的 Python 包的版本,可能不处于插件依赖的 Python 包版本范围中

小技巧

对于生产环境,建议维护你自己专用的一份 Python 包集合,而非简单地使用这个拓展版镜像

这是为了确保你的所有 MCDR 插件均可在它们声称与之兼容的 Python 包环境中运行

你可以使用 基础镜像 并手动安装插件所需的 Python 包依赖,然后根据上文 Python 包安装 中的指引持久化 site-packages 路径。在确保 python 版本一致的前提下,这个 site-packages 挂载点甚至是可以在不同容器间共享的

镜像 tag 格式:与 基础镜像 一致

OpenJDK 镜像

安装有 OpenJDK 的镜像变体。如果你想用 MCDR 来运行 Minecraft 服务端,那这些镜像就是你想要的

支持的 OpenJDK 发行版:

OpenJDK 发行版

${jdk_distribution}

Eclipse Temurin (推荐)

temurin

Amazon Corretto

corretoo

Azul Zulu

zulu

支持的 Java 版本:8, 17, 21, 25 (默认值:21)

额外的镜像 tag 后缀

  • -jdk17 后缀显式指定了 JDK 的版本

  • -extra 后缀意味着该镜像是基于 extra 变体构建的

镜像 tag 例子(使用 temurin 为 JDK 发行版):

mcdreforged/mcdreforged-temurin:latest
mcdreforged/mcdreforged-temurin:latest-extra
mcdreforged/mcdreforged-temurin:latest-jdk17
mcdreforged/mcdreforged-temurin:latest-jdk17-extra
mcdreforged/mcdreforged-temurin:latest-slim
mcdreforged/mcdreforged-temurin:latest-slim-extra
mcdreforged/mcdreforged-temurin:latest-slim-jdk17
mcdreforged/mcdreforged-temurin:latest-slim-jdk17-extra

mcdreforged/mcdreforged-temurin:2.13.0
mcdreforged/mcdreforged-temurin:2.13.0-extra
mcdreforged/mcdreforged-temurin:2.13.0-jdk17
mcdreforged/mcdreforged-temurin:2.13.0-jdk17-extra
mcdreforged/mcdreforged-temurin:2.13.0-slim
mcdreforged/mcdreforged-temurin:2.13.0-slim-extra
mcdreforged/mcdreforged-temurin:2.13.0-slim-jdk17
mcdreforged/mcdreforged-temurin:2.13.0-slim-jdk17-extra

mcdreforged/mcdreforged-temurin:2.13.0-py3.11
mcdreforged/mcdreforged-temurin:2.13.0-py3.11-extra
mcdreforged/mcdreforged-temurin:2.13.0-py3.11-jdk17
mcdreforged/mcdreforged-temurin:2.13.0-py3.11-jdk17-extra
mcdreforged/mcdreforged-temurin:2.13.0-py3.11-slim
mcdreforged/mcdreforged-temurin:2.13.0-py3.11-slim-extra
mcdreforged/mcdreforged-temurin:2.13.0-py3.11-slim-jdk17
mcdreforged/mcdreforged-temurin:2.13.0-py3.11-slim-jdk17-extra