Docker
官方 Nub Docker 镜像,以及如何将 Nub 添加到你自己的镜像。镜像在官方 Node 基础上安装 Nub,所以 Node 存在且运行时开箱即增强。
Nub 增强你镜像中已有的 Node——它不是单独的运行时。官方镜像从官方 node 基础开始并在其上分层 Nub,所以 node、npm 和 nub 都存在。
官方镜像
FROM ghcr.io/nubjs/nub
COPY --chown=node:node . .
RUN nub install
CMD ["nub", "run", "start"]镜像以非 root node 用户运行,所以用 --chown=node:node 复制你的项目——裸 COPY . . 会生成 root 拥有的文件,nub install 随后无法并列写入。
两个变体,都在当前 Node 发布线上,digest 固定并发布为 linux/amd64 和 linux/arm64:
| 标签 | 基础 | libc |
|---|---|---|
latest、<version>、slim、<version>-slim | node:26-slim | glibc |
alpine、<version>-alpine | node:26-alpine | musl |
直接运行 TypeScript 文件——入口点将任何非命令参数传递给 nub:
docker run --rm -v "$PWD:/app" ghcr.io/nubjs/nub script.ts信号到达运行时:docker stop 向 nub 传递 SIGTERM,后者将其转发给 Node 进程以实现干净关闭。容器以非 root node 用户(uid 1000)运行;当你绑定挂载 nub install 必须写入的目录时,用 --user "$(id -u)" 运行以使写入使用你的主机所有权。
将 Nub 添加到你自己的镜像
如果你已在 node 基础上构建,用一行安装 Nub。安装时,npm 选择正确的每平台二进制文件——包括 Alpine 上的 musl 构建——包的 postinstall 设置执行位,所以以 root 安装然后降为非 root 用户工作。
FROM node:26-slim
RUN npm install -g @nubjs/nub在 Alpine 上,为原生插件添加 libgcc 和 libstdc++:
FROM node:26-alpine
RUN apk add --no-cache libgcc libstdc++ && npm install -g @nubjs/nub要固定下限 Node 版本而非当前线,使用 22 基础(node:22-slim 或 node:22-alpine)——Nub 快速层支持的最低版本。
多阶段构建
在构建阶段用 nub ci 安装。它写入自包含的 node_modules——真实文件、项目本地链接——在 COPY --from 到最终阶段时存活。普通 nub install 通过最终阶段没有的机器全局存储共享包,所以复制的树会指向不存在的文件。
FROM node:26-slim AS build
RUN npm install -g @nubjs/nub
WORKDIR /app
COPY . .
RUN nub ci
FROM node:26-slim
WORKDIR /app
COPY --from=build /app/node_modules ./node_modules
COPY . .
CMD ["nub", "run", "start"]