云原生容器运行时【免费下载链接】docker-nodeOfficial Docker Image for Node.js :whale: :turtle: :rocket:项目地址https://gitcode.com/gh_mirrors/do/docker-node点击查看免费下载本文以 docs/BestPractices.md 为核心骨架结合本仓库nodejs/docker-node 官方 Node.js Docker 镜像项目的源码级实现系统讲解使用官方node镜像时的环境变量、npm 升级、信号处理、非 root 用户、内存限制、CMD 写法、node-gyp 依赖安装以及去掉 npm/yarn 的多阶段构建瘦身方案。读完你将掌握一套可直接复制、可上生产环境的 Node.js 容器化最佳实践并能理解镜像内部node用户、入口脚本与 PID 1 问题的底层原理。一、环境变量让容器运行在production模式Node.js 应用在容器中运行时首要实践是显式设置NODE_ENVproduction。这不仅让 Express 等框架启用生产级优化缓存模板、压缩日志、禁用调试输出也是传递密钥secrets与其他运行时配置的标准入口docker run -e NODE_ENVproduction node在docker run中对应的是-e标志若使用Dockerfile则用ENV NODE_ENVproduction。本仓库 README.md 还展示了同类用法通过NODE_CONFIG_LOGLEVEL环境变量控制 npm 日志级别如NODE_CONFIG_LOGLEVELinfo说明NODE_ENV、NODE_CONFIG_*这一族环境变量都是官方推荐的应用/运行时配置通道。二、升级 npm一行命令覆盖镜像自带版本每一个nodeDocker 镜像都内置了与 Node.js 一同打包的 npm。可在 CLI 中直接确认版本docker run --rm --entrypoint npm node:lts --version注意node镜像的默认入口是 docker-entrypoint.sh其逻辑是「若第一个参数以-开头、或不是系统命令、或是不可执行文件则自动在前面补node」——因此上例用--entrypoint npm显式指定入口为 npm 才能直接执行 npm 命令。需要升级或降级npm 时在Dockerfile中加入version替换为目标版本例如latest或10.xRUN npm install --global npmversion可用版本与标签可在 npm registry 的版本列表中查询。npm 本身安装于/usr/local/bin/npm属于镜像内固定位置无需也不建议移动。三、全局 npm 依赖安装到非 root 用户目录如果需要安装全局 npm 依赖如 CLI 工具官方推荐将依赖安装到非 root 用户目录而不是系统目录ENV NPM_CONFIG_PREFIX/home/node/.npm-global ENV PATH$PATH:/home/node/.npm-global/bin # 可选免去完整路径直接执行 npm global binNPM_CONFIG_PREFIX将 npm 全局安装前缀指向/home/node/.npm-global避免权限与污染系统目录第二行将全局 bin 目录加入PATH这样无需书写完整路径即可运行全局命令该建议不适用于 npm 本身npm 固定在/usr/local/bin/npm。四、内核信号处理Node.js 不该当 PID 1Node.js 并未被设计为以 PID 1 运行这会在 Docker 内引发意外行为。例如以 PID 1 运行的 Node.js 进程将无法正确响应SIGINTCTRL-C等信号——因为 PID 1 的默认信号处理与普通进程不同且容器停止时发送的SIGTERM需要进程自行处理。从 Docker 1.13 起可用--init标志让 Docker 用轻量级 init 系统tini包裹 Node.js 进程正确处理 PID 1 语义docker run -it --init node也可以在Dockerfile中直接引入 tini见 tini 官方使用说明确保进程总是由 init 包装器启动。这一点与本文第九节「CMD」中的SIGTERM/SIGINT直达问题互为印证要么用--init/tini 处理僵尸进程与信号要么让node直接作为主进程。五、非 root 用户遵循最小权限原则Docker 默认以 root 运行容器内命令当超管权限并非必需时这违反了最小权限原则Principle of Least Privilege, PoLP。官方 node 镜像专门提供了node用户uid 1000用于此目的。5.1 运行时指定用户docker run -u node node5.2 在 Dockerfile 中激活用户FROM node:24 ... # 在 Dockerfile 末尾设置运行用户 USER 1000 # node5.3node用户的底层事实从本仓库源码可以确认node用户的创建细节Debian 系模板Dockerfile-debian.template、Dockerfile-slim.templateRUN groupadd --gid 1000 node \ useradd --uid 1000 --gid node --shell /bin/bash --create-home nodeAlpine 系模板Dockerfile-alpine.templateRUN addgroup -g 1000 node \ adduser -u 1000 -G node -s /bin/sh -D node \实际产物如 24/bookworm/Dockerfile 与 26/alpine3.24/Dockerfile 均可见 uid/gid 1000 的node用户Debian 用户 shell 为/bin/bash并创建 homeAlpine 用户 shell 为/bin/sh、无密码且不创建 home。因此USER 1000与USER node等价。注意node用户既非构建期也非运行期硬依赖——只要你的应用不依赖它可随时删除或修改。5.4 删除 node 用户# Debian 系 RUN userdel -r node # Alpine 系 RUN deluser --remove-home node5.5 修改 uid/gidRUN groupmod -g 999 node usermod -u 999 -g 999 node5.6 重命名用户如改为 myappRUN usermod -d /home/myapp -l myapp node5.7 Alpine 系的特殊处理Alpine 系没有groupmod与usermod修改 uid/gid 必须删除后重建RUN deluser --remove-home node \ addgroup -S node -g 999 \ adduser -S -G node -u 999 node这与上文 Alpine 模板中addgroup -S系统组的用法一致。六、内存限制防止容器吞噬宿主机资源默认情况下任何 Docker 容器都可以消耗宿主机尽可能多的 CPU 与内存。当同一宿主机运行多个容器时务必限制其内存占用docker run -m 300M --memory-swap 1G node-m 300M限制容器可用内存为 300MB--memory-swap 1G限制内存交换空间总和为 1GB即交换空间上限约 700MB。这是多租户、微服务集群场景下防止「邻居噪声」与 OOM 拖垮宿主机的第一道防线。七、CMD让 Node.js 直接接收退出信号创建镜像时可以绕过package.json的start脚本把启动命令直接固化进镜像CMD [node,index.js]这样做有两个收益减少进程数量容器内只有一个node主进程而不是npm start→ 子进程链信号直达SIGTERM、SIGINT直接被 Node.js 进程接收而不是被 npm 拦截吞掉——配合第四节--init使用可实现优雅停机。提示本仓库默认镜像的CMD [node]见 24/bookworm/Dockerfile即直接启动 node REPL生产应用应如本节所示显式指定入口脚本。八、Docker Run 综合示例以下为运行一个默认 Node.js 容器化应用的完整推荐写法融合了前述全部实践docker run \ --init \ -e NODE_ENVproduction \ -u node \ -m 300M --memory-swap 1G \ -w /home/node/app \ --name my-nodejs-app \ node [script]参数作用--init以 tini 包裹进程正确处理 PID 1 信号与僵尸进程-e NODE_ENVproduction生产模式环境变量-u node以 uid 1000 的非 root 用户运行-m 300M --memory-swap 1G内存与交换分区上限-w /home/node/app设置工作目录与node用户 home 对应--name my-nodejs-app容器命名如需以 Docker Compose 方式落地可参考 README.md 中user: node、working_dir: /home/node/app与NODE_ENVproduction的 services 配置。九、Security容器安全基线扫描Docker 团队提供了 docker-bench-security 工具用于分析运行中的容器是否存在潜在安全问题如 root 运行、能力未收敛、挂载可写等。下载并运行该工具即可获得针对 CIS Docker 基准的安全审计报告。将其与本仓库实践结合非 root 用户第五节 内存限制第六节 最小化依赖第十一节正是该基准报告中的高频合规项。十、node-gyp 与 Alpine原生模块的编译依赖许多 npm 包如bcrypt、sharp、sqlite3在安装时需要 node-gyp 编译原生 add-on而这需要完整的编译工具链。Alpine 变体默认不带这些工具可按以下方式临时安装、使用后清除FROM node:alpine RUN apk add --no-cache --virtual .gyp python3 py-setuptools make g \ npm install [ your npm dependencies here ] \ apk del .gyp要点解析--virtual .gyp将工具链打包为一个虚拟包便于apk del .gyp一次性彻底清除不留编译残留python3 py-setuptools make gnode-gyp 在当代 Node.js 上所需的最小编译依赖集合。更优做法是多阶段构建——编译工具链只存在于构建阶段最终镜像不携带任何编译器FROM node:alpine as builder ## 安装构建工具链、安装依赖并编译原生模块 RUN apk add --no-cache python3 make g RUN npm install [ your npm dependencies here ] FROM node:alpine as app ## 只拷贝编译产物与二进制不携带工具链 COPY --frombuilder node_modules .这一思路与第十一节「更小的镜像」一脉相承构建期依赖与运行期依赖彻底分离。十一、去掉 npm/yarn 的更小镜像多阶段构建瘦身11.1 原理与背景要移除 npm 与 Yarn标准做法是多阶段构建第一阶段builder用包管理器安装依赖并构建应用第二阶段app只拷贝app与node目录不拷贝 npm 与 Yarn 包管理器。结果是一个更小且更安全无包管理器 → 攻击面缩小的最终镜像。版本背景本仓库 versions.json 与 README.md 明确说明——Yarn v1 Classic 内置于 Node.js 25 及以下的镜像版本固定为 1.22.22见 Dockerfile-debian.templateNode.js 26 及以上的镜像已不再捆绑 Yarn从 26/alpine3.24/Dockerfile 可见已无 Yarn 安装段仅有 node 与 npm。11.2 Alpine 示例ARG ALPINE_VERSION3.23 FROM node:24-alpine${ALPINE_VERSION} AS builder WORKDIR /build-stage COPY package*.json ./ RUN npm ci # Copy the files you need COPY . ./ RUN npm run build FROM alpine:${ALPINE_VERSION} # Create app directory WORKDIR /usr/src/app # Add required binaries RUN apk add --no-cache libstdc dumb-init \ addgroup -g 1000 node adduser -u 1000 -G node -s /bin/sh -D node \ chown node:node ./ COPY --frombuilder /usr/local/bin/node /usr/local/bin/ COPY --frombuilder /usr/local/bin/docker-entrypoint.sh /usr/local/bin/ ENTRYPOINT [docker-entrypoint.sh] USER node # Update the following COPY lines based on your codebase COPY --frombuilder /build-stage/node_modules ./node_modules COPY --frombuilder /build-stage/dist ./dist # Run with dumb-init to not start node with PID1, since Node.js was not designed to run as PID 1 CMD [dumb-init, node, dist/index.js]11.3 Debian 示例FROM node:24-trixie-slim AS builder WORKDIR /build-stage COPY package*.json ./ RUN npm ci # Copy the files you need COPY . ./ RUN npm run build FROM debian:trixie-slim # Create app directory WORKDIR /usr/src/app # Add required binaries RUN apt-get update apt-get install -y --no-install-recommends dumb-init \ rm -rf /var/lib/apt/lists/* \ groupadd --gid 1000 node \ useradd --uid 1000 --gid node --shell /bin/bash --create-home node \ chown node:node ./ COPY --frombuilder /usr/local/bin/node /usr/local/bin/ COPY --frombuilder /usr/local/bin/docker-entrypoint.sh /usr/local/bin/ ENTRYPOINT [docker-entrypoint.sh] USER node # Update the following COPY lines based on your codebase COPY --frombuilder /build-stage/node_modules ./node_modules COPY --frombuilder /build-stage/dist ./dist # Run with dumb-init to not start node with PID1, since Node.js was not designed to run as PID 1 CMD [dumb-init, node, dist/index.js]11.4 关键细节解读npm civsnpm installci严格按package-lock.json安装并校验一致性适合构建阶段保证可复现只拷贝node二进制COPY --frombuilder /usr/local/bin/node /usr/local/bin/仅携带运行时npm/yarn 留在 builder 阶段入口脚本随镜像拷贝拷贝 docker-entrypoint.sh 以保留原镜像「首参非命令则自动补 node」的兼容行为dumb-init 替代 tini 的--initAlpine/Debian 基础镜像中没有 Docker 注入的 init故用dumb-init显式包装node规避 PID 1 信号问题与第四节理论完全对应libstdcAlpine 示例部分原生模块运行时依赖 C 标准库脱离编译工具链后仍需该运行库useradd/adduser重建node用户最终阶段以普通基础镜像起步需按 uid 1000 重建用户以支持USER node基于 Node.js ≥ 26 的镜像无需处理 Yarn因为 Yarn 已不捆绑直接少拷贝一个包管理器即可。小结一套可执行的容器化检查清单关注点推荐做法对应章节运行模式NODE_ENVproduction一npm 版本npm install --global npmversion二全局依赖装到/home/node/.npm-global三信号处理--init/ tini / dumb-init四、十一运行身份-u node/USER 1000五资源限制-m 300M --memory-swap 1G六启动命令CMD [node,index.js]七原生模块Alpine 下临时安装.gyp工具链或多阶段构建十镜像瘦身多阶段构建去掉 npm/yarn十一本文所有配置示例均可在本仓库找到对应的源码依据node用户创建见 Dockerfile-alpine.template 与 Dockerfile-debian.template默认ENTRYPOINT与CMD见 24/bookworm/DockerfileYarn 捆绑差异见 versions.json 与 26/alpine3.24/Dockerfile入口脚本行为见 docker-entrypoint.sh。据此即可构建出安全、可控、精简的生产级 Node.js 容器镜像。赞分享云原生容器运行时【免费下载链接】docker-nodeOfficial Docker Image for Node.js :whale: :turtle: :rocket:项目地址https://gitcode.com/gh_mirrors/do/docker-node点击查看免费下载相关推荐Docker Node.js 官方镜像终极指南10个必知最佳实践Node.js 官方 Docker 镜像为开发者提供了标准化的容器环境让应用部署变得更加简单高效。无论您是 Docker 新手还是经验丰富的 DevOps 工云原生容器运行时Sequencer2d_l.in1k在工业应用中的10个实战案例Sequencer2d_l.in1k在工业应用中的10个实战案例 Sequencer2d_l.in1k是一款基于LSTM的图像分类模型在工业领域具有广泛的应用Gaze-LLE 完全指南从安装到预测的 5 步快速上手教程Gaze LLE 完全指南从安装到预测的 5 步快速上手教程 想要快速掌握计算机视觉中的注视目标估计技术吗Gaze LLEGaze Target Esti上一篇MethylDackel 项目教程下一篇【亲测免费】 LinuxGSM 项目安装与使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
