我實際做的是隔離資料環境,不是把 agent 關進容器
當 AI coding agent 能讀程式、執行指令、修改資料庫時,我最先想避免的是:它為了驗證一個功能,直接連到正式資料庫,或把真實客戶資料帶進日常開發流程。
所以我引入 Docker,起一套本地 PostgreSQL。它保留正式環境的資料庫結構、角色與權限規則;需要比較接近真實業務的測試時,再匯入經過遮罩的種子資料。開發環境與正式資料庫沒有直接連線,AI 和工程師使用的是同一套可重建的本地環境。
這裡有個必須說清楚的差別:Docker 跑的是本地資料庫,不代表 AI agent 的程序也被 Docker 隔離。 這個做法降低了誤操作正式資料與把真實個資帶進開發的風險;它不是完整的 agent 沙盒,也不能單靠它阻止 agent 讀取主機檔案或對外傳送資料。
正式資料庫
│ 由人控制的匯出與欄位遮罩
▼
受控的種子檔(不進 Git,仍視為敏感資料)
│ 載入
▼
本地 Docker PostgreSQL ← 遷移、角色與權限規則
▲
│ 本地連線
應用程式、工程師與 AI coding agent
本地專案 ──沒有直接連線── 正式資料庫
為什麼不用一個空資料庫就好
空庫能測「表能不能建立」,卻很難測跨市場的訂單、會員關係、優惠券、權限與狀態流轉。若 AI 只看一小段程式碼、沒有可重現的業務資料,它可能寫出能通過單元測試,卻不符合既有流程的改動。
本地庫因此保留真實的 schema、遷移、資料庫角色與列級存取規則,另外放入明顯是測試用途的帳號和案例。遮罩種子保留測試所需的資料關係,但姓名、聯絡方式及自由文字等欄位必須先依政策處理。起環境與重建資料庫都有固定流程;改壞本地資料時可以重來,不需要「借正式庫看一下」。
遮罩規則不是臨時寫幾條搜尋取代。每個欄位都要被分類;新增欄位若沒有決定如何處理,型別檢查與測試就會提醒。產生種子時也做個資樣式掃描,降低遺漏的機會。這些是防線,不是匿名化的完美證明:自由文字可能漏網,保留下來的交易數字、業務關係也仍有商業敏感性。因此種子檔不進公開儲存庫;能在本地使用,也不代表可以交給任何外部模型。
工具在本地執行,結果仍可能送到模型端
這是需要另外看的一條資料流:agent 在本機執行 SQL、讀檔或跑測試,工具輸出可能被加入下一次模型請求。沒有手動貼上資料,不代表模型沒有收到資料;連測試失敗時印出的整筆物件,都可能帶出原本想留在本地的內容。以 Claude 的 client tools 為例,應用程式執行工具後,會透過 tool_result 把結果送回模型。Anthropic:Tool use
本地資料庫 → 查詢/測試輸出 → Agent 上下文 → 遠端模型服務
因此,選用 AI 工具時還應確認:
- 資料是否需要來自正式環境? 能用合成帳號、訂單與狀態重現的測試,就優先用合成資料。需要遮罩種子時,另確認使用授權與可讀範圍。
- 模型會收到哪些內容? 限制工具可查的資料與回傳欄位,避免整表查詢、原始檔或完整物件進入上下文;必要的檢查可只回傳通過/失敗及不含敏感內容的摘要。
- 接收方是否被核准處理這些資料? 確認服務與帳號設定、保留與訓練政策、處理地區及契約要求。即使網路只允許連到模型供應商,也不表示所有資料都能傳過去。
這些是使用遠端 agent 時應另行確認的條件,不是 Docker 或現有遮罩流程自動提供的保證。
這道邊界究竟解決了什麼
它讓 agent 可以在接近正式環境的結構上跑遷移、測試查詢與驗證功能,同時不持有正式資料庫的連線資訊。人要更新種子時,才透過受控流程匯出、遮罩、檢查後交接。對我來說,這比只在 prompt 寫「不要碰正式資料」可靠:限制來自環境與資料流,而不只是指示。
但如果 agent 仍在主機上執行,它可能讀到主機上其他有權限的檔案,也可能因為不可信內容的指令而嘗試連外。Simon Willison 把「私密資料、不可信輸入、對外通訊」同時存在時的風險稱為 lethal trifecta;Anthropic 也主張檔案權限與網路邊界要一起設計。這些風險不會因為資料庫跑在 Docker 裡就自動消失。Simon Willison、Anthropic Engineering
若下一步要把 agent 本身放進容器或專用沙盒,那是另一個設計決策:只掛需要的工作目錄、控制對外網路、不交付正式憑證,也不要隨意開放主機的 Docker socket。一般 Docker 容器的 bind mount 預設可寫;容器名稱本身不等於安全邊界。Docker bind mounts、Docker Engine security
我從這次實作學到的是:先辨認 AI 開發真正需要碰的資料與系統,再把不需要碰的正式環境排除在工作路徑之外。本地 Docker 資料庫解決的是其中一段重要問題;agent 程序隔離、外連控制與人工審查,仍要各自處理。