为何Node.js的bcrypt包在Docker中触发Exec format错误,其他包却正常?
bcrypt与Docker的Exec format错误疑问
我已经查阅了node.bcrypt.js仓库中关于构建Docker镜像出错的相关讨论,以及Stack Overflow上“Docker失败 - bcrypt_lib.node: Exec format错误”的主题,里面给出的解决方案都没能让我满意,而且我至今搞不懂为什么bcrypt包会引发这个错误。
请勿将node_modules复制到Docker内,这会增加构建时间并避免此类错误发生。
上面这个回复完全没解决我的问题——我安装的其他所有依赖包都能正常运行(清单附在下文),而且这根本不是解决问题,只是绕开问题而已,毕竟根源明明出在bcrypt包上。
于是我自己开始调查,首先就有几个问题想不通:
- 为什么bcrypt包需要特殊处理?
- 它到底存在什么问题?
- 为什么和Docker的兼容性这么差?
docker-compose.yaml
和那个Stack Overflow主题的情况不同,我在本地开发模式下没有使用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错误:
{ "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" } }
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

