【问题标题】:bcrypt and Docker bcrypt_lib.node: invalid ELF headerbcrypt 和 Docker bcrypt_lib.node:无效的 ELF 标头
【发布时间】:2023-03-08 15:14:01
【问题描述】:

我在 Node.js 上看到了几个关于 macOS、Docker 和 bcrypt 的问题。 This 似乎是最接近我的问题的答案,但它没有用。

我的Dockerfile

FROM node:6.4.0

COPY . /app
RUN ls -la /app
WORKDIR /app

RUN cd /app; npm install
CMD ["node", "index.js"]

我的.dockerignore 文件:

node_modules

我的package.json 依赖项:

"dependencies": {
  "bcrypt": "1.0.0",
}

当启动容器时,我得到这个错误:

/app/node_modules/bcrypt/build/Release/bcrypt_lib.node: invalid ELF header

Dockerfile 中的ls -la /app 命令我可以看到node_modules 文件夹肯定不是从主机(macOS)复制的:

drwxr-xr-x  6 root root  4096 Dec  7 21:29 .
drwxr-xr-x 47 root root  4096 Dec  7 21:29 ..
-rw-r--r--  1 root root   763 Dec  7 20:55 .dockerignore
-rw-r--r--  1 root root   122 Dec  7 21:18 Dockerfile
rw-r--r--  1 root root 13525 Dec  7 19:43 index.js
-rw-r--r--  1 root root   947 Dec  7 21:28 package.json

bcryptnpm install日志:

> bcrypt@1.0.0 install /app/node_modules/bcrypt
> node-pre-gyp install --fallback-to-build

node-pre-gyp info it worked if it ends with ok
node-pre-gyp info using node-pre-gyp@0.6.30
node-pre-gyp info using node@6.4.0 | linux | x64
node-pre-gyp info check checked for "/app/node_modules/bcrypt/lib/binding/bcrypt_lib.node" (not found)
node-pre-gyp http GET https://github.com/kelektiv/node.bcrypt.js/releases/download/v1.0.0/bcrypt_lib-v1.0.0-node-v48-linux-x64.tar.gz
node-pre-gyp http 404 https://github.com/kelektiv/node.bcrypt.js/releases/download/v1.0.0/bcrypt_lib-v1.0.0-node-v48-linux-x64.tar.gz
node-pre-gyp ERR! Tried to download: https://github.com/kelektiv/node.bcrypt.js/releases/download/v1.0.0/bcrypt_lib-v1.0.0-node-v48-linux-x64.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for bcrypt@1.0.0 and node@6.4.0 (node-v48 ABI) (falling back to source compile with node-gyp)
node-pre-gyp http Pre-built binary not available for your system, looked for https://github.com/kelektiv/node.bcrypt.js/releases/download/v1.0.0/bcrypt_lib-v1.0.0-node-v48-linux-x64.tar.gz
gyp info it worked if it ends with ok
gyp info using node-gyp@3.3.1
gyp info using node@6.4.0 | linux | x64
gyp info ok
gyp info it worked if it ends with ok
gyp info using node-gyp@3.3.1
gyp info using node@6.4.0 | linux | x64
gyp info spawn /usr/bin/python2
gyp info spawn args [ '/usr/local/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py',
gyp info spawn args   'binding.gyp',
gyp info spawn args   '-f',
gyp info spawn args   'make',
gyp info spawn args   '-I',
gyp info spawn args   '/app/node_modules/bcrypt/build/config.gypi',
gyp info spawn args   '-I',
gyp info spawn args   '/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi',
gyp info spawn args   '-I',
gyp info spawn args   '/root/.node-gyp/6.4.0/include/node/common.gypi',
gyp info spawn args   '-Dlibrary=shared_library',
gyp info spawn args   '-Dvisibility=default',
gyp info spawn args   '-Dnode_root_dir=/root/.node-gyp/6.4.0',
gyp info spawn args   '-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp',
gyp info spawn args   '-Dnode_lib_file=node.lib',
gyp info spawn args   '-Dmodule_root_dir=/app/node_modules/bcrypt',
gyp info spawn args   '--depth=.',
gyp info spawn args   '--no-parallel',
gyp info spawn args   '--generator-output',
gyp info spawn args   'build',
gyp info spawn args   '-Goutput_dir=.' ]
gyp info ok
gyp info it worked if it ends with ok
gyp info using node-gyp@3.3.1
gyp info using node@6.4.0 | linux | x64
gyp info spawn make
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
make: Entering directory '/app/node_modules/bcrypt/build'
  CXX(target) Release/obj.target/bcrypt_lib/src/blowfish.o
  CXX(target) Release/obj.target/bcrypt_lib/src/bcrypt.o
  CXX(target) Release/obj.target/bcrypt_lib/src/bcrypt_node.o
  SOLINK_MODULE(target) Release/obj.target/bcrypt_lib.node
  COPY Release/bcrypt_lib.node
  COPY /app/node_modules/bcrypt/lib/binding/bcrypt_lib.node
  TOUCH Release/obj.target/action_after_build.stamp
make: Leaving directory '/app/node_modules/bcrypt/build'
gyp info ok
node-pre-gyp info ok

更新: 我尝试在容器内运行 bcrypt 似乎工作正常:

docker run identity file /app/node_modules/bcrypt/build/Release/bcrypt_lib.node
/app/node_modules/bcrypt/build/Release/bcrypt_lib.node: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=2a9d4a04f6f9c548f8035b9b737c1efac5d774d2, not stripped

【问题讨论】:

  • 无法重现,适用于 Docker 4 Mac 1.12.3 (13776)。
  • 感谢测试。是否重置了 Docker,但没有帮助。
  • 我在我的 Mac 上以及在版本 1.0.1 的 heroku dyno 上安装时遇到这些错误,但 0.8.7 安装时没有错误。我不确定为什么最新的 npm install 引用了不再存在的 url,这可能是一个问题

标签: node.js docker bcrypt macos-sierra


【解决方案1】:

comment from Stefan Scherer 表明我在问题中的代码是有效的并且应该可以工作,并且让我搜索问题的其他原因。

最后我发现是docker-compose.yml将容器作为多个服务的一部分启动的。

问题是由容器的这个 volume 条目引起的:

volumes :
- ../identity/:/app

因此,来自主机的node_modules 文件夹再次映射到容器中,bcrypt ELF 标头确实再次无效。

解决方案是从映射中排除node_modules 文件夹(也解释了here):

volumes :
    /app/node_modules/

【讨论】:

  • 我也有同样的问题,但你的解决方案是什么?我在容器内启动了构建(npm install),但即使在本地删除 node_modules 目录后仍然出现 ELF 错误。
  • 您是否激活了卷映射?
  • 您应该将此添加到您的答案中:stackoverflow.com/questions/29181032/… 它显示了如何从映射中删除目录。这是必要的,因为使用 .dockerignore 对我没有效果。
  • @MattJensen 这正是我最终解决它的方法。将其添加到我的答案中。
  • 对于路径“/app/node_modules”,是否与项目目录相关?
【解决方案2】:

我发现排除整个本地 node_modules 目录不允许您安装 npm 包并让您的 docker 容器动态跟踪容器中的这些更改。为了跟踪其他包更改,请仅指定容器卷中的 bcrypt 目录:

volumes: 
  - .:/app
  - /app/node_modules/bcrypt/

【讨论】:

    【解决方案3】:

    根本原因是 => Docker 上下文。 Docker 上下文正在将所有内容从根文件夹复制到目标容器工作目录。

    因此,您的 node_modules(以及根据您的主机操作系统的加载机制)也被复制到容器工作目录。

    因此您必须添加一个 .dockerignore 文件并添加这些条目(以及您想要忽略的任何其他文件)

    • node_modules
    • npm-debug.log

    现在,当您构建容器时,它将根据容器的操作系统构建所有内容,并且您不会收到无效的 ELF 标头错误

    【讨论】:

      【解决方案4】:

      几个小时后,我找到了根本原因。

      就我而言,我使用了 Docker,我运行 docker-compose up 来启动我的应用程序。 我在 Linux 中构建了我的代码,然后提交了代码,然后我提取了代码在 Window 中使用 Docker 运行了代码 我遇到了这个问题。

      谷歌搜索数小时后我的解决方案是:

      我将文件夹 /node_modules/bcrypt/node_modules/bcrypt-pbkdf (在 Windows 中)替换为我的 Linux PC 中的文件夹 bcryptbcrypt-pbkdf

      比我再次运行docker-composed up 并且它起作用了。

      希望我的分享可以让面临问题的人节省他们的时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-13
        • 2017-08-06
        • 2015-06-14
        • 2013-07-28
        • 2015-10-14
        • 2013-03-26
        • 2021-11-18
        • 2016-11-29
        相关资源
        最近更新 更多