別在跑著的容器裡 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.json 後 docker compose build 重建映像檔,讓具名 volume 在下次啟動時從乾淨的映像檔重新填充。

教訓

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

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

Tags:
Dockernode_modules


相關文章
從零開始製作一個ip查詢網站-第二章 獲取使用者的IP
從零開始製作一個ip查詢網站-第二章 獲取使用者的IP
chris - 2025-11-29T05:54:37Z
想知道自己的 IP 是多少,並為後續地理定位做準備嗎?這篇文章完整教你如何在 React 網頁中抓取使用者公開 IP,說明為什麼瀏覽器無法直接提供真實 IP,並示範使用免費的 ipify API 快速...
從零開始製作一個ip查詢網站-第三章 透過IP取得地理位置
從零開始製作一個ip查詢網站-第三章 透過IP取得地理位置
chris - 2025-11-29T06:05:00Z
從使用者 IP 取得地理資訊不是難事,但要完整呈現城市、國家、緯度/經度就需要好用的 API 與前端實作。這篇文章示範如何使用 ipapi.co 取得位置資料,並在 React 裡動態顯示使用者所在位...
同一個測驗,我隔三年重寫了一次
同一個測驗,我隔三年重寫了一次
ricky - 2026-08-23T02:50:34.654532Z
2023 年寫的三個線上測驗,2026 年整個重寫。同一份題目、同一個作者,差別不在技術:當初沒問過「他們在什麼情況下用」,而課堂上一群人拿手機填,在程式碼裡留下了一頁到底、id 重複、把觸控目標縮小...
訂閱電子報
隨時掌握最新的創業故事與設計開發過程
內容包含來自麒航團隊的日常分享、專業知識與工具推薦,助你了解更多創業背後的思維與技術。
麒航私房推薦
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