Node.JS:尝试 运行 docker 项目 docker-compose up 由于 node-sass 和 node-gyp

Node.JS: Trying to run docker project with docker-compose up exits due to node-sass and node-gyp

我正在尝试从 MacBook Air M1 运行 我的 Docker 工作项目之一,但在执行 docker-compose up 时出现以下错误。显然 它找不到 python 安装 ,即使我可以从终端执行 python --versionpython3 --version。我是 Docker 的新手,但我尝试对所有可能的问题进行故障排除以解决此错误

#8 91.79 info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
#8 91.79 error /app/node_modules/node-sass: Command failed.
#8 91.79 Exit code: 1
#8 91.79 Command: node scripts/build.js
#8 91.79 Arguments: 
#8 91.79 Directory: /app/node_modules/node-sass
#8 91.79 Output:
#8 91.79 Building: /usr/local/bin/node /app/node_modules/node-gyp/bin/node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library=
#8 91.79 gyp info it worked if it ends with ok
#8 91.79 gyp verb cli [
#8 91.79 gyp verb cli   '/usr/local/bin/node',
#8 91.79 gyp verb cli   '/app/node_modules/node-gyp/bin/node-gyp.js',
#8 91.79 gyp verb cli   'rebuild',
#8 91.79 gyp verb cli   '--verbose',
#8 91.79 gyp verb cli   '--libsass_ext=',
#8 91.79 gyp verb cli   '--libsass_cflags=',
#8 91.79 gyp verb cli   '--libsass_ldflags=',
#8 91.79 gyp verb cli   '--libsass_library='
#8 91.79 gyp verb cli ]
#8 91.79 gyp info using node-gyp@7.1.2
#8 91.79 gyp info using node@16.13.0 | linux | arm64
#8 91.79 gyp verb command rebuild []
#8 91.79 gyp verb command clean []
#8 91.79 gyp verb clean removing "build" directory
#8 91.79 gyp verb command configure []
#8 91.79 gyp verb find Python Python is not set from command line or npm configuration
#8 91.79 gyp verb find Python Python is not set from environment variable PYTHON
#8 91.79 gyp verb find Python checking if "python3" can be used
#8 91.79 gyp verb find Python - executing "python3" to get executable path
#8 91.79 gyp verb find Python - "python3" is not in PATH or produced an error
#8 91.79 gyp verb find Python checking if "python" can be used
#8 91.79 gyp verb find Python - executing "python" to get executable path
#8 91.79 gyp verb find Python - "python" is not in PATH or produced an error
#8 91.79 gyp verb find Python checking if "python2" can be used
#8 91.79 gyp verb find Python - executing "python2" to get executable path
#8 91.79 gyp verb find Python - "python2" is not in PATH or produced an error
#8 91.79 gyp ERR! find Python 
#8 91.79 gyp ERR! find Python Python is not set from command line or npm configuration
#8 91.79 gyp ERR! find Python Python is not set from environment variable PYTHON
#8 91.79 gyp ERR! find Python checking if "python3" can be used
#8 91.79 gyp ERR! find Python - "python3" is not in PATH or produced an error
#8 91.79 gyp ERR! find Python checking if "python" can be used
#8 91.79 gyp ERR! find Python - "python" is not in PATH or produced an error
#8 91.79 gyp ERR! find Python checking if "python2" can be used
#8 91.79 gyp ERR! find Python - "python2" is not in PATH or produced an error
#8 91.79 gyp ERR! find Python 
#8 91.79 gyp ERR! find Python **********************************************************
#8 91.79 gyp ERR! find Python You need to install the latest version of Python.
#8 91.79 gyp ERR! find Python Node-gyp should be able to find and use Python. If not,
#8 91.79 gyp ERR! find Python you can try one of the following options:
#8 91.79 gyp ERR! find Python - Use the switch --python="/path/to/pythonexecutable"
#8 91.79 gyp ERR! find Python   (accepted by both node-gyp and npm)
#8 91.79 gyp ERR! find Python - Set the environment variable PYTHON
#8 91.79 gyp ERR! find Python - Set the npm configuration variable python:
#8 91.79 gyp ERR! find Python   npm config set python "/path/to/pythonexecutable"
#8 91.79 gyp ERR! find Python For more information consult the documentation at:
#8 91.79 gyp ERR! find Python https://github.com/nodejs/node-gyp#installation
#8 91.79 gyp ERR! find Python **********************************************************
#8 91.79 gyp ERR! find Python 
#8 91.79 gyp ERR! configure error 
#8 91.79 gyp ERR! stack Error: Could not find any Python installation to use
#8 91.79 gyp ERR! stack     at PythonFinder.fail (/app/node_modules/node-gyp/lib/find-python.js:302:47)
#8 91.79 gyp ERR! stack     at PythonFinder.runChecks (/app/node_modules/node-gyp/lib/find-python.js:136:21)
#8 91.79 gyp ERR! stack     at PythonFinder.<anonymous> (/app/node_modules/node-gyp/lib/find-python.js:179:16)
#8 91.79 gyp ERR! stack     at PythonFinder.execFileCallback (/app/node_modules/node-gyp/lib/find-python.js:266:16)
#8 91.79 gyp ERR! stack     at exithandler (node:child_process:404:5)
#8 91.79 gyp ERR! stack     at ChildProcess.errorhandler (node:child_process:416:5)
#8 91.79 gyp ERR! stack     at ChildProcess.emit (node:events:390:28)
#8 91.79 gyp ERR! stack     at Process.ChildProcess._handle.onexit (node:internal/child_process:288:12)
#8 91.79 gyp ERR! stack     at onErrorNT (node:internal/child_process:477:16)
#8 91.79 gyp ERR! stack     at processTicksAndRejections (node:internal/process/task_queues:83:21)
#8 91.79 gyp ERR! System Linux 5.10.47-linuxkit
#8 91.79 gyp ERR! command "/usr/local/bin/node" "/app/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
#8 91.79 gyp ERR! cwd /app/node_modules/node-sass
#8 91.79 gyp ERR! node -v v16.13.0
#8 91.79 gyp ERR! node-gyp -v v7.1.2
#8 91.79 gyp ERR! not ok 
#8 91.79 Build failed with error code: 1

我尝试了错误提示的所有操作 - 设置 python 的路径变量,并尝试将 NPM 的配置设置为 python 的路径,但没有成功...

我也尝试将节点降级到 v16,因为节点-sass 6.0.1 与节点 v17 不兼容 according to the docs

我通过自制软件安装了 python 3.9.8,并且 运行ning which python3 输出 /opt/homebrew/bin/python3

node -v: v16.13.0

npm -v: v8.1.0

echo $PATH: /Library/Frameworks/Python.framework/Versions/3.10/bin /opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

npm config list:


prefix = "/opt/homebrew" 

; "global" config from /opt/homebrew/etc/npmrc

; python = "/opt/homebrew/opt/python@3.9/libexec/bin" ; overridden by user

; "user" config from /Users/**username**/.npmrc

python = "/opt/homebrew/opt/python@3.9/libexec/bin" 

问题:

python 安装在您本地的 macbook 上,但不在 docker 容器内(这是一个独立的虚拟 os)。

解决方案

您需要将 python 安装在与 运行 安装 nodejs 脚本或 npm 命令的同一容器中。

在 dockerFile

中拉取 nodejs 镜像后尝试添加这个
RUN apt-get update || : && apt-get install python -y

这适用于 debian 或基于 debian 的 linux 发行版 ...(如果您有基于 debian 的官方 Node 映像,那么上一行应该在您拉取映像后立即正常工作 运行 你需要在同一个容器中安装 python。

简单的解决方案

npm uninstall node-sass
npm install sass -S -D

Node Sass to Dart Sass Before v4.3.0, this project was built based on node-sass, but node-sass low-level dependencies libsass, resulting in many users installing Especially difficult for Windows users, it forces users to install python2 and Visual Studio in the windows environment to compile successfully.

So in order to solve this problem, this project was modified to build dart-sass in v4.3.0, it can guarantee performance Under the premise of greatly simplifying the user's installation costs. Through this issue the relevant comments below can be known, install` Node-sass is such a troublesome thing.

There is a more important reason for choosing to use dart-sass here. Officially, sass has taken dart-sass as the main development direction in the future. Any new features will be supported first, and it It has been running steadily in the community for a long time, and there are basically no pits. The main reason why dart-sass is easy to install is because it will be compiled into pure js, so that it can be used directly in the node environment. Although its running speed will be slower than that based on libsass, the difference in these speeds is almost negligible. The entire community is now embracing dart-sass, and we have no reason to refuse! And it does greatly simplify the user's installation costs.

Currently, vue-cli will also prefer to use dart-scss by default when selecting sass preprocessing, related: pr

https://panjiachen.github.io/vue-element-admin-site/guide/advanced/sass.html#upgrade-plan