Contents

用 Docker 架設 Manga Image Translator(GPU 版)

Manga Image Translator 是一套可以自動辨識並翻譯漫畫圖片文字的工具。這篇主要記錄我怎麼透過 Docker,把它的 Web 服務架在有 NVIDIA GPU 的主機上,讓後續翻譯速度更穩定,也比較省手。

撰文時間:2026 年 7 月。
本文使用的映像標籤是浮動版本 :main,如果官方後續調整啟動方式或參數,本文內容可能也要跟著修改。

先看重點

這次能順利跑起來,關鍵主要有三個:

  1. 主機的 Docker 必須真的抓得到 NVIDIA GPU。
  2. docker compose 設定不能完全照官方範例直接套用。
  3. 啟動參數裡的 --nonce None 不能省略。

如果你前面 GPU 驗證沒有過,建議先不要急著往下做,不然後面看到容器啟動失敗、模型載入卡住,會很難判斷到底是哪一層出問題。

前置作業

正式啟動前,我這邊先準備兩個項目:

  1. Docker
  2. NVIDIA Container Toolkit

第二項很重要,因為它負責讓容器可以使用宿主機的 GPU 與 CUDA 能力。若這一層沒裝好,即使容器有成功啟動,也不代表 GPU 真的有被用到。

安裝完成後,先拿官方 CUDA 範例映像做驗證,確認 Docker 是否真的看得到顯示卡:

1
docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

只要輸出中有正確列出顯示卡型號,並且能跑出 benchmark 結果,大致上就代表 GPU 已經可以在容器內正常使用:

1
2
3
4
> Compute 8.6 CUDA device: [NVIDIA GeForce RTX 3060 Laptop GPU]
30720 bodies, total time for 10 iterations: 30.227 ms
= 312.206 billion interactions per second
= 6244.114 single-precision GFLOP/s at 20 flops per interaction

如果這一步就失敗,建議先回頭檢查 NVIDIA 驅動、Docker 版本,以及 NVIDIA Container Toolkit 是否安裝完成。先把這一關排除,後面會輕鬆很多。

小提示
如果你只是想先確認 GPU 通不通,不一定要先拉 Manga Image Translator 映像。先用 CUDA 範例測試,除錯會單純很多。

設定 docker compose 檔案

我這裡是以官方提供的 docker-compose-web-with-gpu.yml 為基礎再做調整。實際測試時,如果完全照官方檔案直接跑,服務不一定能順利提供 API,所以我最後改成下面這個版本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
services:
  manga_image_translator:
    image: zyddnys/manga-image-translator:main
    container_name: manga_image_translator_gpu
    entrypoint: python
    command: server/main.py --verbose --nonce None --start-instance --host=0.0.0.0 --port=5003 --use-gpu
    # volumes:
    #   - ./../../result:/app/result
    #   - ./../../server/main.py:/app/server/main.py
    #   - ./../../server/instance.py:/app/server/instance.py
    ports:
      - 5003:5003
    ipc: host
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]
    environment:
      CUSTOM_OPENAI_API_KEY: 'ollama'
      CUSTOM_OPENAI_API_BASE: 'http://192.168.50.193:11434/v1'
      CUSTOM_OPENAI_MODEL: 'gemma3n:e4b'
      CUSTOM_OPENAI_MODEL_CONF: 'gemma3n'

這份設定和官方版本相比,我主要做了幾個調整:

  1. 補上 --nonce None
  2. entrypointcommand 拆開,直接執行 server/main.py
  3. 補上 --host=0.0.0.0,讓容器外部也能連進來。
  4. 先把 volumes 註解掉,避免一開始就被掛載內容影響判斷。

為什麼 --nonce None 這麼重要?

這裡要特別注意,傳入的是字串 None,不是 Python 裡的 None 物件。

也就是說,請直接照下面這種方式寫:

1
--nonce None

不要改成只寫 --nonce,也不要整段拿掉。少了這個參數時,表面上看起來服務像是有啟動,但實際上容器內部的 API 呼叫可能不會正常工作。這一點算是這次最容易踩到的坑。

注意
如果你遇到網頁打得開,但實際送出翻譯請求失敗,優先檢查 --nonce None 是否真的有帶上。

關於翻譯後端設定

上面的 environment 我只保留自己實際有使用到的 Ollama 設定。若你要串接其他翻譯來源,例如 DeepL、OpenAI、Gemini、DeepSeek、Sakura、百度、有道、Groq、彩雲等,可以再去官方範例檔把對應的環境變數補上。

官方參考檔案:

另外還有一個很常見的問題,如果你的翻譯後端是跑在宿主機上,例如自架 Sakura 或 Ollama,位址不要直接填 127.0.0.1

因為對容器來說,127.0.0.1 指的是容器自己,不是宿主機,所以它根本連不到主機上的服務。這種情況應改用:

  1. host.docker.internal
  2. 宿主機的區網 IP

啟動服務

設定完成後,就可以直接啟動:

1
docker compose up -d

第一次啟動時,容器通常還會下載偵測、OCR、修復等模型,所以不一定會立刻好。這段時間可以用下面指令持續觀察:

1
docker compose logs -f

等到日誌裡出現服務開始監聽的訊息後,就可以用瀏覽器開啟下面這個位址:

1
http://localhost:5003

如果畫面能正常打開,接著再測一次實際翻譯請求,確認模型下載、GPU 使用、翻譯後端三者都沒有問題。

搭配 ComicRead 使用

服務跑起來之後,我自己會再搭配瀏覽器腳本 ComicRead 使用。這樣在線上看漫畫時,就可以直接呼叫本機這套翻譯服務,不需要每次都手動上傳圖片。

如果你本來就有在用 ComicRead,這種串接方式其實很方便,整體體驗會比手動丟圖省事很多。

我這次踩到的點

這次整理下來,我覺得最值得先記住的是下面三件事:

  1. 先驗證 GPU,再處理應用程式本身。
  2. 官方 compose 範例不一定能直接套在自己的環境。
  3. 宿主機服務位址不要亂寫成 127.0.0.1

很多 Docker 相關問題,表面看起來像是應用程式壞掉,實際上常常是 GPU 沒掛進去、容器網路觀念搞混,或啟動參數少一個值。把這幾個點先排掉,通常就能省下不少除錯時間。

心智圖

mindmap root((Manga Image Translator GPU 架設)) 前置作業 Docker NVIDIA Container Toolkit CUDA 範例驗證 GPU Compose 調整 entrypoint 改成 python command 直接跑 server/main.py 帶入 --host=0.0.0.0 帶入 --nonce None 先註解 volumes 翻譯後端 Ollama 可替換 OpenAI 相容 API 宿主機不能填 127.0.0.1 啟動流程 docker compose up -d docker compose logs -f 開啟 localhost:5003 常見踩雷 GPU 沒掛進容器 API 呼叫失敗 容器連不到宿主機服務

小結

如果只是想把 Manga Image Translator 快速跑起來,其實整體不算太難,真正麻煩的反而是 GPU、容器網路與啟動參數這三塊。尤其 --nonce None 這個細節,如果沒記下來,真的會卡很久。

後續如果我要再往下玩,大概會繼續補兩個方向:

  1. volumes 掛回去,保留輸出結果。
  2. 針對不同翻譯後端整理一份可直接切換的設定範本。