带有节点 bcrypt 的 Docker — 无效的 ELF 标头

Sco*_*ott 5 node.js docker docker-compose

我已经尝试了这篇文章和这篇文章中的所有解决方案

我没有找到解决运行时出现以下错误的解决方案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
Run Code Online (Sandbox Code Playgroud)

这是我最近的尝试 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:
    ...
Run Code Online (Sandbox Code Playgroud)

我的身份验证服务 Dockerfile:

FROM node:7.7.1

EXPOSE 3002

WORKDIR /code

COPY package.json /code

RUN npm install

COPY . /code

CMD npm start
Run Code Online (Sandbox Code Playgroud)

在尝试了上述两个链接中的每个解决方案后,我重建了容器,但总是导致相同的错误。

同样值得注意的是,当我不使用 docker 时,该服务在本地运行良好。

如何让 docker 与 bcrypt 一起工作?

更新

我能够通过执行以下操作来使其工作:

  1. 查找容器的 id: docker ps
  2. 访问容器: docker exec -t -i containerId /bin/bash
  3. 安装 bcrypt: npm install bcrypt

这对于便携性来说并不理想

Int*_*oid 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"]
Run Code Online (Sandbox Code Playgroud)

第二个卷挂载很重要,因为它解决了本地 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"]
Run Code Online (Sandbox Code Playgroud)


roy*_*roy 0

曾多次遇到这个问题,如果您遗憾地使用卷,“.dockerignore”解决方案将无法工作,因为它仅与“复制”命令相关,并且仅在构建容器时相关。

我发现的唯一我认为最有意义的解决方案是仅存储您需要的内容,这意味着什么 - 划分源代码和“配置”文件(例如 package.json):

- 源代码
-- 更多代码
-- 更多代码2
-- 服务器.js
- 索引.js
- 包.json
- jslint.json
- tsconfig.json
-.env
- .dockerignore
- ... ETC

并将卷仅放在“src”文件夹中,这样您的构建也会更快,而且您的节点模块将在正确的操作系统上构建和安装,不要忘记将 .dockerignore 添加到 node_modules 以防止构建形成花费不必要的较长时间

请注意,这样做将需要在每次添加新包时重新构建应用程序,但如果您使用 npm 最佳实践并将 npm 安装划分到要缓存的 docker 文件中,速度会更快