将 bcrypt 添加到 package.json 时,如何使用 docker node alpine Image 解决“找不到任何要使用的 Python 安装”?

Posted

技术标签:

【中文标题】将 bcrypt 添加到 package.json 时,如何使用 docker node alpine Image 解决“找不到任何要使用的 Python 安装”?【英文标题】:How to solve "Could not find any Python installation to use" with docker node alpine Image when adding bcrypt to package.json? 【发布时间】:2020-04-15 15:11:18 【问题描述】:

在我将 bcrypt 添加到我的 package.json 之前,一切正常。现在,我收到以下错误消息。

这是我的 package.json 的摘录:

  "dependencies": 
    "bcrypt": "3.0.6",
    "express": "^4.17.1",
    "mongodb": "^3.3.1",
    "nodemailer": "^6.3.0",
    "pm2": "^3.5.1",
    "redis": "^2.8.0",
    "xlsx": "^0.15.0"
  ,

这是我的 dockerfile。我正在使用官方节点高山图像。我想知道 alpine 是否已经安装了 phyton。

FROM node:13.5.0-alpine

WORKDIR /usr/app

COPY ./src .

RUN npm install

我在运行 docker-compose 时收到此错误消息:

node-pre-gyp WARN Using request for node-pre-gyp https download
node-pre-gyp WARN Tried to download(404): https://github.com/kelektiv/node.bcrypt.js/releases/download/v3.0.6/bcrypt_lib-v3.0.6-node-v79-linux-x64-musl.tar.gz
node-pre-gyp WARN Pre-built binaries not found for bcrypt@3.0.6 and node@13.5.0 (node-v79 ABI, musl) (falling back to source compile with node-gyp)
gyp ERR! find Python
gyp ERR! find Python Python is not set from command line or npm configuration
gyp ERR! find Python Python is not set from environment variable PYTHON
gyp ERR! find Python checking if "python" can be used
gyp ERR! find Python - "python" is not in PATH or produced an error
gyp ERR! find Python checking if "python2" can be used
gyp ERR! find Python - "python2" is not in PATH or produced an error
gyp ERR! find Python checking if "python3" can be used
gyp ERR! find Python - "python3" is not in PATH or produced an error
gyp ERR! find Python
gyp ERR! find Python **********************************************************
gyp ERR! find Python You need to install the latest version of Python.
gyp ERR! find Python Node-gyp should be able to find and use Python. If not,
gyp ERR! find Python you can try one of the following options:
gyp ERR! find Python - Use the switch --python="/path/to/pythonexecutable"
gyp ERR! find Python   (accepted by both node-gyp and npm)
gyp ERR! find Python - Set the environment variable PYTHON
gyp ERR! find Python - Set the npm configuration variable python:
gyp ERR! find Python   npm config set python "/path/to/pythonexecutable"
gyp ERR! find Python For more information consult the documentation at:
gyp ERR! find Python https://github.com/nodejs/node-gyp#installation
gyp ERR! find Python **********************************************************
gyp ERR! find Python

gyp ERR! configure error
gyp ERR! stack Error: Could not find any Python installation to use
gyp ERR! stack     at PythonFinder.fail (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/find-python.js:307:47)
gyp ERR! stack     at PythonFinder.runChecks (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/find-python.js:136:21)
gyp ERR! stack     at PythonFinder.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/find-python.js:179:16)
gyp ERR! stack     at PythonFinder.execFileCallback (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/find-python.js:271:16)
gyp ERR! stack     at exithandler (child_process.js:309:5)
gyp ERR! stack     at ChildProcess.errorhandler (child_process.js:321:5)
gyp ERR! stack     at ChildProcess.emit (events.js:305:20)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:273:12)
gyp ERR! stack     at onErrorNT (internal/child_process.js:469:16)
gyp ERR! stack     at processTicksAndRejections (internal/process/task_queues.js:84:21)
gyp ERR! System Linux 4.15.0-47-generic
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "--fallback-to-build" "--module=/usr/app/node_modules/bcrypt/lib/binding/bcrypt_lib.node" "--module_name=bcrypt_lib" "--module_path=/usr/app/node_modules/bcrypt/lib/binding" "--napi_version=5" "--node_abi_napi=napi" "--napi_build_version=0" "--node_napi_label=node-v79"
gyp ERR! cwd /usr/app/node_modules/bcrypt
gyp ERR! node -v v13.5.0
gyp ERR! node-gyp -v v5.0.5
gyp ERR! not ok
node-pre-gyp ERR! build error
node-pre-gyp ERR! stack Error: Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js configure --fallback-to-build --module=/usr/app/node_modules/bcrypt/lib/binding/bcrypt_lib.node --module_name=bcrypt_lib --module_path=/usr/app/node_modules/bcrypt/lib/binding --napi_version=5 --node_abi_napi=napi --napi_build_version=0 --node_napi_label=node-v79' (1)
node-pre-gyp ERR! stack     at ChildProcess.<anonymous> (/usr/app/node_modules/node-pre-gyp/lib/util/compile.js:83:29)
node-pre-gyp ERR! stack     at ChildProcess.emit (events.js:305:20)
node-pre-gyp ERR! stack     at maybeClose (internal/child_process.js:1028:16)
node-pre-gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:286:5)
node-pre-gyp ERR! System Linux 4.15.0-47-generic
node-pre-gyp ERR! command "/usr/local/bin/node" "/usr/app/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd /usr/app/node_modules/bcrypt
node-pre-gyp ERR! node -v v13.5.0
node-pre-gyp ERR! node-pre-gyp -v v0.12.0
node-pre-gyp ERR! not ok
Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js configure --fallback-to-build --module=/usr/app/node_modules/bcrypt/lib/binding/bcrypt_lib.node --module_name=bcrypt_lib --module_path=/usr/app/node_modules/bcrypt/lib/binding --napi_version=5 --node_abi_napi=napi --napi_build_version=0 --node_napi_label=node-v79' (1)
npm WARN testapp@0.0.1 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.11 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.11: wanted "os":"darwin","arch":"any" (current: "os":"linux","arch":"x64")

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! bcrypt@3.0.6 install: `node-pre-gyp install --fallback-to-build`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the bcrypt@3.0.6 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2019-12-24T14_22_05_060Z-debug.log
ERROR: Service 'web' failed to build: The command '/bin/sh -c npm install' returned a non-zero code: 1

我该如何解决这个问题?我必须在 alpine 上安装 phyton 还是只添加 env 变量?如果是这样,请告诉我如何。我已经搜索了解决方案,但没有人工作......

【问题讨论】:

人们喜欢 Alpine 基础镜像,因为它们非常小;因为它们非常小,所以它们不包含您没有明确安装的语言解释器之类的东西。 【参考方案1】:

Linux Alpine 是非常简约的镜像。如果性能不是限制,您可能需要考虑使用官方节点映像,它具有您需要的所有依赖项,只需担心开发:https://github.com/nodejs/docker-node 所以,你可以有一个像这样的 Dockerfile

FROM node:10
WORKDIR /usr/app
COPY ./src .
RUN npm install
EXPOSE 3000 # Use here the port you want to expose

【讨论】:

不是最佳的,但可能是最容易应用的答案【参考方案2】:

在 npm install 之前将它添加到你的 docker 文件中:

RUN apk add --update python make g++\
   && rm -rf /var/cache/apk/*

【讨论】:

这实际上是正确的答案。 npm 构建原生包,node-gyp 依赖于 python。此外,如果您真的不希望在最终映像中使用这些构建工具,则可以使用多阶段构建。 docs.docker.com/develop/develop-images/multistage-build 我认为这应该是公认的答案,因为如果它适用于高山图像,则不需要不必要地使用庞大的节点图像。但目前这对我来说使用 node:14-alpine 版本失败了。【参考方案3】:

为了完整起见:我解决了。

解决方案是将依赖项“bcrypt”替换为“bcryptjs”。

使用 bcryptjs 没有错误。标准节点 docker 镜像和节点 alpine docker 镜像都没有。

【讨论】:

【参考方案4】:

以管理员权限打开 Powershell 并运行此命令,然后继续 bcrypt 安装

Windows:npm install --global --production windows-build-tools

【讨论】:

【参考方案5】:

我已经解决了这个问题,只需从 https://www.python.org/downloads/windows/

【讨论】:

【参考方案6】:

对我来说,问题在于 pg-native 依赖错误地使用了 node-gyp。

从此链接找到解决方案 - node-gyp failure pg-native

从有帮助的评论中摘录:

A:不要意外使用两个不同的数据库库:即 pg 和 pg.js。

B:请谨慎使用 sequelize 之类的东西,您可能在初始化与数据库的连接时标记了“本机”选项。这也经常会导致这个错误。

C:最后,我经常完全删除 pg-native 库。导致与node-gyp不一致的奇怪错误。

【讨论】:

【参考方案7】:

在 Dockerfile 中编写文件以运行节点服务器

FROM node:16.8.0-alpine
ENV SERVER_HOME=/usr/src/server/
WORKDIR $SERVER_HOME
COPY ./package*.json $SERVER_HOME
RUN npm install -g npm@7.24.0
RUN apk add --update python3 make g++ && rm -rf /var/cache/apk/*
RUN npm install
COPY . $SERVER_HOME
#EXPOSE 5000
CMD npm run build
CMD npm run start

我在 alpine 映像中安装节点模块时遇到问题,因此在 alpine 中找不到 python,所以我使用 python3 运行它 RUN apk add --update python3 make g++ && rm -rf /var/cache/apk/* 如果您仍然遇到问题,一切正常,请将 npm install 替换为 npm install --force

【讨论】:

以上是关于将 bcrypt 添加到 package.json 时,如何使用 docker node alpine Image 解决“找不到任何要使用的 Python 安装”?的主要内容,如果未能解决你的问题,请参考以下文章

json 将json-server脚本添加到package.json

sh 将模块添加到package.json

如何将我的 node_module、模块添加到 package.json

即使 ffmpeg 二进制文件已添加到 package.json,“找不到 FFMPEG”

package.json

如何将`yarn.lock`与`package.json`同步?