bcrypt 和 Docker bcrypt_lib.node:无效的 ELF header
bcrypt and Docker bcrypt_lib.node: invalid ELF header
我在 Node.js 上看到了几个关于 macOS、Docker 和 bcrypt
的问题。 似乎是最接近我的问题的答案,但没有用。
我的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
bcrypt
npm 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-compose.yml
作为多个服务的一部分启动容器引起的。
问题是由容器的 volume
条目引起的:
volumes :
- ../identity/:/app
因此主机中的node_modules
文件夹再次被映射到容器中,bcrypt ELF头确实再次无效。
解决方案是从映射中排除 node_modules
文件夹( 也有解释):
volumes :
/app/node_modules/
我发现排除整个本地 node_modules
目录不允许您安装 npm 包并让您的 docker 容器动态跟踪容器中的那些更改。为了跟踪其他包更改,仅指定容器卷中的 bcrypt 目录:
volumes:
- .:/app
- /app/node_modules/bcrypt/
根本原因是 => Docker 上下文。 Docker 上下文正在将所有内容从您的根文件夹复制到目标容器工作目录。
因此您的 node_modules(根据您的主机 OS 的加载机制)也被复制到容器工作目录。
所以你必须添加一个 .dockerignore 文件并添加这些条目(以及你想忽略的任何其他文件)
- node_modules
- npm-debug.log
现在,当您构建容器时,它将根据容器的 OS 构建所有内容,并且您不会收到无效的 ELF header 错误
几个小时后,我找到了根本原因。
就我而言,我使用Docker,运行docker-compose up
来启动我的应用程序。
我在 Linux 中构建了我的代码 ,然后 提交了代码 ,然后我 提取了代码 和 运行 Docker 在 Window 中的代码,我遇到了问题。
我在 google 小时后搜索的解决方案是:
我替换文件夹/node_modules/bcrypt和/node_modules/bcrypt- pbkdf(在 Windows 中)由文件夹 bcrypt 和 bcrypt-pbkdf 来自我的 Linux PC。
比我 运行 docker-composed up
再次成功。
希望我的分享可以让遇到问题的人节省时间。
我在 Node.js 上看到了几个关于 macOS、Docker 和 bcrypt
的问题。
我的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
bcrypt
npm 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-compose.yml
作为多个服务的一部分启动容器引起的。
问题是由容器的 volume
条目引起的:
volumes :
- ../identity/:/app
因此主机中的node_modules
文件夹再次被映射到容器中,bcrypt ELF头确实再次无效。
解决方案是从映射中排除 node_modules
文件夹(
volumes :
/app/node_modules/
我发现排除整个本地 node_modules
目录不允许您安装 npm 包并让您的 docker 容器动态跟踪容器中的那些更改。为了跟踪其他包更改,仅指定容器卷中的 bcrypt 目录:
volumes:
- .:/app
- /app/node_modules/bcrypt/
根本原因是 => Docker 上下文。 Docker 上下文正在将所有内容从您的根文件夹复制到目标容器工作目录。
因此您的 node_modules(根据您的主机 OS 的加载机制)也被复制到容器工作目录。
所以你必须添加一个 .dockerignore 文件并添加这些条目(以及你想忽略的任何其他文件)
- node_modules
- npm-debug.log
现在,当您构建容器时,它将根据容器的 OS 构建所有内容,并且您不会收到无效的 ELF header 错误
几个小时后,我找到了根本原因。
就我而言,我使用Docker,运行docker-compose up
来启动我的应用程序。
我在 Linux 中构建了我的代码 ,然后 提交了代码 ,然后我 提取了代码 和 运行 Docker 在 Window 中的代码,我遇到了问题。
我在 google 小时后搜索的解决方案是:
我替换文件夹/node_modules/bcrypt和/node_modules/bcrypt- pbkdf(在 Windows 中)由文件夹 bcrypt 和 bcrypt-pbkdf 来自我的 Linux PC。
比我 运行 docker-composed up
再次成功。
希望我的分享可以让遇到问题的人节省时间。