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.jsonnpm 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-copmposedocker 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 标头的主要内容,如果未能解决你的问题,请参考以下文章

带有护照推特的sails.js

_id 找不到带有 Mongo 的 Sails.js

连接到在 Docker 容器中运行的数据库时,sails-postgresql“poolSize”太高错误

Sails.js 中的 JWT 和护照

带有 Node JS 和 Sails JS 的 Facebook Graph API

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