为什么 bcrypt (Node.js) 包会导致“Docker Failed - bcrypt_lib.node: Exec format error”,而许多其他包却没有出现相同的情况?

问题描述 投票:0回答:1

我已经检查了问题node.bcrypt.js存储库中构建docker映像时出错Stack Overflow主题Docker失败 - bcrypt_lib.node:执行格式错误。 Altgough 那里已经提出了一些解决方案,但没有一个让我满意,而且还不清楚为什么 bcrypt 包会导致此错误。

请不要在 Docker 中复制 node_modules。它可以减少您的构建时间并防止发生此类错误。

https://github.com/kelektiv/node.bcrypt.js/issues/824#issuecomment-677485592

不回答这个问题,因为我安装的所有其他软件包都工作正常(我将在附录中列出它们)。而且,这不是解决方案 - 它逃避问题,因为bcrypt包出了问题。

这就是为什么我开始自己的调查,我的第一个问题是为什么 bcrypt 包需要特别关注本身?到底有什么问题呢?为什么与 Docker 的兼容性不好?

docker.compose.yaml

Docker Failed - bcrypt_lib.node: Exec format error主题不同,我没有

Dockerfile
(对于本地开发模式)。另外,需要从
FrontServer
服务启动 Nodemon。

version: "3.5"

services:

  FrontServer:

    image: node:18-alpine
    container_name: Example-Local-FrontServer
    ports: [ "8080:8080" ]

    # [ Theory ] Nodemon will not be found if invoke just "nodemon". See https://linuxpip.org/nodemon-not-found/
    # [ Theory ] About -L flag: https://github.com/remy/nodemon/issues/1802
    command: sh -c "cd var/www/example.com && node_modules/.bin/nodemon -L 03-LocalDevelopmentBuild/FrontServerEntryPoint.js --environment local"

    depends_on: [ Database ]

    volumes:
      - type: bind
        source: .
        target: /var/www/example.com

  Database:

    image: postgres
    container_name: Example-Local-Database
    ports: [ "${DATABASE_PORT}:${DATABASE_PORT}" ]

    environment:

      - "POSTGRES_PASSWORD=${DATABASE_PASSWORD}"

    volumes:
      - DatabaseData:/var/lib/postgresql/data

volumes:
  DatabaseData:
    name: Example-Local-DatabaseData
    driver: local

其他 Node.js 依赖项

bcrypt 不同,以下依赖项不会导致

Exec format error
:

{
  "private": "true",
  "dependencies": {
    "@yamato-daiwa/es-extensions": "1.7.0-alpha.4",
    "@yamato-daiwa/es-extensions-nodejs": "1.7.0-alpha.4",
    "body-parser": "1.20.2",
    "class-transformer": "0.5.1",
    "class-validator": "0.14.0",
    "cors": "2.8.5",
    "express": "4.18.2",
    "express-handlebars": "7.1.2",
    "jsonwebtoken": "9.0.2",
    "morgan": "1.10.0",
    "multer": "1.4.5-lts.1",
    "passport": "0.6.0",
    "passport-jwt": "4.0.1",
    "pg": "8.11.3",
    "qs": "6.11.2",
    "reflect-metadata": "0.1.13",
    "routing-controllers": "0.10.4",
    "typeorm": "0.3.17"
  }
}
node.js docker bcrypt
1个回答
0
投票

通常问题是您下载了针对特定 CPU 架构的 bcrypt,但您在不同的架构上运行容器。

CPU 架构的示例有arm、amd64、powerpc、riscv。这种情况特别发生在像 bcrypt 这样的包中,因为它们附带了编译后的二进制文件,其中大多数包都是纯 Javascript。

© www.soinside.com 2019 - 2024. All rights reserved.