메인 콘텐츠로 건너뛰기

Documentation Index

Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt

Use this file to discover all available pages before exploring further.

이 항목에서는 Linux의 Docker 컨테이너에서 ABBYY FineReader Engine 12를 실행하는 방법을 설명합니다. 이 항목에서는 두 가지 설정 옵션을 다룹니다.
OptionDescription
단일 컨테이너Licensing Service와 FRE worker를 함께 패키징합니다.

구성이 더 간단하여 테스트, 데모, 단발성 OCR 작업에 적합합니다.
두 개의 컨테이너Licensing Service와 FRE worker를 각각 별도의 컨테이너에서 실행합니다.

내결함성이 더 뛰어나 한쪽에 장애가 발생해도 다른 쪽을 중단하지 않고 재시작할 수 있습니다. 여러 worker가 하나의 Licensing Service를 공유할 수도 있습니다.
두 설정 옵션 모두 온라인 라이선스로컬 라이선스를 지원하며, 모두 ubuntu:noble(24.04 LTS)을 기반으로 빌드됩니다.

라이선스 유형

FRE 12는 Online 및 Local의 두 가지 라이선스 유형을 지원합니다. 두 유형 모두 단일 컨테이너와 이중 컨테이너 구성에서 사용할 수 있지만, 활성화 및 런타임 요구 사항은 서로 다릅니다.

온라인 라이선스

  • 파일 이름 패턴: 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 — 단일 컨테이너

이 옵션은 Licensing Service와 FRE 워커를 하나의 컨테이너에서 실행합니다. 진입점은 Licensing Service를 백그라운드에서 시작하고, 서비스가 구동될 때까지 잠시 대기한 후 CLI 샘플을 실행하여 출력 결과를 표시하고, 종료 시 모든 프로세스를 정상적으로 종료합니다.명령 하나로 시작과 중지를 처리하고 싶은 로컬 테스트, 데모, CI 작업에 권장됩니다.

파일

빈 디렉터리를 만들고 다음 파일을 추가합니다.
  • Dockerfile — 통합 이미지를 빌드합니다(아래에 나열됨)
  • entrypoint.sh — LS를 시작하고 CLI 샘플을 실행한 다음, 결과를 출력합니다(아래 목록 참조)
  • docker-compose.yml — 컨테이너를 빌드하고 실행합니다 (아래에 나열됨)
  • .env — 라이선스 파일 이름과 비밀번호가 들어 있습니다(아래에 나와 있음)

빌드 및 실행

  1. 위에서 만든 디렉터리로 FRE*.sh 설치 프로그램과 라이선스 파일을 복사합니다.
  2. 라이선스 값이 포함된 .env 파일을 만듭니다(아래 참조).
  3. 해당 디렉터리에서 다음 명령을 실행해 이미지를 빌드하고 컨테이너를 시작합니다:
    docker compose up
    
CLI 샘플은 번들로 제공된 Demo.tif를 OCR로 처리하고 인식된 텍스트를 콘솔에 출력합니다.

.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

이는 2단계 빌드입니다:
  • 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 — 두 개의 컨테이너

이 옵션은 Licensing Service와 FRE 워커를 공유 Docker Compose 네트워크상의 별도 컨테이너에서 실행합니다. 워커는 TCP를 통해 ls:3023으로 Licensing Service와 통신합니다.프로덕션 배포에 권장됩니다. 서비스를 별도의 컨테이너에서 실행하면 충돌 발생 시 Docker가 각 서비스를 독립적으로 재시작할 수 있습니다. 또한 여러 워커가 동일한 Licensing Service에 연결하는 것도 가능합니다.
라이선스에서 허용하지 않는 한, 단일 Licensing Service에 여러 워커 복제본을 실행하지 마십시오. 단일 Licensing Service 인스턴스는 한 번에 하나의 온라인 라이선스만 지원합니다.

파일

빈 디렉터리를 만들고 다음 파일을 추가합니다.
  • Dockerfile_ls — Licensing Service 컨테이너를 빌드합니다(아래 목록에 있음)
  • Dockerfile_worker — FRE 워커 컨테이너를 빌드합니다(아래 목록 참조)
  • entrypoint.sh — worker에서 CLI 샘플을 실행합니다(아래에 나열됨)
  • docker-compose.yml — 아래에 나열된 두 컨테이너를 서로 연결합니다
  • .env — 라이선스 파일 이름과 비밀번호를 저장합니다(Setup 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를 사용하므로 각 서비스가 서로 독립적으로 다시 시작될 수 있습니다.
  • 워커의 service_address 빌드 인수는 ls:3023입니다 — Docker Compose의 기본 제공 DNS가 ls를 Licensing Service 컨테이너의 주소로 해석합니다.
  • FRE에는 공유 메모리가 필요하므로 shm_size: 1g는 Licensing Service가 아니라 worker에 설정됩니다.

Dockerfile_ls

이것은 2단계 빌드입니다:
  • 1단계에서는 Licensing Service 바이너리를 추출하기 위해 --skip-local-license-activation 옵션을 사용해 FRE 설치 프로그램을 실행합니다.
  • 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를 위한 최소 런타임
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

2단계 빌드입니다:
  • 1단계에서는 --developer-install--service-address가 Licensing Service 컨테이너를 가리키도록 지정해 FRE를 설치한 다음, CLI 샘플을 컴파일합니다.
  • 2단계에서는 FRE 바이너리, 컴파일된 sample, 데모 이미지만 포함하는 최소한의 ubuntu:noble 런타임 이미지를 생성합니다. 워커가 네트워크를 통해 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

워커의 진입점은 Licensing Service를 관리하지 않으므로 단일 컨테이너 버전보다 간단합니다. 워커는 샘플을 실행하고 출력 결과를 표시하기만 합니다.
#!/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 — 출력 파일
이 줄을 수정해 다른 입력 파일, 출력 파일 또는 형식 프로필을 가리키게 하세요. 전체 CLI 인수 목록은 FRE Code Samples Library 문서를 참조하세요.
자체 파일에 OCR을 실행하려면 호스트 디렉터리를 /app에 바인드 마운트한 다음 -if/-of가 그 안의 파일을 가리키도록 설정하세요.

일반적인 문제

다음은 두 설정 옵션 모두에 적용되는 알려진 문제입니다.
  • shm_size: 1g는 필수입니다. FRE는 POSIX 공유 메모리에 의존하며, 기본 64MB /dev/shm 할당으로는 충분하지 않습니다. 위의 compose 파일에서는 worker 서비스에 이 값을 이미 설정해 두었습니다.
  • installer와 라이선스 파일은 build context에 있어야 합니다. 두 Dockerfile 모두 COPY FRE*.sh와 라이선스 파일을 사용하므로, 빌드하는 디렉터리에 해당 파일이 없으면 빌드가 즉시 실패합니다. 런타임에 라이선스 파일을 마운트하지 마세요. 라이선스는 빌드 중에 활성화됩니다.
  • 온라인 라이선스는 builder와 runtime 모두에서 외부 네트워크로 나가는 연결이 필요합니다. builder는 라이선스를 활성화하는 데 필요하고, runtime의 Licensing Service는 라이선스 유효성을 계속 검증하는 데 필요합니다.
  • 라이선스 파일이나 installer를 커밋하지 마세요. 소스 제어에서는 .env, *.ABBYY.*, FRE*.sh를 ignore 목록에 추가하고, 그 영향과 위험을 충분히 이해하지 못한 상태에서는 공개되는 어떤 이미지에도 포함하지 마세요.
  • 이 예제에서는 ubuntu:noble (24.04 LTS)을 사용합니다. 이전 문서에서는 이미 지원이 종료된 Ubuntu bionic을 언급했습니다. 패키지 이름은 Ubuntu 릴리스마다 다릅니다. 예를 들어 libgcc-8-dev는 이제 libgcc-s1이고 libstdc++-8-dev는 이제 libstdc++6입니다. 다른 base image를 사용하는 경우 그에 맞게 패키지 목록을 확인하세요.

참고 항목

Linux에서 Licensing Service 설치 라이선싱 활성화