Jak uruchomić Aspose.Slides w Dockerze

Przegląd

Aspose.Slides for Python via .NET działa w kontenerach Linux, ale pakiet jest nakładką Pythona na dołączony runtime .NET Core 3.1. Ten runtime wymaga trzech natywnych bibliotek, których slim obrazy Pythona nie zawierają, i jest wymagający co do ich wersji. Ten artykuł zawiera działający Dockerfile, wyjaśnia, dlaczego każda zależność jest potrzebna, oraz pokazuje, jak dodać czcionki i licencję.

Działający 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)

Budowanie i uruchamianie:

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

Dlaczego obraz bazowy to Debian 11

aspose.slides wheel zawiera runtime .NET Core 3.1, a ten runtime jest starszy niż wersje bibliotek dostarczane w aktualnych wydaniach Debiana. Na Debianie 12 i 13 kontener buduje się pomyślnie, ale następnie zawodzi przy pierwszym wywołaniu Presentation():

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

Komunikat jest mylący — ICU jest zainstalowane w tych obrazach, ale jest to ICU 72 lub 76, a .NET Core 3.1 rozpoznaje tylko starsze wersje główne. Debian 12 dodatkowo dostarcza OpenSSL 3, co powoduje drugi błąd:

No usable version of libssl was found

python:3.11-slim-bullseye to Debian 11, który dostarcza oba wersje oczekiwane przez dołączony runtime:

Pakiet Wersja w Debianie 11 Dlaczego jest potrzebny
libgdiplus 6.0.4 Implementacja GDI+ używana do renderowania kształtów, tekstu i obrazów
libicu67 67.1 Dane globalizacyjne. Nowsze wersje główne nie są rozpoznawane przez .NET Core 3.1
libssl1.1 1.1.1w Kryptografia. Preinstalowane w Debianie 11; nieobecne w Debianie 12+
libfontconfig1 Wykrywanie czcionek

libssl1.1 jest już obecny w obrazie bazowym, więc nie trzeba go wymieniać w apt-get install.

Jeśli musisz używać nowszego obrazu bazowego, ustaw DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1, aby pominąć wymóg ICU. Wyłącza to formatowanie zależne od kultury i nie rozwiązuje problemu z OpenSSL, dlatego Debian 11 pozostaje prostszym wyborem.

Czcionki

Obrazy typu slim nie zawierają żadnych czcionek. Bez przynajmniej jednej zainstalowanej czcionki tekst renderuje się jako puste pola w wyjściach PDF, obrazu i HTML. fonts-dejavu-core to mały, uniwersalny punkt wyjścia.

Aby dopasować wygląd prezentacji do zamierzonego, skopiuj używane przez nią czcionki do obrazu i wskaż je 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/"])

Licencjonowanie w kontenerze

Nie wbudowuj pliku licencji w obraz — każdy, kto pobierze obraz, otrzyma licencję. Zamontuj go w czasie uruchomienia:

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")

Bez licencji biblioteka działa w trybie ewaluacyjnym, co dodaje znak wodny i ogranicza liczbę przetwarzanych slajdów. Zobacz Licensing po szczegóły.

Pamięć

Renderowanie do PDF lub obrazów wymaga więcej pamięci niż odczyt pliku. Kontenery z ograniczonym przydziałem pamięci mogą zostać zakończone przez OOM killera w trakcie konwersji, co zazwyczaj objawia się zniknięciem procesu bez śladu błędu w Pythonie. Jeśli tak się stanie, zwiększ limit pamięci kontenera przed analizą kodu.