最近用 Bun 开发了个小工具,期间因为感觉安装 Bun 有点会污染自己本机环境,毕竟这些正在发展的东西更新迭代很快,不喜欢安装好之后,之后还得折腾一番去卸载或者升级。于是经过一些资料搜索和 AI 的帮助下,通过 Docker 去将 Bun.js 环境部署到本机。
安装 Docker#
我是使用 Mac 设备的,所以我为了方便安装的是 Docker Desktop 来管理 Docker 应用,可以在 官网 进行下载。
拉取 Bun 的 Image#
如果使用命令行:
docker pull oven/bun
使用图形化界面:
将 oven/bun
这个镜像 Pull 下来。
需求#
- Bun 的项目文件存放在本机而不是 Docker 中
- 需要能映射运行后的访问端口出来
- 运行完毕或手动停止(Ctrl+C)后需停止并删除 Docker 容器
编辑指令设置环境变量#
在 .zshrc 或者 .bashrc (Mac 设备环境中)文件中加入下面的 Function 函数,避免每次运行都需要写一长串指令,加入后注意保存并 source
以让其生效。
bun() {
local port=${1:-8080}
# 添加--init参数使Docker容器正确处理信号(如Ctrl+C),
# 它会在容器内运行一个init进程作为PID 1,
# 这个进程可以正确转发信号给应用程序
if [[ $1 =~ ^[0-9]+$ ]]; then
docker run -it --rm -w /app -v "$(pwd)":/app -p ${port}:${port} --init oven/bun bun "${@:2}"
else
docker run -it --rm -w /app -v "$(pwd)":/app -p 8080:8080 --init oven/bun bun "$@"
fi
}
使用方法#
我们可以尝试通过初始化一个 Bun 项目来验证是否可行:
bun init
🎉 没有问题!能正常创建并初始化项目!下面我们试试创建一个服务器,并且映射 3001 端口出来,因为 Bun 环境还是运行在 Docker 容器内,所以我们需要把宿主机的 3001 端口映射到容器的 3001 端口中,上面提到这些都不需要再去设置,因为我们上面设置在环境变量里面的命令已经帮你做好了,我们只需要提前把需要映射的端口号写到运行命令里面即可。
我们给刚才初始化好的 Bun 项目中的 index.ts
里加入一段官方 Demo 代码:
const server = Bun.serve({
port: 3001,
fetch(request) {
return new Response("Welcome to Bun!");
},
});
console.log(`Listening on localhost:${server.port}`);
然后带端口号运行命令:
bun 3001 run index.ts
访问一下本机 3001 端口:
🎉 大功告成!