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.
构建所有内容
我花了很多时间尝试 运行 bcrypt
在 docker 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" ]
我的节点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.
构建所有内容我花了很多时间尝试 运行 bcrypt
在 docker 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" ]