最近用 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 端口:
🎉 大功告成!