Docker部署Bun+Hono应用时bcrypt/argon2模块缺失问题求助
Bun应用Docker化时@node-rs模块缺失问题修复
问题场景
集成Hono、better-sqlite3和Lucia的Bun应用,本地执行bun run src/index.tsx完全正常,但Docker容器启动时抛出模块缺失错误:
bun-app-1 | error: Cannot find module "@node-rs/argon2-wasm32-wasi" from "/app/node_modules/@node-rs/argon2/index.js" bun-app-1 | error: Cannot find module "@node-rs/bcrypt-wasm32-wasi" from "/app/node_modules/@node-rs/bcrypt/binding.js" bun-app-1 | error: Cannot find module "@node-rs/argon2-linux-arm64-gnu" from "/app/node_modules/@node-rs/argon2/index.js" bun-app-1 exited with code 1
核心原因
@node-rs/argon2和@node-rs/bcrypt是平台架构绑定的原生模块,本地安装时会适配你的主机CPU架构,但Docker容器的运行架构(比如arm64)可能和本地不一致;另外slim版Bun镜像缺少编译、加载这些模块所需的系统依赖。
修复方案
1. 开发环境配置调整
修订Dockerfile.dev
补充安装编译原生模块的依赖,并强制重新安装适配容器架构的包:
# syntax=docker/dockerfile:1 ARG BUN_VERSION=1.0.25-slim FROM oven/bun:${BUN_VERSION} as base LABEL fly_launch_runtime="Bun" WORKDIR /app ENV NODE_ENV="development" ENV PORT 3000 EXPOSE $PORT COPY package.json bun.lockb ./ FROM base AS development # 安装编译原生模块必须的系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ pkg-config \ python-is-python3 # 强制安装适配容器架构的依赖,覆盖本地锁文件可能绑定的架构信息 RUN bun install --force COPY . . CMD ["bun", "run", "src/index.tsx"]
调整docker-compose.yml
移除本地node_modules的挂载,避免本地主机架构的依赖覆盖容器内的适配版本:
version: '3' services: bun-app: build: context: . dockerfile: Dockerfile.dev ports: - 3000:3000 env_file: - ./.env # 移除原有/app/node_modules挂载项,确保容器内用自己安装的依赖
2. 生产环境配置优化
修订Dockerfile.prod,确保构建阶段依赖完整,且复制正确的模块文件:
# syntax=docker/dockerfile:1 ARG BUN_VERSION=1.0.25-slim FROM oven/bun:${BUN_VERSION} as base LABEL fly_launch_runtime="Bun" WORKDIR /app ENV NODE_ENV="production" FROM base AS build # 安装编译依赖 RUN apt-get update -qq && \ apt-get install --no-install-recommends -y build-essential pkg-config python-is-python3 COPY package.json bun.lockb ./ # 强制安装适配容器架构的生产依赖 RUN bun install --ci --force COPY --link . . FROM base COPY --from=build /app /app ENV PORT 3000 EXPOSE $PORT CMD ["bun", "run", "src/index.tsx"]
3. 额外排查建议
- 检查
package.json:如果是Lucia通过oslo引入的@node-rs模块,确认oslo版本与Bun、Docker环境兼容 - 尝试非slim镜像:用
oven/bun:1.0.25(非slim)替代slim镜像,避免系统库缺失 - 重置依赖缓存:本地删除
node_modules和bun.lockb后,重新在容器内执行安装,避免锁文件绑定本地架构信息
内容的提问来源于stack exchange,提问作者yamakasi
相关产品推荐
相关产品推荐

