web-dev-qa-db-ja.com

Bcrypt:DockerとSails.JSで無効なELFヘッダー

私のNode 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(私のOS)でビルドした後にLinux環境でbcryptを使おうとすると発生することを読みましたが、dockerとを使用してすべてをビルドしているので、それが問題になるとは思いません。 boot2docker。

10
gblock

パッケージ構成には"bcrypt":"^0.8.0"があり、^を取り出して"bcrypt":"0.8.0"に変更すると、すべてを実行できました。

問題は、bcrypt 0.8.5を実行しようとしていて、それが何らかの理由で問題を引き起こしていたことでした。

4
gblock

node_modulesフォルダーをコピーしていないことを確認してください。すべてをコピーする公式のnodejs「onbuild」イメージを使用すると、このエラーが発生しました...

今私は使用します:

.dockerignore

node_modules

dockerfile

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を明示的に無視するように指示するther READMEのプルリクエストを受け入れました。

22

SailsではなくExpressを使用していても、同じことが発生していました。私はここですべての提案を試みましたが成功しませんでした。トリックを作ったのは、bcrypt-nodejsによってnpmモジュールbcryptを変更することでした。

npm uninstal bcrypt
npm install bcrypt-nodejs --save

次に、requireを次のようなものに変更します

var bcrypt   = require('bcrypt-nodejs');

現在、問題なく動作しています。

5
rodurico

新しい考えられる原因を追加するだけです。 nodejsアプリ用のDockerイメージを作成しようとしましたが、エラーinvalid ELF headerが発生しました。私の場合、.dockerignoreファイルからnode_modules/*を追加することで問題を解決しました。

3
Badr Bellaj

ローカル全体を除外することがわかりましたnode_modulesディレクトリでは、npmパッケージをインストールして、Dockerコンテナにコンテナ内の変更をその場で追跡させることはできません。毎回コンテナを再構築する必要があります。これを回避するには、コンテナボリューム内のbcryptディレクトリのみを指定し、他のパッケージがインストールまたは削除されたときにdockerが変更を追跡できるようにします。

volumes: 
  - .:/app
  - /app/node_modules/bcrypt/
0
Andrew Quartey