用 Docker 架設 Manga Image Translator(GPU 版)
Manga Image Translator 是一套可以自動辨識並翻譯漫畫圖片文字的工具。這篇主要記錄我怎麼透過 Docker,把它的 Web 服務架在有 NVIDIA GPU 的主機上,讓後續翻譯速度更穩定,也比較省手。
撰文時間:2026 年 7 月。
本文使用的映像標籤是浮動版本:main,如果官方後續調整啟動方式或參數,本文內容可能也要跟著修改。
先看重點
這次能順利跑起來,關鍵主要有三個:
- 主機的 Docker 必須真的抓得到 NVIDIA GPU。
docker compose設定不能完全照官方範例直接套用。- 啟動參數裡的
--nonce None不能省略。
如果你前面 GPU 驗證沒有過,建議先不要急著往下做,不然後面看到容器啟動失敗、模型載入卡住,會很難判斷到底是哪一層出問題。
前置作業
正式啟動前,我這邊先準備兩個項目:
- Docker
- NVIDIA Container Toolkit
第二項很重要,因為它負責讓容器可以使用宿主機的 GPU 與 CUDA 能力。若這一層沒裝好,即使容器有成功啟動,也不代表 GPU 真的有被用到。
安裝完成後,先拿官方 CUDA 範例映像做驗證,確認 Docker 是否真的看得到顯示卡:
|
|
只要輸出中有正確列出顯示卡型號,並且能跑出 benchmark 結果,大致上就代表 GPU 已經可以在容器內正常使用:
|
|
如果這一步就失敗,建議先回頭檢查 NVIDIA 驅動、Docker 版本,以及 NVIDIA Container Toolkit 是否安裝完成。先把這一關排除,後面會輕鬆很多。
設定 docker compose 檔案
我這裡是以官方提供的 docker-compose-web-with-gpu.yml 為基礎再做調整。實際測試時,如果完全照官方檔案直接跑,服務不一定能順利提供 API,所以我最後改成下面這個版本:
|
|
這份設定和官方版本相比,我主要做了幾個調整:
- 補上
--nonce None。 - 把
entrypoint和command拆開,直接執行server/main.py。 - 補上
--host=0.0.0.0,讓容器外部也能連進來。 - 先把
volumes註解掉,避免一開始就被掛載內容影響判斷。
為什麼 --nonce None 這麼重要?
這裡要特別注意,傳入的是字串 None,不是 Python 裡的 None 物件。
也就是說,請直接照下面這種方式寫:
|
|
不要改成只寫 --nonce,也不要整段拿掉。少了這個參數時,表面上看起來服務像是有啟動,但實際上容器內部的 API 呼叫可能不會正常工作。這一點算是這次最容易踩到的坑。
--nonce None 是否真的有帶上。關於翻譯後端設定
上面的 environment 我只保留自己實際有使用到的 Ollama 設定。若你要串接其他翻譯來源,例如 DeepL、OpenAI、Gemini、DeepSeek、Sakura、百度、有道、Groq、彩雲等,可以再去官方範例檔把對應的環境變數補上。
官方參考檔案:
另外還有一個很常見的問題,如果你的翻譯後端是跑在宿主機上,例如自架 Sakura 或 Ollama,位址不要直接填 127.0.0.1。
因為對容器來說,127.0.0.1 指的是容器自己,不是宿主機,所以它根本連不到主機上的服務。這種情況應改用:
host.docker.internal- 宿主機的區網 IP
啟動服務
設定完成後,就可以直接啟動:
|
|
第一次啟動時,容器通常還會下載偵測、OCR、修復等模型,所以不一定會立刻好。這段時間可以用下面指令持續觀察:
|
|
等到日誌裡出現服務開始監聽的訊息後,就可以用瀏覽器開啟下面這個位址:
|
|
如果畫面能正常打開,接著再測一次實際翻譯請求,確認模型下載、GPU 使用、翻譯後端三者都沒有問題。
搭配 ComicRead 使用
服務跑起來之後,我自己會再搭配瀏覽器腳本 ComicRead 使用。這樣在線上看漫畫時,就可以直接呼叫本機這套翻譯服務,不需要每次都手動上傳圖片。
如果你本來就有在用 ComicRead,這種串接方式其實很方便,整體體驗會比手動丟圖省事很多。
我這次踩到的點
這次整理下來,我覺得最值得先記住的是下面三件事:
- 先驗證 GPU,再處理應用程式本身。
- 官方 compose 範例不一定能直接套在自己的環境。
- 宿主機服務位址不要亂寫成
127.0.0.1。
很多 Docker 相關問題,表面看起來像是應用程式壞掉,實際上常常是 GPU 沒掛進去、容器網路觀念搞混,或啟動參數少一個值。把這幾個點先排掉,通常就能省下不少除錯時間。
心智圖
小結
如果只是想把 Manga Image Translator 快速跑起來,其實整體不算太難,真正麻煩的反而是 GPU、容器網路與啟動參數這三塊。尤其 --nonce None 這個細節,如果沒記下來,真的會卡很久。
後續如果我要再往下玩,大概會繼續補兩個方向:
- 把
volumes掛回去,保留輸出結果。 - 針對不同翻譯後端整理一份可直接切換的設定範本。