具有节点bcrypt的Docker - 无效的ELF标头

时间:2017-03-15 18:05:46

标签: node.js docker docker-compose

我尝试了this postthis post

的所有解决方案

运行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:
    ...

我的auth服务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
  4. 这对于便携性来说并不理想

2 个答案:

答案 0 :(得分:1)

几次都在苦苦挣扎,如果你遗憾地使用卷,那么“.dockerignore”解决方案就无法工作,因为它只与“复制”命令有关,而且只有在你构建容器时才会有效。

我认为唯一能让我觉得最有意义的解决方案就是只量化你需要的东西,它是什么意思 - 划分你的源代码和“配置”文件(比如package.json):

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

并将卷只放在“src”文件夹中,这样你的构建也会快得多,加上你的节点模块将被构建并安装在正确的操作系统上,但是忘记将.dockerignore添加到node_modules到防止构建形式花费不必要的更长时间

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

答案 1 :(得分:1)

我花了几个小时试图解决这个问题,最后我提出了以下解决方案。 我的撰写文件看起来像这样......

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