构建React应用Docker镜像时RUN npm run build报错该如何处理?
错误根因
你遇到的ERR_OSSL_EVP_UNSUPPORTED报错是Node.js 17及以上版本的兼容性问题:Node 17开始默认使用OpenSSL 3.0,废弃了部分旧版加密算法,而你项目依赖的react-scripts内置的webpack版本较低,默认调用的哈希算法在新OpenSSL环境下不被支持,因此构建失败。
解决方案
方案1:降级使用长期支持版Node(更稳定,推荐)
将Dockerfile中的基础镜像替换为Node 16 LTS版本,该版本的OpenSSL依赖和旧版webpack兼容性更好,修改后的Dockerfile如下:
# 使用Node 16 LTS alpine镜像 FROM node:16-alpine WORKDIR /todo-app ENV PATH="./node_modules/.bin:$PATH" # 复制依赖声明文件安装依赖,优化镜像构建缓存 COPY package.json package-lock.json ./ RUN npm install COPY . . RUN npm run build CMD ["npm", "start"]
方案2:保留Node 17版本,添加兼容参数
如果需要使用Node 17,可以在执行build命令前添加NODE_OPTIONS=--openssl-legacy-provider环境变量,强制使用旧版OpenSSL加密提供者兼容,修改后的Dockerfile如下:
FROM node:17.1-alpine WORKDIR /todo-app ENV PATH="./node_modules/.bin:$PATH" # 复制依赖声明文件安装依赖,优化镜像构建缓存 COPY package.json package-lock.json ./ RUN npm install COPY . . # 执行构建时添加兼容参数 RUN NODE_OPTIONS=--openssl-legacy-provider npm run build CMD ["npm", "start"]
注:你原有的Dockerfile缺少
RUN npm install依赖安装步骤,直接复制全部文件后执行构建会找不到项目依赖,上述两个方案的Dockerfile都已经补充了这一步,同时优化了镜像构建缓存逻辑,减少后续构建的耗时。
内容的提问来源于stack exchange,提问作者Arzath Areeff
相关产品推荐
相关产品推荐

