Bcrypt:带有 Docker 和 Sails.JS 的无效 ELF 标头
Posted
技术标签:
【中文标题】Bcrypt:带有 Docker 和 Sails.JS 的无效 ELF 标头【英文标题】:Bcrypt: invalid ELF header with Docker and Sails.JS 【发布时间】:2015-11-13 07:53:08 【问题描述】:我的节点Dockfile
:
# Set the base image to ubuntu
FROM ubuntu
# Define working directory
ADD . /src
WORKDIR /src
# Install Node.js & other dependencies
RUN apt-get update && \
apt-get -y install curl && \
apt-get -y install sudo && \
curl -sL https://deb.nodesource.com/setup_0.12 | sudo bash - && \
apt-get -y install python build-essential nodejs
RUN npm install -g node-gyp && \
node-gyp clean && \
npm cache clean
RUN node -v
# Install nodemon
RUN npm install -g nodemon
ADD package.json /src/package.json
RUN cd /src && npm install
# Expose port
EXPOSE 8080
# Run app using nodemon
CMD npm install; nodemon /src/app.js
这是我的docker-compose.yml
:
nginx:
build: ./nginx
links:
- node1:node1
- node2:node2
- node3:node3
ports:
- "80:80"
redis:
image: redis
ports:
- "6379"
node1:
build: ./node
links:
- redis
ports:
- "8080"
node2:
build: ./node
links:
- redis
ports:
- "8080"
node3:
build: ./node
links:
- redis
ports:
- "8080"
docker-compose build
运行成功,Redis/Nginx 设置在docker-compose up
上正确,但节点实例抛出此错误:
node2_1 | /src/node_modules/bcrypt/node_modules/bindings/bindings.js:83
node2_1 | throw e
node2_1 | ^
node2_1 | Error: /src/node_modules/bcrypt/build/Release/bcrypt_lib.node: invalid ELF header
node2_1 | at Error (native)
node2_1 | at Module.load (module.js:355:32)
node2_1 | at Function.Module._load (module.js:310:12)
node2_1 | at Module.require (module.js:365:17)
node2_1 | at require (module.js:384:17)
node2_1 | at bindings (/src/node_modules/bcrypt/node_modules/bindings/bindings.js:76:44)
node2_1 | at Object.<anonymous> (/src/node_modules/bcrypt/bcrypt.js:3:35)
node2_1 | at Module._compile (module.js:460:26)
node2_1 | at Object.Module._extensions..js (module.js:478:10)
node2_1 | at Module.load (module.js:355:32)
node2_1 | at Function.Module._load (module.js:310:12)
node2_1 | at Module.require (module.js:365:17)
node2_1 | at require (module.js:384:17)
node2_1 | at Object.<anonymous> (/src/api/models/User.js:10:14)
node2_1 | at Module._compile (module.js:460:26)
node2_1 | at Object.Module._extensions..js (module.js:478:10)
node2_1 | 19 Aug 20:21:11 - [nodemon] app crashed - waiting for file changes before starting...
我已经搜索了所有内容,但似乎找不到有效的解决方案。我尝试过使用常规设置 url:https://deb.nodesource.com/setup
,特别是安装python2.7
,并使用ubuntu:15.04
图像。
我了解到,当人们在 OS X(我的操作系统)上构建后尝试在 linux 环境上使用 bcrypt 时会发生这种情况,但我认为这不是问题,因为我正在构建所有东西使用 docker 和 boot2docker。
【问题讨论】:
你能展示一个完整的复制器吗? “复制者”是什么意思? 最短的代码,让任何人都可以做和你一样的事情 如果之前的响应没有奏效,从bcrypt 切换到bcryptjs 似乎对我来说很好。 我在 Windows 上使用 Linux Docker 映像。在 Windows 上运行npm install
会将文件同步到 Docker 映像。删除node_modules
并在容器内运行npm install
解决了这个问题。
【参考方案1】:
确保您没有复制 node_modules
文件夹。使用官方的 nodejs “onbuild” 图像时出现此错误,该图像会复制所有内容...
现在我使用:
.dockerignore
node_modules
码头文件
FROM node:6.4.0
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
CMD [ "npm", "start" ]
EXPOSE 6969
编辑:Github 上的官方 NodeJS Docker 启动镜像项目已接受我的拉取请求,该请求指示明确忽略 node_modules。
【讨论】:
这是否意味着每次更改应用程序代码中的某些内容时都必须重建 docker 映像?如果是这样,如果我的package.json
和npm install
中有很多依赖项,可能需要一段时间才能看到实时更改。在这种情况下,它不适合开发目的。【参考方案2】:
我遇到了同样的事情,尽管使用的是 Express,而不是 Sails。我在这里尝试了每一个建议,但没有成功。诀窍是通过 bcryptjs 更改 npm 模块 bcrypt:
npm uninstal bcrypt
npm install bcryptjs --save
然后将您的要求更改为类似
var bcrypt = require('bcryptjs');
现在可以完美运行了。
【讨论】:
尝试将其格式化为基于 S.O. 的答案。指导方针!谢谢! bcrypt-nodejs 不再维护 - 不要使用它,而是使用 bcryptjs【参考方案3】:在我的包配置中,我有 "bcrypt":"^0.8.0"
,当我取出 ^
并将其更改为 "bcrypt":"0.8.0"
时,我能够让一切运行起来。
问题是它试图运行 bcrypt 0.8.5 并且由于某种原因导致了问题。
【讨论】:
很高兴知道是什么导致了这个问题。我检查了Changelog,但没有什么特别突出的。 @Lucas 如果这仍然发生在您身上,请尝试删除 node_modules 文件夹并在 docker 容器中创建一个新的npm install
。 Bcrypt 需要在它运行的架构上构建,所以如果你将它从 OS X 复制到 linux,那么它需要重新构建。虽然我不记得这是否也是这个问题的问题的一部分。
开发人员决定引入重大更改,参见问题 #150 github.com/barrysteyn/node-scrypt/issues/150“好的,我可以抛出错误。”【参考方案4】:
只是为了添加一个新的可能原因。我尝试为 nodejs 应用程序构建我的 docker 映像,但出现错误invalid ELF header
。就我而言
我已经通过从 .dockerignore 文件中添加 node_modules/*
解决了这个问题。
【讨论】:
【参考方案5】:我发现排除整个本地 node_modules
目录不允许您安装 npm 包并让您的 docker 容器动态跟踪容器中的这些更改。我每次都必须重建我的容器。为了避免这种情况,只指定容器卷中的 bcrypt 目录,并允许 docker 在安装或删除其他包时跟踪更改:
volumes:
- .:/app
- /app/node_modules/bcrypt/
【讨论】:
【参考方案6】:根本原因是 => Docker 上下文。 Docker 上下文正在将所有内容从根文件夹复制到目标容器工作目录。
因此您必须添加一个 .dockerignore 文件并添加这些条目(以及您想要忽略的任何其他文件)
node_modules npm-debug.log现在,当您构建容器时,它将根据容器的操作系统构建所有内容。
【讨论】:
【参考方案7】:有一个简单的方法可以让我解决这个问题,我认为这也可以帮助你在 Docker 中,只需在你的 docker 文件的运行指令中添加这个指令
1.卸载 bcrypt
npm uninstall bcrypt
2.- 再次安装 bcrypt
npm i bcrypt
编辑 docker 文件的这一部分,添加行
ADD package.json /src/package.json
RUN cd /src && npm install
#Solve the problem reinstaling bcrypt
RUN npm uninstall bcrypt
RUN npm i bcrypt
# Expose port
EXPOSE 8080
出现错误是因为当你安装 bcypt 时,npm 会为你的机器和操作系统安装推荐的版本,但是当你在另一台机器上时,这不起作用。
-------- 更新 ------------------------------------ -----
在我看来,另一个解决方案是授予 bcrypt 安装 root 权限,这是因为 bcryp 使用自己的用户但它没有权限,所以:
1.您必须授予项目文件夹的 root 权限。走出你的项目文件夹,然后
sudo su
然后输入你的root密码获取root用户权限
2。授予您项目文件夹的权限
chmod -R 777 <project_folder>
3.转到您的项目文件夹并安装 bcrypt
cd <project_folder>
与
npm i bcrypt --unsafe-perm=true --allow-root --save
准备好了,如果一切正常,您的 bcrypt 模块将顺利安装。
【讨论】:
【参考方案8】:我花了很多时间尝试使用docker-copmpose
在docker container
中运行bcrypt
。 Container在Linux
下工作,但是开发是在Windows
下进行的,需要用代码挂载volume,但是bcrypt创建了冲突文件。所以我以后会留下这篇评论。
bcrypt 必须只安装在容器内,并复制到隔离。例如阻塞目录,或者发送到 dev/null
volumes:
- $WORKER_DIR/api:$HOME/api
- /dev/null/:/api/node_modules/bcrypt/
【讨论】:
【参考方案9】:在我的情况下,我通过将这些行添加到 Dockerfile 来修复它
CMD [ "npm", "uninstall", "bcrypt" ]
CMD [ "npm", "install", "bcrypt" ]
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于Bcrypt:带有 Docker 和 Sails.JS 的无效 ELF 标头的主要内容,如果未能解决你的问题,请参考以下文章
连接到在 Docker 容器中运行的数据库时,sails-postgresql“poolSize”太高错误
带有 Node JS 和 Sails JS 的 Facebook Graph API
将 bcrypt 添加到 package.json 时,如何使用 docker node alpine Image 解决“找不到任何要使用的 Python 安装”?