跳轉到主要內容
本主題說明如何在 Linux 上的 Docker 容器中執行 ABBYY FineReader Engine 12。 本主題涵蓋兩種設定方式:
選項說明
單一容器將 Licensing Service 和 FRE worker 一併封裝於同一個容器中。

較為簡單;適合用於測試、示範,以及一次性 OCR 工作。
兩個容器將 Licensing Service 和 FRE worker 分別放在不同的容器中。

容錯能力較佳;如果其中一個當機,可以在不中斷另一個的情況下重新啟動。多個 worker 可共用同一個 Licensing Service。
這兩種設定方式都支援 線上授權本機授權,且都以 ubuntu:noble (24.04 LTS) 為基礎。

授權類型

FRE 12 支援兩種授權類型:線上和本機。這兩種類型都適用於單容器和雙容器設定,但其啟用與執行階段需求不同。

線上授權

  • 檔名模式:XXXXXXXXXXXXXXXXXXXX.ABBYY.ActivationToken
  • 執行階段會對 *.abbyy.com 進行驗證 —— 每次執行容器都需要網際網路連線。
  • 凡是安裝了 Licensing Service 的環境,都必須符合下列要求:
    • 有效的網際網路連線
    • 允許對 *.abbyy.com 的 HTTPS 輸出連線 (連接埠 443)
    • 系統 ca-certificates 套件中包含 GoDaddy Trusted Root CA (ubuntu:noble 已預先包含)
  • 單一 Licensing Service 執行個體一次只能搭配 一個 線上授權運作。

本機授權

  • 檔名模式:XXXX-XXXX-XXXX-XXXX-XXXX-XXXX.ABBYY.LocalLicense
  • 在 FRE 安裝期間於建置時啟用,然後嵌入映像中。
  • 執行階段不需要網際網路——適合氣隙隔離環境。

開始使用

若要使用本指南中的任一設定選項,您需要備妥:
  • 已安裝 Docker 和 Docker Compose (docker compose v2 語法)
  • ABBYY FineReader Engine 12 Linux 安裝程式:FRE*.sh
  • 授權檔案 (.ABBYY.ActivationToken.ABBYY.LocalLicense) 與密碼

設定方式 1 — 單一容器

此選項在單一 container 中執行 Licensing Service 與 FRE worker。進入點會在背景中啟動 Licensing Service,短暫等待其就緒後,執行 CLI sample、列印輸出,並在結束時正常關閉所有處理序。適合本地測試、示範及 CI 作業,只需一個指令即可完成啟動與停止。

檔案

建立一個空目錄並加入以下檔案:
  • Dockerfile — 建置整合映像檔 (如下方所列)
  • entrypoint.sh — 啟動 LS、執行 CLI 範例,並輸出結果 (如下所示)
  • docker-compose.yml — 建置並執行容器 (如下)
  • .env — 存放您的授權檔案名稱和密碼 (列於下方)

組建與執行

  1. FRE*.sh 安裝程式和授權檔案複製到您上方建立的目錄中。
  2. 建立一個 .env 檔案,填入您的授權值 (見下方) 。
  3. 在該目錄下,執行以下命令以建置映像檔並啟動容器:
    docker compose up
    
CLI 範例將使用 OCR 處理隨附的 Demo.tif,並將已辨識文字列印至主控台。

.env

# 若使用本機授權:
LICENSE_FILE=XXXX-XXXX-XXXX-XXXX-XXXX-XXXX.ABBYY.LocalLicense
# 若使用線上授權:
# LICENSE_FILE=XXXXXXXXXXXXXXXXXXXX.ABBYY.ActivationToken
LICENSE_PASSWORD=your_password_here

docker-compose.yml

services:
  fre:
    build:
      context: .
      args:
        - license_file=${LICENSE_FILE}
        - license_password=${LICENSE_PASSWORD}
    shm_size: 1g
    command: ["-if /app/Demo.tif -f TextUnicodeDefaults -of /app/Test.txt"]
shm_size: 1g 為必要設定。FRE 使用 POSIX 共享記憶體,預設的 64MB /dev/shm 空間不足。請勿移除或變更此設定。

Dockerfile

這是一個兩階段組建:
  • 第 1 階段使用 gcc:8 安裝 FRE,並編譯 CLI 範例。
  • 第 2 階段會建立最精簡的 ubuntu:noble 執行階段映像,並將 Licensing Service 二進位檔、FRE 執行階段、編譯後的範例,以及授權檔案複製到其中。
# 階段 1:安裝 FRE 並編譯 CLI 範例
FROM gcc:8 AS builder

ARG license_file
ARG license_password

COPY ${license_file} /tmp/${license_file}
COPY FRE*.sh /tmp/FRE12.sh

RUN chmod +x /tmp/FRE12.sh && /tmp/FRE12.sh -- \
    --install-dir "/opt/ABBYY/FREngine12" \
    --license-path "/tmp/${license_file}" \
    --license-password "${license_password}" \
    --developer-install

WORKDIR /opt/ABBYY/FREngine12/Samples/CommandLineInterface
RUN make

# 移除僅供開發人員使用的程式庫(執行階段不需要)
RUN rm /opt/ABBYY/FREngine12/Bin/libProtection.Developer.so

# 階段 2:同時包含 Licensing Service 與 FRE 的最小執行階段映像
FROM ubuntu:noble

RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
    apt-get install --no-install-recommends -y \
    ca-certificates bash libc6 libglib2.0-0 libgcc-s1 libstdc++6 \
    zlib1g libx11-6 libfreetype6 libxext-dev libice-dev libsm-dev \
    locales && \
    locale-gen en_US.UTF-8 && \
    rm -rf /var/lib/apt/lists/*

# 複製 Licensing Service
COPY --from=builder /usr/local/bin/ABBYY/SDK/12/Licensing /usr/local/bin/ABBYY/SDK/12/Licensing/
COPY --from=builder /usr/local/lib/ABBYY/SDK/12/Licensing /usr/local/lib/ABBYY/SDK/12/Licensing/

# 複製 FRE 執行階段二進位檔與資料
COPY --from=builder /opt/ABBYY/FREngine12/Bin /opt/ABBYY/FREngine12/Bin
COPY --from=builder /opt/ABBYY/FREngine12/Data /opt/ABBYY/FREngine12/Data

# 複製授權檔案(適用於 .ActivationToken 與 .LocalLicense)
COPY --from=builder /var/lib/ABBYY/SDK/12/Licenses/*.ABBYY.* /var/lib/ABBYY/SDK/12/Licenses/

# 複製已編譯的 CLI 範例與示範映像
COPY --from=builder /opt/ABBYY/FREngine12/Samples/CommandLineInterface/CommandLineInterface /app/
COPY --from=builder /opt/ABBYY/FREngine12/Samples/SampleImages/Demo.tif /app/

# 建立授權工作目錄
RUN mkdir -p /var/lib/ABBYY/SDK/12/Licenses && chmod 755 /var/lib/ABBYY/SDK/12/Licenses

ENV LD_LIBRARY_PATH=/opt/ABBYY/FREngine12/Bin:/usr/local/lib/ABBYY/SDK/12/Licensing
ENV LANG=en_US.UTF-8
ENV LC_ALL=en_US.UTF-8

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh

#!/bin/bash

# 在背景啟動 Licensing Service
/usr/local/bin/ABBYY/SDK/12/Licensing/LicensingService /standalone &
LS_PID=$!

# 等待 Licensing Service 就緒
sleep 2

# 執行 CLI 範例
/app/CommandLineInterface $1

status=$?
if [ $status -ne 0 ]; then
  echo "Failed to launch app: $status"
  kill $LS_PID 2>/dev/null
  exit $status
fi

# 顯示輸出檔案的內容
cat ${1##*-of}
echo "Done"

# 清理資源
kill $LS_PID 2>/dev/null

設定方式 2 — 兩個容器

此選項在共用的 Docker Compose 網路上,以獨立的容器分別執行 Licensing Service 與 FRE worker。Worker 透過 TCP 與 Licensing Service 通訊,連線位址為 ls:3023建議用於生產環境部署。 將服務分別部署於獨立的容器中,表示若其中一個發生崩潰,Docker 可以單獨重新啟動該容器。此外,這也允許多個工作程序連接至同一個 Licensing Service。
除非您的授權允許,否則請勿對單一 Licensing Service 執行多個工作節點副本。單一 Licensing Service 執行個體一次僅支援一個線上授權。

檔案

建立一個空目錄並加入以下檔案:
  • Dockerfile_ls — 用於建置 Licensing Service 容器 (如下所列)
  • Dockerfile_worker — 用於建置下方所列的 FRE worker 容器
  • entrypoint.sh — 在 worker 中執行下方所列的 CLI 範例
  • docker-compose.yml — 將這兩個容器串接在一起 (如下所列)
  • .env — 包含您的授權檔名和密碼 (格式與設定 1 相同)

組建並執行

  1. FRE*.sh 安裝程式和授權檔案複製到該目錄。
  2. 建立一個 .env 檔案,並填入您的授權資訊。
  3. 在該目錄下執行:
    docker compose up
    
兩個容器均已建置並啟動。Licensing Service 會先啟動,接著啟動工作程序,工作程序會對隨附的 Demo.tif 執行 CLI 範例並列印結果。

docker-compose.yml

services:
  ls:
    build:
      context: .
      dockerfile: Dockerfile_ls
    restart: on-failure

  worker:
    build:
      context: .
      dockerfile: Dockerfile_worker
      args:
        - license_file=${LICENSE_FILE}
        - license_password=${LICENSE_PASSWORD}
        - service_address=ls:3023
    depends_on:
      - ls
    shm_size: 1g
    command: ["-if /app/Demo.tif -f TextUnicodeDefaults -of /app/Test.txt"]
    restart: on-failure
需要注意以下幾點:
  • 工作節點使用 depends_on: [ls],因此會先啟動 Licensing Service 容器。
  • 這兩個服務都使用 restart: on-failure,因此可各自獨立重新啟動。
  • worker 的 service_address 建置參數為 ls:3023 — Docker Compose 內建的 DNS 會將 ls 解析為 Licensing Service 容器。
  • shm_size: 1g 會設定在 worker 上,而不是設定在 Licensing Service 上,因為 FRE 需要共用記憶體。

Dockerfile_ls

這是一個兩階段組建:
  • 階段 1 會執行 FRE 安裝程式,並使用 --skip-local-license-activation 以擷取 Licensing Service 的二進位檔。
  • 第 2 階段會建立最精簡的 ubuntu:noble 執行階段映像,開放連接埠 3023,並以 PID 1 執行 LicensingService /standalone/standalone 旗標會讓 Licensing Service 持續在前景執行,這是 Docker 中的正確做法 (前景處理序會將日誌輸出到 stdout,並在容器停止時正常結束) 。
# 階段 1:從 FRE 安裝程式中提取 Licensing Service
FROM ubuntu:noble AS builder

RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
    apt-get install --no-install-recommends -y \
    bash gzip tar coreutils gettext-base && \
    rm -rf /var/lib/apt/lists/*

COPY FRE*.sh /tmp/FRE12.sh

RUN chmod +x /tmp/FRE12.sh && /tmp/FRE12.sh -- \
    --install-dir "/opt/ABBYY/FREngine12" \
    --skip-local-license-activation

# 階段 2:Licensing Service 的最精簡 Runtime 環境
FROM ubuntu:noble

RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
    apt-get install --no-install-recommends -y \
    ca-certificates bash libc6 libgcc-s1 libstdc++6 && \
    rm -rf /var/lib/apt/lists/*

COPY --from=builder /usr/local/bin/ABBYY/SDK/12/Licensing /usr/local/bin/ABBYY/SDK/12/Licensing/
COPY --from=builder /usr/local/lib/ABBYY/SDK/12/Licensing /usr/local/lib/ABBYY/SDK/12/Licensing/

RUN mkdir -p /var/lib/ABBYY/SDK/12/Licenses && chmod 755 /var/lib/ABBYY/SDK/12/Licenses

ENV LD_LIBRARY_PATH=/usr/local/lib/ABBYY/SDK/12/Licensing

EXPOSE 3023

ENTRYPOINT ["/usr/local/bin/ABBYY/SDK/12/Licensing/LicensingService", "/standalone"]

Dockerfile_worker

這是一個兩階段組建:
  • 第 1 階段會使用 --developer-install 與指向 Licensing Service 容器的 --service-address 安裝 FRE,然後編譯 CLI 範例。
  • 第 2 階段會建立一個精簡的 ubuntu:noble 執行階段映像,其中僅包含 FRE 二進位檔、已編譯的範例,以及示範用影像。由於 worker 是透過網路與 ls 容器通訊,因此不包含任何 Licensing Service 二進位檔。
# 階段 1:安裝 FRE 並編譯 CLI 範例
FROM gcc:8 AS builder

ARG license_file
ARG license_password
ARG service_address

COPY ${license_file} /tmp/${license_file}
COPY FRE*.sh /tmp/FRE12.sh

RUN chmod +x /tmp/FRE12.sh && /tmp/FRE12.sh -- \
    --install-dir "/opt/ABBYY/FREngine12" \
    --license-path "/tmp/${license_file}" \
    --license-password "${license_password}" \
    --service-address "${service_address}" \
    --developer-install

WORKDIR /opt/ABBYY/FREngine12/Samples/CommandLineInterface
RUN make

# 移除僅供開發人員使用的程式庫(執行階段不需要)
RUN rm /opt/ABBYY/FREngine12/Bin/libProtection.Developer.so

# 階段 2:最小化執行階段映像
FROM ubuntu:noble

RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
    apt-get install --no-install-recommends -y \
    ca-certificates bash libc6 libglib2.0-0 libgcc-s1 libstdc++6 \
    zlib1g libx11-6 libfreetype6 libxext-dev libice-dev libsm-dev \
    locales && \
    locale-gen en_US.UTF-8 && \
    rm -rf /var/lib/apt/lists/*

# 複製 FRE 執行階段二進位檔案與資料
COPY --from=builder /opt/ABBYY/FREngine12/Bin /opt/ABBYY/FREngine12/Bin
COPY --from=builder /opt/ABBYY/FREngine12/Data /opt/ABBYY/FREngine12/Data

# 複製授權檔案(適用於 .ActivationToken 和 .LocalLicense)
COPY --from=builder /var/lib/ABBYY/SDK/12/Licenses/*.ABBYY.* /var/lib/ABBYY/SDK/12/Licenses/

# 複製已編譯的 CLI 範例與示範映像
COPY --from=builder /opt/ABBYY/FREngine12/Samples/CommandLineInterface/CommandLineInterface /app/
COPY --from=builder /opt/ABBYY/FREngine12/Samples/SampleImages/Demo.tif /app/

ENV LD_LIBRARY_PATH=/opt/ABBYY/FREngine12/Bin
ENV LANG=en_US.UTF-8
ENV LC_ALL=en_US.UTF-8

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh

Worker 的進入點比單一容器版本更簡單,因為它不需要管理 Licensing Service。Worker 只需執行範例並列印輸出結果。
#!/bin/bash

# 使用提供的參數執行 CLI 範例
/app/CommandLineInterface $1

status=$?
if [ $status -ne 0 ]; then
  echo "Failed to launch app: $status"
  exit $status
fi

# 顯示輸出檔案的內容
cat ${1##*-of}
echo "Done"

自訂 CLI 範例

這兩種設定方式都會在 docker-compose.yml 中執行相同的預設指令:
command: ["-if /app/Demo.tif -f TextUnicodeDefaults -of /app/Test.txt"]
  • -if — 輸入檔案
  • -f — 輸出格式設定檔
  • -of — 輸出檔案
編輯這一行,讓它指向其他輸入檔、輸出檔或格式設定檔。請參閱 FRE Code Samples Library 文件,查看 CLI 引數的完整清單。
若要對自己的檔案執行 OCR,請以 bind mount 的方式將主機目錄掛載到 /app,並讓 -if/-of 指向其中的檔案。

常見問題

以下是適用於這兩種設定方式的已知問題:
  • shm_size: 1g 是必要設定。 FRE 仰賴 POSIX 共用記憶體,而預設的 64MB /dev/shm 配置並不足夠。上面的 compose 檔案已經在 worker 服務中設定好這個值。
  • 安裝程式和授權檔案必須位於 build context 中。 兩個 Dockerfile 都會 COPY FRE*.sh 和授權檔案——如果這些檔案不在你執行建置的目錄中,建置會立即失敗。不要在執行階段掛載授權檔案,因為它會在建置期間啟用。
  • 線上授權需要 builder 執行階段 都能對外連線。 builder 需要連線來啟用授權;執行階段的 Licensing Service 則需要連線來持續驗證。
  • 不要提交授權檔案或安裝程式。 在原始碼控制中,請將 .env*.ABBYY.*FRE*.sh 加入忽略清單;除非你清楚了解相關影響與風險,否則不要將它們包含在任何已發佈的映像中。
  • 這些範例使用 ubuntu:noble (24.04 LTS)。 先前的文件提到 Ubuntu bionic,但它已終止支援。不同 Ubuntu 版本之間的套件名稱也會有所差異。例如:libgcc-8-dev 現在是 libgcc-s1,而 libstdc++-8-dev 現在是 libstdc++6。如果你使用不同的基礎映像,請相應確認套件清單。

另請參見

在 Linux 上安裝 Licensing Service 授權管理 啟用