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

cha*_*hai 3 node.js docker reactjs webpack

我已经注册了 docker 课程,并且讲师提供了一个带有一些相当旧的 React 代码的入门项目。

\n

我对 React 项目进行了 docker 化,这是简单的 Dockerfile:

\n
FROM node\n\nWORKDIR /app\n\nCOPY package.json .\n\nRUN npm i\n\nCOPY . .\n\nEXPOSE 3000\n\nCMD ["npm", "start"]\n
Run Code Online (Sandbox Code Playgroud)\n

然后我构建了图像:

\n
docker build -t goals-react .\n
Run Code Online (Sandbox Code Playgroud)\n

并以附加模式运行容器:

\n
docker run --name goals-app --rm -p 3000:3000 goals-react\n
Run Code Online (Sandbox Code Playgroud)\n

这是我收到的输出:

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

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

\n
npx npm-check-updates -u\nnpm install\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
docker rmi goals-react\ndocker build -t goals-react .\ndocker run --name goals-app --rm -p 3000:3000 goals-react\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

我执行了以下命令:

\n
export NODE_OPTIONS=--openssl-legacy-provider\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

预先感谢您的任何反馈和帮助。

\n

编辑

\n

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

\n
FROM node\n\nWORKDIR /app\n\nCOPY package.json .\n\nRUN npm i\n\nCOPY . .\n\nEXPOSE 3000\n\nCMD ["npm", "start"]\n
Run Code Online (Sandbox Code Playgroud)\n

Mik*_*sta 6

改变你的线路

"start": "react-scripts start",
Run Code Online (Sandbox Code Playgroud)

"start": "react-scripts --openssl-legacy-provider start"
Run Code Online (Sandbox Code Playgroud)

但请注意,OpenSSL 实现的算法已被视为遗留算法。更多OpenSSL

  • 这似乎是个坏主意,对吧?有没有不涉及使用不安全加密的解决方案? (2认同)