linuxserver/modsDocker Mod 是 Linuxserver.io 容器生态的扩展机制,旨在提供用户可消费的容器修改层。其核心是存储在 Docker Hub 或 GitHub Container Registry(GHCR)中的文件压缩包,容器启动时会自动下载并解压该压缩包,且在任何初始化逻辑执行前完成,从而实现对基础容器的自定义修改。
主要用途包括:
| 环境变量 | 描述 | 格式示例 |
|---|---|---|
DOCKER_MODS | 指定要加载的 Mod,支持单个或多个 Mod(多 Mod 用 ` | ` 分隔) |
RUN_BANNED_MODS | 若设置任意值,将绕过官方禁止的 Docker Hub 用户过滤(不建议使用) | 1 或 true |
以下示例启动一个 NZBGet 容器,并加载 universal-tshoot Mod(包含 dig、netstat 等调试工具):
bashdocker create \ --name=nzbget \ -e DOCKER_MODS=lscr.io/linuxserver/mods:universal-tshoot \ # 指定加载的 Mod -e PUID=1000 \ -e PGID=1000 \ -e TZ=Europe/London \ -p 6789:6789 \ -v /path/to/nzbget/data:/config \ -v /path/to/downloads:/downloads \ --restart unless-stopped \ lscr.io/linuxserver/nzbget
yaml--- services: nzbget: image: lscr.io/linuxserver/nzbget:latest container_name: nzbget environment: - DOCKER_MODS=lscr.io/linuxserver/mods:universal-tshoot # 指定加载的 Mod - PUID=1000 - PGID=1000 - TZ=Europe/London volumes: - /path/to/nzbget/data:/config - /path/to/downloads:/downloads # 可选挂载 ports: - 6789:6789 restart: unless-stopped
Linuxserver.io 官方托管的 Mod 可通过以下链接查看:
[***]
官方 Mod 镜像地址格式:
lscr.io/linuxserver/mods:<imagename>-<modname>(最新版本)
lscr.io/linuxserver/mods:<imagename>-<modname>-<commitsha>(特定版本)
Mod 必须仅包含单个镜像层。所有文件需通过构建流程整合到单层中。
universal-mymod 为例)text. └── root # 根目录,内容将被复制到容器的 / 路径下 ├── defaults # 存放默认配置文件(如需覆盖容器默认配置) └── etc └── s6-overlay └── s6-rc.d # s6 服务管理目录 ├── init-mods-end # 无依赖的初始化结束点 │ └── dependencies.d │ └── init-mod-universal-mymod # 无包安装需求时,依赖此文件(空文件) ├── init-mods-package-install # 包安装初始化点 │ └── dependencies.d │ └── init-mod-universal-mymod # 有包安装需求时,依赖此文件(空文件) ├── init-mod-universal-mymod # Mod 初始化服务 │ ├── dependencies.d │ │ └── init-mods # 依赖基础 Mod 初始化(空文件) │ ├── run # 初始化脚本(需可执行权限) │ ├── type # 文件内容为 "oneshot"(单次执行) │ └── up # 脚本绝对路径,如 "/etc/s6-overlay/..." ├── svc-mod-universal-mymod # Mod 持久服务(如需后台运行) │ ├── dependencies.d │ │ └── init-services # 依赖容器主服务初始化(空文件) │ ├── run # 服务启动脚本(需可执行权限) │ └── type # 文件内容为 "longrun"(持续运行) └── user └── contents.d # 声明需加载的服务 ├── init-mod-universal-mymod # 声明初始化服务 └── svc-mod-universal-mymod # 声明持久服务
适用于仅需添加文件或简单脚本的场景,通过基础 Dockerfile 实现:
DockerfileFROM scratch # 复制本地文件到镜像层 COPY root/ /
操作步骤:
root 文件夹,按上述目录结构组织文件run 文件)需添加可执行权限:chmod +x root/etc/s6-overlay/s6-rc.d/init-mod-universal-mymod/run适用于需动态下载文件、编译代码或多阶段构建的场景,通过多阶段 Dockerfile 实现:
Dockerfile## 构建阶段 ## FROM ghcr.io/linuxserver/baseimage-alpine:3.20 as buildstage RUN \ echo "**** 安装依赖工具 ****" && \ apk add --no-cache curl && \ echo "**** 下载外部文件 ****" && \ mkdir -p /root-layer && \ curl -o /root-layer/rclone.deb -L "https://downloads.rclone.org/v1.47.0/rclone-v1.47.0-linux-amd64.deb" # 复制本地文件到构建层 COPY root/ /root-layer/ ## 最终单层镜像 ## FROM scratch # 从构建层复制所有文件到单层 COPY --from=buildstage /root-layer/ /
如需在 Mod 中安装系统包,需通过 mod-repo-packages-to-install.list 或 mod-pip-packages-to-install.list 声明,由容器统一处理安装(支持 Ubuntu 和 Alpine):
示例脚本(init-mod-universal-mymod/run):
bash#!/usr/bin/with-contenv bash # Ubuntu 系统 if [ -f /usr/bin/apt ]; then echo "\ dnsutils \ net-tools \ iputils-ping" >> /mod-repo-packages-to-install.list fi # Alpine 系统 if [ -f /sbin/apk ]; then echo "\ bind-tools \ net-tools" >> /mod-repo-packages-to-install.list fi
包安装后操作:
如需在包安装后执行额外配置,需创建第二个初始化服务(如 init-mod-universal-mymod-postinstall),并依赖 init-mods-package-install。
.github/workflows/BuildImage.yml,设置:
yamlENDPOINT: "user/endpoint" # Docker Hub/GHCR 镜像路径(如 "myuser/mymod") BRANCH: "master" # 构建分支
DOCKERUSER(用户名)、DOCKERPASS(密码或令牌)CR_USER(GitHub 用户名)、CR_PAT(含 read:packages 和 write:packages 权限的令牌)template 分支创建本地分支,命名格式:<基础镜像名>-<mod名>(如 nzbget-tshoot)Dockerfile(删除 Dockerfile.complex 示例文件)root 目录内容,确保脚本权限正确(执行命令修复权限):find ./ -path "./.git" -prune -o ( -name "run" -o -name "finish" -o -name "check" ) -not -perm -u=x,g=x,o=x -print -exec chmod +x {} +.github/workflows/BuildImage.yml,设置 BASEIMAGE(基础镜像名)、MODNAME(Mod 名称)等参数<镜像名>: <mod名> <描述>(如 nzbget: tshoot add debug tools)s6 初始化脚本(如 run、type 文件)必须使用 UTF-8 无 BOM 编码。若文件含 BOM,需通过编辑器去除(如 VS Code 中设置 "UTF-8" 编码)。
使用工具 dive 可查看 Mod 镜像层文件结构:
带 Docker 环境:
bashdocker run --rm -it \ -v /var/run/docker.sock:/var/run/docker.sock \ wagoodman/dive:latest <镜像名> # 如 "lscr.io/linuxserver/mods:universal-tshoot"
本地安装 dive:
bashdive <镜像名> # 如 "lscr.io/linuxserver/mods:universal-tshoot"
DOCKER_MODS 环境变量以排查问题RUN_BANNED_MODS 可能导致加载***镜像,谨慎使用探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务