Nub 增强你镜像中已有的 Node——它不是单独的运行时。官方镜像从官方 node 基础开始并在其上分层 Nub,所以 nodenpmnub 都存在。

官方镜像

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/amd64linux/arm64

标签基础libc
latest<version>slim<version>-slimnode:26-slimglibc
alpine<version>-alpinenode:26-alpinemusl

直接运行 TypeScript 文件——入口点将任何非命令参数传递给 nub

docker run --rm -v "$PWD:/app" ghcr.io/nubjs/nub script.ts

信号到达运行时:docker stopnub 传递 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 上,为原生插件添加 libgcclibstdc++

FROM node:26-alpine
RUN apk add --no-cache libgcc libstdc++ && npm install -g @nubjs/nub

要固定下限 Node 版本而非当前线,使用 22 基础(node:22-slimnode: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"]