docker和react出错,数字信封例程::不受支持



我报名参加了一个docker课程,讲师提供了一个入门项目,其中包含一些相当旧的react代码。

我对react项目进行了码头化,下面是简单的Dockerfile:

FROM node
WORKDIR /app
COPY package.json .
RUN npm i
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

然后我构建了图像:

docker build -t goals-react .

并以附加模式运行容器:

docker run --name goals-app --rm -p 3000:3000 goals-react

这是我收到的输出:

> frontend@0.1.0 start
> react-scripts start
ℹ 「wds」: Project is running at http://172.17.0.4/
ℹ 「wds」: webpack output is served from
ℹ 「wds」: Content not from webpack is served from /app/public
ℹ 「wds」: 404s will fallback to /
Starting the development server...
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:67:19)      
at Object.createHash (node:crypto:130:10)
at module.exports (/app/node_modules/webpack/lib/util/createHash.js:135:53)
at NormalModule._initBuildHash (/app/node_modules/webpack/lib/NormalModule.js:417:16)
at handleParseError (/app/node_modules/webpack/lib/NormalModule.js:471:10)
at /app/node_modules/webpack/lib/NormalModule.js:503:5
at /app/node_modules/webpack/lib/NormalModule.js:358:12
at /app/node_modules/loader-runner/lib/LoaderRunner.js:373:3
at iterateNormalLoaders (/app/node_modules/loader-runner/lib/LoaderRunner.js:214:10)
at iterateNormalLoaders (/app/node_modules/loader-runner/lib/LoaderRunner.js:221:10)
/app/node_modules/react-scripts/scripts/start.js:19
throw err;
^
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:67:19)      
at Object.createHash (node:crypto:130:10)
at module.exports (/app/node_modules/webpack/lib/util/createHash.js:135:53)
at NormalModule._initBuildHash (/app/node_modules/webpack/lib/NormalModule.js:417:16)
at /app/node_modules/webpack/lib/NormalModule.js:452:10
at /app/node_modules/webpack/lib/NormalModule.js:323:13
at /app/node_modules/loader-runner/lib/LoaderRunner.js:367:11
at /app/node_modules/loader-runner/lib/LoaderRunner.js:233:18
at context.callback (/app/node_modules/loader-runner/lib/LoaderRunner.js:111:13)
at /app/node_modules/babel-loader/lib/index.js:59:103 {
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
}
Node.js v17.1.0

我认为这是因为react项目使用了旧版本的react,所以我用以下命令升级了package.json文件:

npx npm-check-updates -u
npm install

然后我删除并重新创建了图像,然后运行了一个新的容器:

docker rmi goals-react
docker build -t goals-react .
docker run --name goals-app --rm -p 3000:3000 goals-react

但令我惊讶的是,我收到了同样的错误。所以我在谷歌上搜索了digital envelope routines::unsupported,发现了另一个stackoverflow讨论。

我执行了以下命令:

export NODE_OPTIONS=--openssl-legacy-provider

然后我重建了映像并重新启动了容器,但没有成功。我决定更彻底地阅读错误消息,它似乎是一个webpack错误。我去了webpack github页面,我意识到其他人也有同样的问题,就在这里,但问题已经结束。他们也推荐了上面的命令,但这显然对我不起作用

提前感谢您的反馈和帮助。

编辑

根据@MikiBelavista的要求,这里是package.json文件:

{
"name": "frontend",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^5.15.1",
"@testing-library/react": "^12.1.2",
"@testing-library/user-event": "^13.5.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-scripts": "4.0.3"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}

更改线路

"start": "react-scripts start",

"start": "react-scripts --openssl-legacy-provider start"

但要注意,OpenSSL算法的实现被认为是遗留的。更多OpenSSl

也有同样的问题,我使用了n包并安装了节点16.13.1,这解决了我的问题!

更新package.json"开始";要读取的脚本:

"start": "react-scripts --openssl-legacy-provider start"

请确保重新生成docker映像,否则会出现同样的错误。

docker build --pull --rm -f "Dockerfile" -t yourappname:latest "."

2023年,一个公认的解决方案不起作用,因为节点映像已移动到debian 12,那里没有安装openssl 1.x.x,因此切换到旧的基本映像是有意义的

FROM node:18-bullseye

您应该使用node的LTS版本,因为node.js V17及更高版本将MD4算法迁移到了OpenSSL 3.0的遗留版本中。您应该在Dockerfile中的node选项中指定一个LTS版本,如下所示:

FROM node:16.15.0 

目前16.15.0是LTS,请务必查看最新版本。也不要忘记再次创建图像。顺便说一句,openssl legacy provide的添加是不安全的。

最新更新