我已经检查了问题在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 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
与 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"
}
}
通常问题是您下载了针对特定 CPU 架构的 bcrypt,但您在不同的架构上运行容器。
CPU 架构的示例有arm、amd64、powerpc、riscv。这种情况特别发生在像 bcrypt 这样的包中,因为它们附带了编译后的二进制文件,其中大多数包都是纯 Javascript。