Docker与Node bcrypt - 无效的ELF头

5
我已经尝试了这篇这篇文章中提出的所有解决方案,但无法解决以下错误,该错误在运行docker-compose up时出现:
module.js:598
  return process.dlopen(module, path._makeLong(filename));
                 ^

Error: /code/node_modules/bcrypt/lib/binding/bcrypt_lib.node: invalid ELF header

这是我的最新尝试docker-compose.yml文件:
version: "2"

services:
  app:
    build: ./client
    ports:
      - "3000:3000"
    links:
      - auth
    volumes:
      - ./client:/code
  auth:
    build: ./auth-service
    ports:
      - "3002:3002"
    links:
      - db
    volumes:
      - ./auth-service:/code
  db:
    ...

以下是我的认证服务Dockerfile:

FROM node:7.7.1

EXPOSE 3002

WORKDIR /code

COPY package.json /code

RUN npm install

COPY . /code

CMD npm start

在尝试上述两个链接的解决方案后,我重建了容器,但仍然遇到了相同的错误。值得注意的是,当我不使用docker时,该服务在本地运行良好。如何让docker与bcrypt一起工作?
更新
我通过以下方式使它正常工作:
1. 查找容器的ID:docker ps 2. 访问容器:docker exec -t -i containerId /bin/bash 3. 安装bcrypt:npm install bcrypt 这对于可移植性来说并不理想。

可能听起来有些傻,但请检查您的 package.json 文件中是否存在 bcrypt。同时,请将以下内容添加到您的 .dockerignore 文件中:node_modulesnode_modules/* - Evan P
是的,@EvanP,它在那里。我在.dockerignore中有node_modules id,但没有node_modules/*。我需要两个吗? - Scott
你不需要这样做。另外,请确认一下你所创建的 volume 是否复制了主机上的 node_modules。请注意,volume 不会遵循 .dockerignore.gitignore。它是在 docker run 运行时生成的。 - Evan P
1
似乎有些混淆关于在运行docker-compose up --build时是否考虑.dockerignore文件。从文档中可以看出,确实会考虑.dockerignore文件:https://docs.docker.com/engine/reference/builder/#dockerignore-file - schalkneethling
3个回答

5

我花了几个小时的时间试图解决这个问题,最终我得到了以下解决方案。 我的组合文件看起来像这样...

version: "3"

services:
  server:
    build:
      context: ./server
    volumes:
     - ./server:/usr/src/app
     - /usr/src/app/node_modules/
    ports:
      - 3050:3050
    depends_on:
  - db
command: ["nodemon", "./bin/www"]

第二个卷挂载是非常重要的,因为它可以解决本地node_module问题。
仅供参考,我的dockerfile如下:
FROM node
RUN npm install -g nodemon
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app
RUN npm install
EXPOSE 3050
CMD ["nodemon", "./bin/www"]

工作了。现在...为什么? - jpenna
这听起来像是一个垃圾答案,但bcrypt使用它正在运行的容器的处理器...它不能使用您的本地PC /笔记本电脑... - Intellidroid

0
这个错误出现的原因是,节点模块bcrypt首先在您的原始计算机上编译(特定于您的操作系统),当在docker上构建图像时,由于操作系统不再相同,因此无法运行。解决方法是在您的根文件夹中创建一个.dockerignore文件,并将node_modules添加到此文件中。

0

我曾经遇到过这个问题,如果你使用卷,那么“.dockerignore”解决方案不起作用,因为它只与“Copy”命令有关,并且仅在构建容器时才有效。

我找到的唯一解决方案是,只挂载你需要的内容,也就是将源代码和“配置”文件(例如package.json)分开:

- src
-- morecode
-- morecode2
-- server.js
- index.js
- package.json
- jslint.json
- tsconfig.json
- .env
- .dockerignore
- ... etc

然后只在“src”文件夹上挂载卷,这样你的构建速度也会更快,而且你的node模块将在正确的操作系统上构建和安装。别忘了将node_modules添加到.dockerignore中,以防止构建花费不必要的时间。

请注意,这样做每次添加新包都需要重新构建应用程序,但如果你使用npm最佳实践,并将npm安装分成缓存的docker文件,它将更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接