別在跑著的容器裡 npm install
客戶專案踩坑
Ricky-
08 月 22,2026

客戶的後端要接電子報寄信,得多裝一個套件。想省事,我們直接對「正在跑」的開發容器下了 docker exec <容器> npm install <套件>。裝完那一刻看起來成功了——直到熱重載觸發,畫面吐出一行:

sh: 1: next: not found        # 連 next 執行檔都不見了
Container travel-backend-web  Exited (255)
症狀

容器起不來,說找不到 next;想再裝一次補救,換來 ENOTEMPTY: rename '.../drizzle-orm'。node_modules 進到一個誰都修不好的半毀狀態。

到底發生什麼

這個開發環境是很常見的組合:原始碼用 bind mount 掛進容器即時改,node_modules 則放在一個具名 volume 裡,避免被主機的空資料夾蓋掉。

問題就在這:npm install 不是「加一個套件」這麼單純,它會重新盤點整個依賴樹、搬移、重寫 node_modules。當我們對一個正在跑、正在讀 node_modules 的容器做這件事,安裝跑到一半的狀態被固化下來——.bin 底下的執行檔(含 next)不見了,還留下一堆半寫入的暫存目錄,於是連重裝都被 ENOTEMPTY 卡住。

開發容器 · /app src/ ← bind mount(主機原始碼,即時改) node_modules/ ← 具名 volume(服務同時正在讀它) 其餘檔案 ← 映像檔層(build 時 COPY) docker exec npm install 邊跑邊重寫 → 半毀 .bin/next 消失
對「正在服務」的容器熱裝套件,等於在別人讀檔時把整個資料夾重寫一遍。

正確的修法

node_modules 這種東西,不該在活著的容器裡「熱補」。把它當成一個建置步驟:先停容器,用一個一次性容器掛上同一個 volume、清空後重跑一次完整安裝,再把服務起回來。

1 · 停掉容器 別邊跑邊改 2 · 一次性容器 清空 volume + 完整重裝 3 · 起服務 ✓ next 回來了
把「裝依賴」搬出執行期、當成一個乾淨的建置步驟來做。
# 停掉服務後,用一次性容器掛同一個 named volume、乾淨重裝
docker run --rm \
  -v "$PWD":/app -v proj_node_modules:/app/node_modules \
  -w /app node:22-slim \
  sh -c 'rm -rf node_modules/* node_modules/.[!.]*; npm install'

更「正規」的做法:改好 package.jsondocker compose build 重建映像檔,讓具名 volume 在下次啟動時從乾淨的映像檔重新填充。

教訓

  • 依賴是建置產物,不是執行期狀態。改 package.json → 重建,別對跑著的容器熱裝。
  • 半毀的具名 volume 症狀很迷惑next: not foundENOTEMPTY);別在原地反覆 install,先清空再裝。
  • 想臨時驗證一個套件,開一次性容器試,別動到正在服務的那個。
帶得走的一句話

docker exec npm install 看起來方便,但它把一個「建置動作」硬塞進執行期,還剛好塞在一個被 volume 遮蓋、又正在被讀取的資料夾上。把裝依賴當成重建映像檔或跑一次性容器,就不會再遇到「連 next 都不見了」。

Tags:
Dockernode_modules


相關文章
用 Gmail 寄信自動化:教你申請應用程式專用密碼
用 Gmail 寄信自動化:教你申請應用程式專用密碼
ricky - 2025-11-28T14:09:23Z
完整教學 Google『應用程式專用密碼』設定流程:說明為何需要 App Password、如何啟用兩步驟驗證、申請 16 位專用密碼,以及使用情境(如系統寄信、Blog 通知信)。圖文步驟詳解,確保...
Neon 睡著時,別讓使用者看到 500
Neon 睡著時,別讓使用者看到 500
ricky - 2026-08-22T09:10:16.630257Z
幫旅遊部落格客戶處理 Neon serverless Postgres 冷啟動 500 的退避重試:只重試暫時性連線錯誤、指數退避、驗證錯誤不重試。
創業起點|開公司不是寫表單,而是做選擇
創業起點|開公司不是寫表單,而是做選擇
ricky - 2025-05-19T14:08:01Z
開公司不只是填寫申請書!這篇文章分享了創業者在設立公司過程中,從公司命名、類型選擇(行號 vs. 有限公司 vs. 股份有限公司)、到稅務考量的實戰經驗與建議。如果你正準備創業,這篇避坑指南絕對值得一...
訂閱電子報
隨時掌握最新的創業故事與設計開發過程
內容包含來自麒航團隊的日常分享、專業知識與工具推薦,助你了解更多創業背後的思維與技術。
麒航私房推薦
Clelereve Blog LogoClelereve Blog LogoClelereve Blog Logo
廣告區
Clelereve Blog Logo
聯絡我們
任何合作或問題請洽:
clelereve@gmail.com
Follow us
Copyright © 2025 blog.clelereve.com - All Rights Reserved
Frontend Version: -- | Backend Version: --
創業實驗筆記 - Clelereve Blog | 別在跑著的容器裡 npm install | Clelereve Blog