Cara Menjalankan Aspose.Slides di Docker
Gambaran Umum
Aspose.Slides for Python via .NET berjalan di dalam container Linux, tetapi paket ini merupakan wrapper Python di atas runtime .NET Core 3.1 yang sudah dibundel. Runtime tersebut memerlukan tiga pustaka native yang tidak disertakan pada image Python slim, dan versi pustaka tersebut harus tepat. Artikel ini menyediakan Dockerfile yang berfungsi, menjelaskan alasan keberadaan setiap dependensi, serta menunjukkan cara menambahkan font dan lisensi.
Dockerfile yang Berfungsi
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)
Build and run:
docker build -t aspose-slides-python .
docker run --rm aspose-slides-python
Mengapa image dasar adalah Debian 11
Wheel aspose.slides membundel runtime .NET Core 3.1, dan runtime tersebut lebih dulu daripada versi pustaka yang disertakan pada rilis Debian saat ini. Pada Debian 12 dan 13 container berhasil dibangun tetapi gagal pada pemanggilan pertama Presentation():
Process terminated. Couldn't find a valid ICU package installed on the system.
Pesan tersebut menyesatkan — ICU * memang* terpasang pada image tersebut, tetapi versinya ICU 72 atau 76, sedangkan .NET Core 3.1 hanya mengenali versi mayor yang lebih lama. Debian 12 juga menyertakan OpenSSL 3, yang menimbulkan kegagalan kedua:
No usable version of libssl was found
python:3.11-slim-bullseye adalah Debian 11, yang menyediakan kedua versi yang diharapkan runtime yang dibundel:
| Package | Version on Debian 11 | Mengapa diperlukan |
|---|---|---|
libgdiplus |
6.0.4 | Implementasi GDI+ yang digunakan untuk merender bentuk, teks, dan gambar |
libicu67 |
67.1 | Data globalisasi. Versi mayor yang lebih baru tidak dikenali oleh .NET Core 3.1 |
libssl1.1 |
1.1.1w | Kriptografi. Sudah terpasang pada Debian 11; tidak ada pada Debian 12+ |
libfontconfig1 |
— | Penemuan font |
libssl1.1 sudah ada di image dasar, jadi tidak perlu dicantumkan dalam apt-get install.
Jika Anda harus menggunakan image dasar yang lebih baru, atur DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 untuk melewati kebutuhan ICU. Ini menonaktifkan format budaya spesifik dan tidak menyelesaikan masalah OpenSSL, sehingga Debian 11 tetap pilihan yang lebih sederhana.
Font
Image slim tidak berisi font sama sekali. Tanpa setidaknya satu font terpasang, teks akan dirender sebagai kotak kosong pada output PDF, gambar, dan HTML. fonts-dejavu-core merupakan titik awal umum yang kecil.
Untuk mencocokkan tampilan yang diinginkan pada presentasi, salin font yang digunakannya ke dalam image dan arahkan Aspose.Slides ke font tersebut:
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/"])
Lisensi di dalam container
Jangan menyertakan file lisensi ke dalam image — siapa pun yang menarik image akan mendapatkan lisensinya. Pasanglah pada saat runtime:
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")
Tanpa lisensi, perpustakaan berjalan dalam mode evaluasi, yang menambahkan watermark dan membatasi jumlah slide yang diproses. Lihat Licensing untuk detail.
Memori
Merender ke PDF atau gambar membutuhkan memori lebih besar dibandingkan membaca file. Container dengan batas memori ketat dapat dihentikan oleh OOM killer di tengah proses konversi, biasanya tampak sebagai proses yang menghilang tanpa traceback Python. Jika hal itu terjadi, naikkan batas memori container sebelum menyelidiki kode.