Skip to content

bun 运行时的 EACCES 错误

这两天原有的 bun 项目突然出现了 EACCES 错误,导致项目无法正常运行。

问题描述

项目使用 docker 构建并生成镜像,服务端运行镜像。错误信息如下:

shell
bun ./dist/index.js
error: EACCES reading "/app/node_modules/proxy-from-env/index.js"
error: script "start" exited with code 1

问题分析

字面错误信息是无法读取 proxy-from-env 模块,但是这个模块是存在的,而且在本地运行时也没有问题。 查看模块下的文件,也都是存在的,那会不会是权限原因呢?查看权限

shell
> ls -lh
total 58
-rw-r-----  2 root  wheel   1.1K  4 17 00:52 LICENSE
-rw-r-----  2 root  wheel   5.1K  4 17 00:52 README.md
-rw-r-----  2 root  wheel   3.3K  4 17 00:52 index.js
-rw-r-----  2 root  wheel   956B  4 17 00:52 package.json
-rw-r-----  2 root  wheel    17K  4 17 00:52 test.js

果然这个包的权限不对。

查看 proxy-from-env 的依赖关系,是 axios 的需要的。这个包应用十分广泛,应该不会有太大问题,不然其他平台早保留出来了。 看来应该是其他运行时会忽略这个权限问题,而 bun 不会忽略这个

两种解决方案

1、修改权限

既然是权限问题,那就在构建时修改权限。

dockerfile
# ...
RUN bun install --production
RUN chmod 644 /app/node_modules/proxy-from-env/

构建时安装依赖后,讲 proxy-from-env 的权限修改为 644。

2、修改 build 配置

build.ts 中修改配置

typescript
await Bun.build({
    entrypoints: ['./src/index.ts'],
    outdir: './dist',
    target: 'bun',
    // external: ['hono', 'axios'],
    external: ['hono'], // external 字段里去掉 axios
});

external 字段,将 axios 移除,这样 bun build 时就会将 axios 打包进运行代码里面,也就不会出现权限问题。

总结

bun 是一个很好的工具,但还是比较新,在一些细节处理上还有待完善。这次的问题也是一个小问题,但是要花时间解决,希望后续版本能够更加完善。

Released under the MIT License.