在 Docker 中配置 npm 和 pnpm 使用镜像源

在 Docker 中构建前端应用时,使用 npm 或 pnpm 安装依赖是必不可少的步骤。然而,由于网络环境的限制,直接访问官方的 npm 源可能会非常缓慢甚至失败。为了解决这个问题,我们可以配置 npm 和 pnpm 使用国内的淘宝镜像源。本篇博客将介绍如何在 Dockerfile 中正确配置这些包管理工具以使用镜像源,从而加快依赖的安装速度。

1. 配置 npm 使用镜像源

你可以在 Dockerfile 中通过几种方式来让 npm 使用镜像源。最常见的方法:

直接在 npm install 命令中指定镜像源

# 使用官方 Node.js 镜像
FROM node:16

# 设置工作目录
WORKDIR /app

# 复制项目文件
COPY . .

# 使用淘宝镜像源安装 npm 依赖
RUN npm install --registry=https://registry.npmmirror.com/

可以通过设置环境变量的方式来配置 npm 使用镜像源

# 使用官方 Node.js 镜像
FROM node:16

# 设置工作目录
WORKDIR /app

# 设置 npm registry 环境变量
ENV NPM_CONFIG_REGISTRY=https://registry.npmmirror.com/

# 复制项目文件
COPY . .

# 安装依赖
RUN npm install

2. 配置 pnpm 使用镜像源

同样是两种常见操作

# 使用官方 Node.js 镜像
FROM node:16

# 设置工作目录
WORKDIR /app

# 设置 pnpm 的 registry 镜像源
RUN pnpm config set registry https://registry.npmmirror.com/

# 复制项目文件
COPY . .

# 安装依赖
RUN pnpm install

直接在执行 pnpm install 时指定镜像源。

# 使用官方 Node.js 镜像
FROM node:16

# 设置工作目录
WORKDIR /app

# 复制项目文件
COPY . .

# 使用淘宝镜像源安装 pnpm 依赖
RUN pnpm install --registry=https://registry.npmmirror.com/

重点:强制使用代理

上面命令中直接代理有时候仍然发现请求失败,看地址还是使用了非镜像地址使用,我们要额外选项优化 pnpm 安装

在某些情况下,即使指定了镜像源,pnpm 仍然可能访问 nodejs.org,这是由于锁定文件或缓存的影响。你可以使用以下命令来优化 pnpm 的安装过程:

# 使用官方 Node.js 镜像
FROM node:16

# 设置工作目录
WORKDIR /app

# 复制项目文件
COPY . .

# 使用淘宝镜像源,并禁用锁定文件的冻结检查和优先使用本地缓存
RUN pnpm install --registry=https://registry.npmmirror.com --no-frozen-lockfile --prefer-offline
  • --no-frozen-lockfile: 允许 pnpm 重新解析依赖关系,不严格依赖 pnpm-lock.yaml 文件中的版本和源。
  • --prefer-offline: 优先使用本地缓存中的包,减少对外部网络的依赖。

至此应该就没有问题了,如果强解锁lock文件还不行,那最后强制 npm 和 pnpm 使用代理服务器

如果你需要绕过网络限制,可以通过设置代理服务器的方式来强制 npm 和 pnpm 请求通过代理。

# 使用官方 Node.js 镜像
FROM node:16

# 设置工作目录
WORKDIR /app

# 设置代理环境变量
ENV HTTP_PROXY=http://your-proxy-server:port
ENV HTTPS_PROXY=http://your-proxy-server:port

# 复制项目文件
COPY . .

# 安装依赖
RUN npm install
# 或者
RUN pnpm install

结论

在 Docker 中构建 Node.js 应用时,配置 npm 和 pnpm 使用国内的镜像源,可以显著提高依赖安装的速度和稳定性。因为一些未知原因,我们也必须要做这些多余的操作。

通过这些配置,你将能够在网络环境受限的情况下,依然快速、高效地构建你的前端应用。希望这篇博客能为你提供实用的指导,如果你有更多问题或建议,欢迎在评论区分享!