Deno应用部署至fly.io时遇Bcrypt模块找不到错误求助
解决Deno部署fly.io时bcrypt找不到原生模块的问题
问题根源
- Deno默认不执行npm包的生命周期脚本(比如bcrypt的
postinstall,负责编译原生二进制文件),除非配置nodeModulesDir: auto - bcrypt是原生Node模块,需要在部署环境中安装编译依赖才能生成对应平台的
.node文件
方案一:启用nodeModulesDir并添加编译依赖
1. 配置deno.json
在项目根目录创建或修改deno.json,添加以下配置:
{ "nodeModulesDir": "auto" }
2. 修改Dockerfile
添加编译依赖,并在构建阶段执行install触发脚本:
# Based on https://github.com/denoland/deno_docker/blob/main/alpine.dockerfile ARG DENO_VERSION=2.0.6 ARG BIN_IMAGE=denoland/deno:bin-${DENO_VERSION} FROM ${BIN_IMAGE} AS bin FROM frolvlad/alpine-glibc:alpine-3.13 # 安装bcrypt编译所需的gcc、g++、make、python3 RUN apk --no-cache add ca-certificates gcc g++ make python3 RUN addgroup --gid 1000 deno \ && adduser --uid 1000 --disabled-password deno --ingroup deno \ && mkdir /deno-dir/ \ && chown deno:deno /deno-dir/ ENV DENO_DIR /deno-dir/ ENV DENO_INSTALL_ROOT /usr/local ARG DENO_VERSION ENV DENO_VERSION=${DENO_VERSION} COPY --from=bin /deno /bin/deno WORKDIR /deno-dir COPY . . # 执行install命令触发npm包的postinstall脚本,编译bcrypt原生模块 RUN deno install --allow-all main.ts ENTRYPOINT ["/bin/deno"] CMD ["run", "--allow-all", "main.ts"]
方案二:改用纯JS实现的bcryptjs
如果不想处理编译依赖,推荐使用纯JavaScript实现的bcryptjs,无需编译原生模块:
- 将代码中的bcrypt导入替换为:
import bcrypt from "npm:bcryptjs";
- 移除Dockerfile中的编译依赖安装步骤,保持原有配置即可
验证部署
修改完成后,重新执行fly.io部署命令:
fly deploy
内容的提问来源于stack exchange,提问作者Jonny Love
相关产品推荐
相关产品推荐

