Docker部署旧React项目报digital envelope routines::unsupported错误如何解决
问题根本原因
你遇到的报错核心是两个依赖版本不匹配导致的:
- 你的Dockerfile使用无版本标签的
node基础镜像,默认拉取最新版Node,你报错日志显示运行的是Node v17+,该版本起默认内置OpenSSL 3.0,废弃了部分旧版哈希算法 - 你项目依赖的
react-scripts@4.0.3内置webpack 4版本,webpack 4的哈希生成逻辑依赖已经被OpenSSL 3.0废弃的算法,直接运行就会抛出ERR_OSSL_EVP_UNSUPPORTED错误
你之前配置的环境变量不生效,是因为你在宿主机本地执行了export命令,该变量仅作用于宿主机当前shell会话,容器运行时无法读取到宿主机的环境变量,因此配置无效。你升级依赖后问题依旧,是因为react-scripts大版本未升级到v5+的情况下,内置webpack版本仍为v4,兼容性问题没有得到解决。
可用解决方案(任选一种即可)
方案1:更换兼容的Node基础镜像(最省心,无额外配置)
将Dockerfile第一行的FROM node修改为使用长期支持且兼容webpack 4的Node 16版本:
FROM node:16-alpine WORKDIR /app COPY package.json . RUN npm i COPY . . EXPOSE 3000 CMD ["npm", "start"]
修改后重新构建镜像启动容器即可正常运行。
方案2:保留新版Node,将兼容环境变量配置到容器内
你可以二选一配置环境变量:
- 修改Dockerfile,在CMD指令前添加环境变量声明:
# 原有配置不变,新增下面一行 ENV NODE_OPTIONS=--openssl-legacy-provider CMD ["npm", "start"] - 启动容器时通过参数传递环境变量:
docker run --name goals-app --rm -p 3000:3000 -e NODE_OPTIONS=--openssl-legacy-provider goals-react
方案3:升级react-scripts到v5+版本
将项目的react-scripts依赖升级到5.0以上版本,该版本内置webpack 5,已经兼容OpenSSL 3.0,升级后重新构建镜像也可以解决问题,但要注意大版本升级可能带来其他项目依赖兼容性问题。
内容的提问来源于stack exchange,提问作者chai
相关产品推荐
相关产品推荐

