Docker에서 Aspose.Slides 실행 방법

개요

Aspose.Slides for Python via .NET는 Linux 컨테이너에서 실행되지만, 이 패키지는 번들된 .NET Core 3.1 런타임을 감싸는 Python 래퍼입니다. 해당 런타임은 슬림 Python 이미지에 포함되지 않은 세 개의 네이티브 라이브러리가 필요하며, 버전에 매우 민감합니다. 이 문서에서는 작동하는 Dockerfile을 제공하고, 각 종속성이 왜 필요한지 설명하며, 폰트와 라이선스를 추가하는 방법을 보여줍니다.

작동하는 Dockerfile

FROM python:3.11-slim-bullseye

RUN apt-get update && apt-get install -y --no-install-recommends \
        libgdiplus \
        libicu67 \
        libfontconfig1 \
        fonts-dejavu-core \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir aspose.slides

WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]

app.py:

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 400, 100)
    shape.text_frame.text = "Created inside a Docker container"
    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)
    presentation.save("output.pdf", slides.export.SaveFormat.PDF)

빌드 및 실행:

docker build -t aspose-slides-python .
docker run --rm aspose-slides-python

베이스 이미지가 Debian 11인 이유

aspose.slides 휠은 .NET Core 3.1 런타임을 번들링하며, 이 런타임은 현재 Debian 릴리즈에 포함된 라이브러리 버전보다 오래되었습니다. Debian 12와 13에서는 컨테이너가 성공적으로 빌드되지만 첫 번째 Presentation() 호출 시 실패합니다:

Process terminated. Couldn't find a valid ICU package installed on the system.

메시지는 오해의 소지가 있습니다 — ICU는 해당 이미지에 설치되어 있지만 ICU 72 또는 76 버전이며, .NET Core 3.1은 오래된 주요 버전만 인식합니다. Debian 12는 추가로 OpenSSL 3을 제공하는데, 이는 두 번째 오류를 발생시킵니다:

No usable version of libssl was found

python:3.11-slim-bullseye는 Debian 11이며, 번들된 런타임이 기대하는 두 버전을 모두 제공합니다:

Package Version on Debian 11 Why it is needed
libgdiplus 6.0.4 모양, 텍스트 및 이미지를 렌더링하는 데 사용되는 GDI+ 구현
libicu67 67.1 글로벌화 데이터. 최신 주요 버전은 .NET Core 3.1에서 인식되지 않음
libssl1.1 1.1.1w 암호화. Debian 11에 사전 설치되어 있으나 Debian 12 이상에는 없음
libfontconfig1 폰트 검색

libssl1.1은 이미 베이스 이미지에 포함되어 있으므로 apt-get install에 명시할 필요가 없습니다.

새로운 베이스 이미지를 사용해야 한다면 DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1을 설정하여 ICU 요구사항을 우회할 수 있습니다. 이는 문화권별 형식을 비활성화하지만 OpenSSL 문제는 해결되지 않으므로, Debian 11이 여전히 더 간단한 선택입니다.

폰트

슬림 이미지에는 폰트가 전혀 포함되지 않습니다. 최소 하나의 폰트라도 설치되지 않으면 PDF, 이미지, HTML 출력에서 텍스트가 빈 상자처럼 표시됩니다. fonts-dejavu-core는 작고 일반적인 시작점입니다.

프레젠테이션의 의도된 모양과 일치하도록 사용되는 폰트를 이미지에 복사하고 Aspose.Slides에 지정하십시오:

COPY fonts/ /usr/share/fonts/truetype/custom/
RUN fc-cache -f
import aspose.slides as slides

slides.FontsLoader.load_external_fonts(["/usr/share/fonts/truetype/custom/"])

컨테이너 내부 라이선스

라이선스 파일을 이미지에 포함해서는 안 됩니다 — 이미지를 가져오는 모든 사람이 라이선스를 얻게 됩니다. 런타임에 마운트하십시오:

docker run --rm -v /path/on/host:/license aspose-slides-python
import aspose.slides as slides

license = slides.License()
license.set_license("/license/Aspose.Slides.Python.NET.lic")

라이선스가 없으면 라이브러리가 평가 모드로 실행되어 워터마크가 추가되고 처리 가능한 슬라이드 수가 제한됩니다. 자세한 내용은 라이선스를 참조하십시오.

메모리

PDF나 이미지로 렌더링하는 것은 파일을 읽는 것보다 메모리를 더 많이 사용합니다. 메모리 제한이 엄격한 컨테이너는 변환 중간에 OOM 킬러에 의해 종료될 수 있으며, 이 경우 일반적으로 파이썬 스택 트레이스 없이 프로세스가 사라지는 현상이 나타납니다. 이런 일이 발생하면 코드를 조사하기 전에 컨테이너의 메모리 제한을 늘리세요.