Linux ELF标头或Docker容器中bcrypt的安装问题

Linux ELF标头或Docker容器中bcrypt的安装问题,linux,node.js,docker,bcrypt,boot2docker,Linux,Node.js,Docker,Bcrypt,Boot2docker,有点长,但是有没有人在linux容器(特别是docker)中使用bcrypt有任何问题,并且知道自动解决方法?我和这两个人有同样的问题: 我的Dockerfile # Pull base image FROM node:0.12 # Expose port 8080 EXPOSE 8080 # Add current directory into path /data in image ADD . /data # Set working directory to /data WORKD

有点长,但是有没有人在linux容器(特别是docker)中使用bcrypt有任何问题,并且知道自动解决方法?我和这两个人有同样的问题:

我的Dockerfile

# Pull base image
FROM node:0.12

# Expose port 8080
EXPOSE 8080

# Add current directory into path /data in image
ADD . /data

# Set working directory to /data
WORKDIR /data

# Install dependencies from package.json
RUN npm install --production

# Run index.js
CMD ["npm", "start"]
# Pull base image
FROM node:0.12

# Expose port 8080
EXPOSE 8080

# Add current directory into path /data in image
ADD . /data

# Set working directory to /data
WORKDIR /data

# Install dependencies from package.json
RUN npm install --production

# Run index.js
CMD npm install --production; npm start
如果我的node_模块中已经安装了bcrypt,则会出现前面提到的无效ELF头错误,但是如果我删除了它(无论是它本身还是我的所有软件包),则在构建容器时,由于某种原因它不会被安装。在构建之后,我必须手动输入容器并在其中安装它

是否有自动化的解决方法


或者,仅仅是,什么是使用节点堆栈的bcrypt的好替代方案

好的,我有一个自动工作区:

在CMD指令中调用
npm install--production
。我将挥手想一想为什么我必须在执行容器时安装bcrypt,但它是有效的

更新的Dockerfile

# Pull base image
FROM node:0.12

# Expose port 8080
EXPOSE 8080

# Add current directory into path /data in image
ADD . /data

# Set working directory to /data
WORKDIR /data

# Install dependencies from package.json
RUN npm install --production

# Run index.js
CMD ["npm", "start"]
# Pull base image
FROM node:0.12

# Expose port 8080
EXPOSE 8080

# Add current directory into path /data in image
ADD . /data

# Set working directory to /data
WORKDIR /data

# Install dependencies from package.json
RUN npm install --production

# Run index.js
CMD npm install --production; npm start

利亚姆的评论是关于钱的,只是在为未来的互联网旅行者扩展

问题是您已将node_modules文件夹复制到容器中。这是一个问题的原因是bcrypt是一个本机模块。它不仅是javascript,而且是在安装时编译的一堆C代码

编译产生的二进制文件存储在node_modules文件夹中,并根据构建位置进行定制。将他们从OSX的家中移植到一个陌生的Linux世界会导致他们行为不端,抱怨精灵头和精灵脚

解决方案是
echo node\u modules>>。dockerginore
并作为Dockerfile的一部分运行
npm install
。这意味着本机模块将在容器内部而不是在笔记本电脑上的容器外部进行编译

有了它,就不需要在启动CMD之前运行npm安装。只要在Dockerfile的构建阶段使用它就可以了

protip:默认情况下,官方节点映像设置node_ENV=production,npm将其视为--production标志。大多数时候,这是一件好事。如果Dockerfile还包含一些依赖于开发人员依赖项(webpack等)的构建步骤,这不是一件好事。在这种情况下,您需要
NODE\u ENV=null npm install

proprotip:通过将package.json单独复制到代码的其余部分,可以更好地利用Docker的缓存。使您的Dockerfile如下所示:

# Pull base image
FROM node:0.12

# Expose port 8080
EXPOSE 8080

# Set working directory to /data
WORKDIR /data

# Set working directory to /data
COPY package.json /data

# Install dependencies from package.json
RUN npm install

# Add current directory into path /data in image
ADD . /data

# Run index.js
CMD npm start

这样Docker只会在您更改package.json时重新运行
npm install
,而不是每次更改一行代码。

node\u modules/在您的.dockrignore文件中吗?不是,尽管这是一个很好的提醒,提醒您注意,我甚至没有意识到是您!谢谢你看。哈哈,我一周前就有这个问题了。在容器中安装依赖项,而不是将当前目录(包括deps)复制到容器中,为我解决了这个问题。根据对上述问题的注释忽略
node\u模块
,是正确的方法。另外请注意,如果您使用的是
docker compose
version<1.5,它无法正确处理
.dockrignore
。先生,您不仅是一名喜剧演员,还是一名天才-非常感谢:)