如何在无网络的Ubuntu Docker镜像中安装Node 16.x、npm及@stoplight/spectral-cli
离线安装npm及@stoplight/spectral-cli(Ubuntu Docker环境)
一、提前准备离线资源(在有网络的机器上操作)
1. 获取对应版本的npm包
Node 16.x系列默认配套npm 8.x版本(比如Node 16.20.0对应npm 8.19.4),直接下载对应版本的npm tar.gz包。
2. 打包@stoplight/spectral-cli离线包
有两种方式获取完整的离线依赖包:
- 方式一:单独打包spectral-cli
在有网环境执行:
执行后会生成类似npm pack @stoplight/spectral-cli@<指定版本> # 比如@6.11.0,不指定则取最新stoplight-spectral-cli-6.11.0.tgz的文件,包含spectral-cli及其所有依赖源码。 - 方式二:打包全局安装后的完整模块
先在有网环境全局安装spectral-cli:
找到npm全局模块路径(执行npm install -g @stoplight/spectral-clinpm root -g,通常为/usr/local/lib/node_modules),然后打包@stoplight目录:tar -czf spectral-cli-offline.tar.gz -C $(npm root -g) @stoplight
将下载好的npm包、spectral离线包,以及你已准备的Node 16安装包,全部放到Docker构建上下文目录(和Dockerfile同目录)。
二、Dockerfile中完成离线安装
1. 安装npm
假设你已完成Node 16的安装,添加以下步骤到Dockerfile:
# 创建npm全局模块目录(避免权限问题) RUN mkdir -p /usr/local/lib/node_modules # 解压npm包到全局模块目录,--strip-components=1去掉包的外层目录 RUN tar -xzf /tmp/npm-8.19.4.tgz -C /usr/local/lib/node_modules --strip-components=1 # 建立软链接到系统PATH,让npm命令全局可用 RUN ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm # 验证安装 RUN npm -v
2. 安装@stoplight/spectral-cli
根据你之前打包的方式选择对应步骤:
- 如果用方式一的单独包:
# 全局安装离线包 RUN npm install -g /tmp/stoplight-spectral-cli-6.11.0.tgz - 如果用方式二的完整模块包:
# 解压到全局模块目录 RUN tar -xzf /tmp/spectral-cli-offline.tar.gz -C /usr/local/lib/node_modules # 建立软链接到系统PATH RUN ln -s /usr/local/lib/node_modules/@stoplight/spectral-cli/bin/spectral.js /usr/local/bin/spectral
最后添加验证命令:RUN spectral --version
完整Dockerfile示例
FROM ubuntu:latest # 复制离线资源到临时目录 COPY node-v16.20.0-linux-x64.tar.xz /tmp/ COPY npm-8.19.4.tgz /tmp/ COPY spectral-cli-offline.tar.gz /tmp/ # 安装Node 16 RUN tar -xJf /tmp/node-v16.20.0-linux-x64.tar.xz -C /usr/local --strip-components=1 RUN ln -s /usr/local/bin/node /usr/bin/node RUN node -v # 安装npm RUN mkdir -p /usr/local/lib/node_modules RUN tar -xzf /tmp/npm-8.19.4.tgz -C /usr/local/lib/node_modules --strip-components=1 RUN ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm RUN npm -v # 安装spectral-cli RUN tar -xzf /tmp/spectral-cli-offline.tar.gz -C /usr/local/lib/node_modules RUN ln -s /usr/local/lib/node_modules/@stoplight/spectral-cli/bin/spectral.js /usr/local/bin/spectral RUN spectral --version # 清理临时文件 RUN rm -rf /tmp/*
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

