Bcrypt:带有 Docker 和 Sails.JS 的无效 ELF header

Bcrypt: invalid ELF header with Docker and Sails.JS

我的节点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 图像。

我读到,当人们尝试在 linux env 上使用 bcrypt 时,它是在 OS X(我的 OS)上构建的,但我不知道不认为这是问题,因为我正在使用 docker 和 boot2docker.

构建所有内容

在我的包配置中,我有 "bcrypt":"^0.8.0",当我取出 ^ 并将其更改为 "bcrypt":"0.8.0" 时,我能够得到所有 运行ning。

问题是它试图 运行 bcrypt 0.8.5 并且由于某种原因导致了问题。

确保您没有复制 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 入门图像项目已接受我对 README 的拉取请求,其中指示明确忽略 node_modules.

只是为了添加一个新的可能原因。我尝试为 nodejs 应用构建我的 docker 图像,但出现错误 invalid ELF header。就我而言 我通过从 .dockerignore 文件中添加 node_modules/* 解决了这个问题。

我遇到了同样的事情,即使使用的是 Express,而不是 Sails。我在这里尝试了所有建议但没有成功。诀窍是通过 bcryptjs 更改 npm 模块 bcrypt:

npm uninstal bcrypt
npm install bcryptjs --save

然后将您的要求更改为

var bcrypt   = require('bcryptjs');

它现在运行完美。

我发现排除整个本地 node_modules 目录不允许您安装 npm 包并让您的 docker 容器动态跟踪容器中的那些更改。我每次都必须重建我的容器。为避免这种情况,仅指定容器卷中的 bcrypt 目录,并允许 docker 在安装或删除其他包时跟踪更改:

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

有一个简单的方法可以让我解决这个问题,我认为这对 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>

AND

npm i bcrypt --unsafe-perm=true --allow-root --save

准备就绪,如果一切正常,您的 bcrypt 模块将毫无问题地安装。

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

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

  • node_modules
  • npm-debug.log

现在,当您构建容器时,它将根据容器的 OS.

构建所有内容

我花了很多时间尝试 运行 bcryptdocker container 中使用 docker-copmpose。 Container在Linux下工作,但开发是在Windows下进行的,需要用代码挂载volume,但是bcrypt创建了冲突文件。所以我以后会留下这篇评论。 bcrypt 必须只安装在容器内,并复制以隔离。例如阻止目录,或发送到 dev/null

    volumes:
      - ${WORKER_DIR}/api:${HOME}/api
      - /dev/null/:/api/node_modules/bcrypt/

在我的例子中,我通过将这些行添加到 Dockerfile 来修复它

CMD [ "npm", "uninstall", "bcrypt" ]
CMD [ "npm", "install", "bcrypt" ]