在Docker容器中使用bcrypt的ELF标头或安装问题

时间:2015-07-24 07:10:53

标签: linux node.js docker bcrypt boot2docker

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

Invalid ELF header with node bcrypt on AWSBox

bcrypt invalid elf header when running node app

我的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"]

如果我的node_modules中已经安装了bcrypt,我得到前面提到的无效ELF头错误,但是如果我将其删除(只是本身或我的所有包),在构建容器时由于某种原因没有安装它。我必须在构建后手动输入容器并将其安装在内部。

是否有自动解决方法?

或者,也许,只是,对于使用Node堆栈的bcrypt来说,什么是一个很好的替代方案?

3 个答案:

答案 0 :(得分:8)

利亚姆对这笔钱进行了评论,只是为未来的互联网旅行者进行了扩展。

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

来自该编译的二进制文件存储在node_modules文件夹中,并且它们被自定义到它们构建的位置。将它们从OSX家中移植到一个奇怪的Linux领域会导致它们行为不端并抱怨ELF标题和仙女脚。

解决方案是echo node_modules >> .dockerignore并运行npm install作为Dockerfile的一部分。这意味着本机模块将在内部容器中进行编译,而不是在笔记本电脑外部进行编译。

有了这个,就不需要在启动CMD之前运行npm install。只是在Dockerfile的构建阶段就可以了。

protip:官方节点映像默认设置为NODE_ENV = production,其中npm与--production标志相同。大多数时候这是一件好事。当您的Dockerfile还包含一些依赖于dev依赖项(webpack等)的构建步骤时,是一件好事。在这种情况下,您需要NODE_ENV=null npm install

pro protip:你可以通过将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,而不是每次更改一行代码时都会重新运行。{/ p>

答案 1 :(得分:3)

好的,我有一个有效的自动解决方法:

在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 install --production; npm start

答案 2 :(得分:0)

在 Dockerfile 中的 RUN npm install 之前添加此命令

RUN apk --no-cache add --virtual builds-deps build-base python3

它对我有用。也许它对你有用:)