Bcrypt 安装在 Docker 中失败
Bcrypt installation fails in Docker
我用 MongoDB 创建了一个在 Docker 中运行的节点应用程序。在我包含 node.bcrypt.js 之前,它工作正常。这使得节点崩溃 node-gyp
和 bcrypt
.
该应用程序在本地和 Heroku 上运行良好。
我尝试安装一些我在网上找到的建议软件包,根据错误消息知道这些软件包是必需的。这就是为什么我添加了一些额外的依赖项,请参阅下面 dockerfile 中与 node-gyp
相关的行。
现在已经找不到更多建议了,但还是不行。我觉得它在本地和 Heorku 上都有效,但在 Docker 上无效,这很奇怪,因此我缺少它。
提前致谢。
错误:
> crowdshelf-server@1.0.0 start /server
> node index.js
COPY Release/bcrypt_lib.node
make: Leaving directory `/server/node_modules/bcrypt/build'
module.js:338
throw err;
^
Error: Cannot find module './lib/topologies/server'
at Function.Module._resolveFilename (module.js:336:15)
at Function.Module._load (module.js:278:25)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (/server/node_modules/mongodb/node_modules/mongodb-core/index.js:3:13)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
npm ERR! Linux 3.13.0-58-generic
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "start"
npm ERR! node v0.12.7
npm ERR! npm v2.11.3
npm ERR! code ELIFECYCLE
npm ERR! crowdshelf-server@1.0.0 start: `node index.js`
npm ERR! Exit status 1
这是在我向我的 Docker 文件中添加了一些安装之后,请参阅 node-gyp
之后的行。 Docker文件:
# Base Docker-image on Ubuntu
FROM ubuntu:latest
#install mongodb
#install git, curl, python and mongo
# node-gyp
RUN apt-get install -y build-essential make automake gcc g++ cpp libkrb5-dev libc6-dev man-db autoconf pkg-config
# Create the MongoDB data directory
RUN mkdir -p /data/db
# mongodb setup
# Install NodeJS
RUN curl --silent --location https://deb.nodesource.com/setup_0.12 | sudo bash -
RUN apt-get update && apt-get install -y nodejs
RUN npm install -g node-gyp
# Git-clone project
# expose ports
# Install dependencies and start server and database
CMD cd /server && sh start.sh
starth.sh
-脚本仅安装依赖项并启动 MongoDB 和服务器。
编辑:
repo tells me to check out the node-gyp dependencies,但我觉得上面显示的 Docker 文件已经涵盖了。
我通过简单地更改 bcrypt
-library 解决了这个问题。 This one 是基于类似的问题创建的,并提供相同的 API。与我问题中提到的图书馆的唯一区别是:
bcrypt.hash(password, function(err, hash) {
if(!err) callback(hash);
});
而在此答案中链接的那个:
bcrypt.hash(password, null, null, function(err, hash) { // Addd nulls
if(!err) callback(hash);
});
它正在崩溃,因为您缺少一些用于编译 Bcrypt 的基本工具。每次执行 npm install
时都需要编译 Bcrypt,以便为正在运行的 运行 操作系统创建一个版本,因为它是用 C 语言编写的。
对于那些想使用原始 Bcrypt 的用户,您可以 运行 以下 docker 命令:
docker run -t -i --rm -v $(pwd):/app -w /app node:slim sh -c 'apt-get update && apt-get install -y build-essential && apt-get install -y python && npm install'
在我们npm install
之前,我们需要:
- apt-get 更新:确保包管理系统知道要找到我们想要的东西。
- apt-get install -y build-essential: 将安装编译 C 代码所需的所有工具等
- apt-get install -y python:我们添加 python 因为它是必需的,它不包含在
build-essential
包.
一旦我们拥有所有这些东西,我们就可以 运行 npm install
成功 :)
希望对您有所帮助。
我用 MongoDB 创建了一个在 Docker 中运行的节点应用程序。在我包含 node.bcrypt.js 之前,它工作正常。这使得节点崩溃 node-gyp
和 bcrypt
.
该应用程序在本地和 Heroku 上运行良好。
我尝试安装一些我在网上找到的建议软件包,根据错误消息知道这些软件包是必需的。这就是为什么我添加了一些额外的依赖项,请参阅下面 dockerfile 中与 node-gyp
相关的行。
现在已经找不到更多建议了,但还是不行。我觉得它在本地和 Heorku 上都有效,但在 Docker 上无效,这很奇怪,因此我缺少它。
提前致谢。
错误:
> crowdshelf-server@1.0.0 start /server
> node index.js
COPY Release/bcrypt_lib.node
make: Leaving directory `/server/node_modules/bcrypt/build'
module.js:338
throw err;
^
Error: Cannot find module './lib/topologies/server'
at Function.Module._resolveFilename (module.js:336:15)
at Function.Module._load (module.js:278:25)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (/server/node_modules/mongodb/node_modules/mongodb-core/index.js:3:13)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
npm ERR! Linux 3.13.0-58-generic
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "start"
npm ERR! node v0.12.7
npm ERR! npm v2.11.3
npm ERR! code ELIFECYCLE
npm ERR! crowdshelf-server@1.0.0 start: `node index.js`
npm ERR! Exit status 1
这是在我向我的 Docker 文件中添加了一些安装之后,请参阅 node-gyp
之后的行。 Docker文件:
# Base Docker-image on Ubuntu
FROM ubuntu:latest
#install mongodb
#install git, curl, python and mongo
# node-gyp
RUN apt-get install -y build-essential make automake gcc g++ cpp libkrb5-dev libc6-dev man-db autoconf pkg-config
# Create the MongoDB data directory
RUN mkdir -p /data/db
# mongodb setup
# Install NodeJS
RUN curl --silent --location https://deb.nodesource.com/setup_0.12 | sudo bash -
RUN apt-get update && apt-get install -y nodejs
RUN npm install -g node-gyp
# Git-clone project
# expose ports
# Install dependencies and start server and database
CMD cd /server && sh start.sh
starth.sh
-脚本仅安装依赖项并启动 MongoDB 和服务器。
编辑: repo tells me to check out the node-gyp dependencies,但我觉得上面显示的 Docker 文件已经涵盖了。
我通过简单地更改 bcrypt
-library 解决了这个问题。 This one 是基于类似的问题创建的,并提供相同的 API。与我问题中提到的图书馆的唯一区别是:
bcrypt.hash(password, function(err, hash) {
if(!err) callback(hash);
});
而在此答案中链接的那个:
bcrypt.hash(password, null, null, function(err, hash) { // Addd nulls
if(!err) callback(hash);
});
它正在崩溃,因为您缺少一些用于编译 Bcrypt 的基本工具。每次执行 npm install
时都需要编译 Bcrypt,以便为正在运行的 运行 操作系统创建一个版本,因为它是用 C 语言编写的。
对于那些想使用原始 Bcrypt 的用户,您可以 运行 以下 docker 命令:
docker run -t -i --rm -v $(pwd):/app -w /app node:slim sh -c 'apt-get update && apt-get install -y build-essential && apt-get install -y python && npm install'
在我们npm install
之前,我们需要:
- apt-get 更新:确保包管理系统知道要找到我们想要的东西。
- apt-get install -y build-essential: 将安装编译 C 代码所需的所有工具等
- apt-get install -y python:我们添加 python 因为它是必需的,它不包含在
build-essential
包.
一旦我们拥有所有这些东西,我们就可以 运行 npm install
成功 :)
希望对您有所帮助。