docker-minecraft-server 使用 packwiz 模组包部署指南:PACKWIZ_URL 配置、启动处理顺序与源码实现
【免费下载链接】docker-minecraft-serverDocker image that provides a Minecraft Server for Java Edition that automatically installs/upgrades versions, modloaders, modpacks and more at startup项目地址: https://gitcode.com/GitHub_Trending/do/docker-minecraft-server
本文围绕 docker-minecraft-server(itzg/minecraft-server)镜像的 Packwiz 模组包支持展开:说明如何通过PACKWIZ_URL让容器在启动时自动拉取并安装 packwiz 格式的 Mod 包,并结合仓库源码(启动模组安装脚本)解析其处理顺序、安装器下载机制与.env重载细节,帮助你完成从docker run到 Compose 的落地配置,并理解服务端侧下载、与其他 Mod 来源变量叠加等关键行为。
packwiz 是什么
packwiz 是一个用于维护和分发 Mod 包定义的 CLI 工具,同时支持CurseForge和Modrinth作为模组来源。它不要求你像传统 zip 模组包那样预先打包好所有 jar,而是以一组轻量级的 TOML 定义文件(pack.toml、index.toml以及每个模组一份.pw.toml)描述包内容,由安装器在启动时按需解析并下载。镜像本身不内置 packwiz,而是在检测到PACKWIZ_URL时动态引导安装器完成安装,这一机制由 scripts/start-setupModpack 中的handlePackwiz函数实现。
核心配置:PACKWIZ_URL
要用 packwiz 模组包配置服务端 Mod,只需把PACKWIZ_URL环境变量指向你的pack.toml模组定义文件地址:
docker run -d --pull=always \ -v /path/on/host:/data -e TYPE=FABRIC \ -e "PACKWIZ_URL=https://example.com/modpack/pack.toml" \ itzg/minecraft-server仓库中的 packwiz Compose 示例 展示了一个更完整的写法,以 Quilt + Fabric 生态示例包为例:
services: mc: image: itzg/minecraft-server tty: true stdin_open: true environment: EULA: true # Match loader from versions section of https://github.com/packwiz/packwiz-example-pack/blob/v1/pack.toml TYPE: QUILT VERSION: "1.19" QUILT_LOADER_VERSION: "0.17.0" PACKWIZ_URL: https://raw.githubusercontent.com/packwiz/packwiz-example-pack/refs/heads/v1/pack.toml volumes: - ./data:/data ports: - "25565:25565"要点说明:
PACKWIZ_URL的值是pack.toml的 HTTP(S) 地址;TYPE应与包中声明的加载器生态匹配(如示例中 Quilt 对应 Fabric 系模组),loader 版本变量(如QUILT_LOADER_VERSION)也需与包定义中的版本保持一致,避免 class file version 之类的兼容问题;/data卷持久化世界数据与安装后的模组。
启动处理顺序:packwiz 先于其他 Mod 定义
原文档明确说明:packwiz 模组包定义会在其他 Mod 定义(MODPACK、MODS等)之前被处理,目的是允许你在此基础上追加处理或覆盖(例如某些模组不在 Modrinth/CurseForge 上可用、或你不维护该包时)。
这一点可以从 scripts/start-setupModpack 的顶层调用顺序得到印证,各处理函数按如下次序执行:
handlePackwiz(第 350 行)——packwiz 安装最先执行;handleModpackZip——MODPACKzip 包解压;handleListings——MODS/PLUGINS/MODS_FILE/PLUGINS_FILE清单;handleGenericPacks——GENERIC_PACK(S)通配包;handleModrinthProjects——MODRINTH_PROJECTS;handleCurseForgeFiles——CURSEFORGE_FILES。
也就是说,后续所有来源下载的 jar 都会落入同一个mods/plugins目录,若与 packwiz 已安装的模组同名同路径,后写者生效,因此 packwiz 适合作为“基线包”,再用MODS等变量做增量或替换。
源码实现:安装器如何被下载与执行
handlePackwiz函数(scripts/start-setupModpack)的实际流程分两步:
第一步:下载 packwiz 安装器。通过mc-image-helper maven-download从 packwiz 官方 Maven 仓库拉取安装器构件:
mc-image-helper maven-download \ --maven-repo=https://maven.packwiz.infra.link/repository/release/ \ --group=link.infra.packwiz --artifact=packwiz-installer --classifier=dist \ --skip-existing--skip-existing表示如果本地已有缓存的安装器则跳过下载,重复启动时不重复拉取。
第二步:执行安装。直接用 Java 运行安装器主类,注意-s server参数:
java -cp "${packwizInstaller}" link.infra.packwiz.installer.Main -s server "${PACKWIZ_URL}"-s server即side=server:安装器只解析并下载服务端侧的模组,这与文档中“packwiz 已预配置为只下载服务端模组”的说明一致。任何一步失败都会打印错误日志并exit 1,容器启动直接失败,便于你在健康检查或编排系统中及时发现包定义问题。
.env 交互:LOAD_ENV_FROM_FILE 的重载时机
如果你的包附带一个.env文件,并且你通过LOAD_ENV_FROM_FILE引用了它,那么该文件会在 packwiz 安装器运行之后被立即重新加载,使得包刚下载下来的环境变量值能作用于剩余启动阶段(如server.properties生成、JVM 参数拼接等)。
源码依据在 scripts/start-setupModpack:
# packwiz may have just downloaded/updated the env file referenced by # LOAD_ENV_FROM_FILE. The initial load in start-configuration happened # before this point, so re-load it now to pick up the pack's values for # the remaining setup stages (server.properties, JVM args, etc.). if [[ ${LOAD_ENV_FROM_FILE:-} ]]; then if ! loadEnvFromFile "${LOAD_ENV_FROM_FILE}"; then exit 1 fi fi需要注意一个限制:TYPE和VERSION在更早阶段(deploy 分发之前)就已解析完毕,因此包内提供的.env无法改变这两项。若希望包的.env能决定TYPE/VERSION,请改用LOAD_ENV_FROM_GENERIC_PACK或LOAD_ENV_FROM_ARCHIVE,它们的加载时机在TYPE分发之前(参见 Mod/插件文档中的 env 加载说明)。
pack.toml 包结构速览
结合仓库中 packwiz 测试夹具 中的真实示例,一个最小可用的 packwiz 包由三部分构成:
包入口pack.toml(tests/setuponlytests/packwiz/web/pack.toml):
name = "Vanillia Server" author = "itzg" version = "2.0.0" pack-format = "packwiz:1.1.0" [index] file = "index.toml" hash-format = "sha256" hash = "1a27b406c3fb6d35167fe659384ab528a6b3f8a66e6c05d593058e646aec591f" [versions] fabric = "0.14.8" minecraft = "1.19"其中[index]指向文件索引index.toml(含 sha256 校验和),[versions]声明加载器与游戏版本——容器侧的TYPE/VERSION/loader 版本变量应与之对应。
文件索引index.toml(tests/setuponlytests/packwiz/web/index.toml)列出包内每个文件的校验和,metafile = true标记出模组元数据文件。
模组定义mods/*.pw.toml(tests/setuponlytests/packwiz/web/mods/architectury-api.pw.toml):
name = "Architectury API" filename = "architectury-5.7.28-fabric.jar" side = "both" [download] url = "https://cdn.modrinth.com/data/lhGA9TYQ/versions/5.7.28+fabric/architectury-5.7.28-fabric.jar" hash-format = "sha1" hash = "aa38ae9cc2e978e4ec87ff891f7b02ea0c0ee1b8" [update] [update.modrinth] mod-id = "lhGA9TYQ" version = "Hf0Bau1j"side字段决定该模组在哪个侧(client/server/both)安装;[download]支持直接 URL 加校验和,[update.modrinth]则提供后续从 Modrinth 更新的元数据。CurseForge 来源的包同理使用对应的 update 段。
常见问题排查
- 客户端模组被拉下来导致服务端报错:packwiz 虽预配置为只下载服务端模组,但如果你的
pack.toml中把纯客户端模组的side配成了"both",它仍会被下载。请检查包配置,将客户端专属模组改为"client"。 - 安装失败日志:
Failed to get packwiz installer通常意味着无法访问maven.packwiz.infra.link(网络受限环境);Failed to run packwiz installer则是安装器执行失败,常见原因是包 URL 不可达、pack.toml/index.toml校验和不匹配。可配合DEBUG=true观察完整启动流程。 - 模组与包外清单冲突:由于 packwiz 最先执行,
MODS/MODPACK等后续来源的同名文件会覆盖包内文件;需要删旧件时可结合REMOVE_OLD_MODS=TRUE使用(见 Mod/插件总览)。
自动化测试如何验证该功能
仓库内置了一个 setup-only 集成测试 tests/setuponlytests/packwiz:用 nginx 容器托管一个本地pack.toml,MC 容器以TYPE=CUSTOM+CUSTOM_SERVER=/servers/fake.jar启动(避免真实开服),仅依赖http://web/pack.toml触发 packwiz 流程。验证脚本 verify.sh 断言安装结果:
mc-image-helper assert fileExists mods/architectury-5.7.28-fabric.jar即安装成功后/data/mods下应出现包定义的 jar 文件。该测试的 require.sh 注释说明了跳过条件:maven.packwiz.infra.link不可解析时测试被跳过,印证了安装器确实依赖 packwiz 官方 Maven 仓库这一外部依赖。
小结
在 docker-minecraft-server 中使用 packwiz 的关键只有三步:设置PACKWIZ_URL指向pack.toml、保证TYPE/loader 版本与包定义匹配、持久化/data。从 scripts/start-setupModpack 的实现可见,安装器经 Maven 仓库下载(带本地缓存)后以-s server模式执行,只装服务端模组,且在所有其他 Mod 来源之前运行,从而可以无缝叠加MODS、GENERIC_PACKS、MODRINTH_PROJECTS等其他机制做增量定制;若需包内.env影响全局配置,注意LOAD_ENV_FROM_FILE的二次重载时机与TYPE/VERSION的解析限制。
【免费下载链接】docker-minecraft-serverDocker image that provides a Minecraft Server for Java Edition that automatically installs/upgrades versions, modloaders, modpacks and more at startup项目地址: https://gitcode.com/GitHub_Trending/do/docker-minecraft-server
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考