วิธีการรัน Aspose.Slides ใน Docker

ภาพรวม

Aspose.Slides for Python via .NET ทำงานในคอนเทนเนอร์ Linux แต่แพคเกจเป็น wrapper ของ Python ที่ห่อหุ้มรันไทม์ .NET Core 3.1 ที่รวมมาใน ตัวรันไทม์นี้ต้องการไลบรารีเนทีฟสามตัวที่ภาพ Python แบบ slim ไม่ได้จัดส่ง และมันต้องการเวอร์ชันที่ตรงกัน บทความนี้ให้ตัวอย่าง Dockerfile ที่ทำงานได้ อธิบายเหตุผลที่ต้องมีแต่ละ dependency และแสดงวิธีเพิ่มแบบอักษรและไลเซนส์

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 wheel รวมรันไทม์ .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 ซึ่งให้ทั้งสองเวอร์ชันที่รันไทม์ที่รวมมาคาดหวัง:

แพคเกจ เวอร์ชันบน Debian 11 เหตุผลที่ต้องการ
libgdiplus 6.0.4 การดำเนินการ GDI+ ที่ใช้สำหรับการเรนเดอร์รูปทรง, ข้อความ, และภาพ
libicu67 67.1 ข้อมูลการทำ Globalization. เวอร์ชันหลักที่ใหม่กว่าไม่ถูกจดจำโดย .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 ยังคงเป็นตัวเลือกที่ง่ายกว่า

แบบอักษร

ภาพ slim ไม่มีแบบอักษรเลย หากไม่มีแบบอักษรอย่างน้อยหนึ่งตัวติดตั้ง ข้อความจะแสดงเป็นกล่องว่างในผลลัพธ์ 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")

หากไม่มีไลเซนส์ ไลบรารีจะทำงานในโหมดประเมินผล ซึ่งจะเพิ่มลายน้ำและจำกัดจำนวนสไลด์ที่ประมวลผล ดูรายละเอียดเพิ่มเติมที่ Licensing

หน่วยความจำ

การเรนเดอร์เป็น PDF หรือรูปภาพต้องการหน่วยความจำมากกว่าการอ่านไฟล์ คอนเทนเนอร์ที่มีขีดจำกัดหน่วยความจำต่ำอาจถูก OOM killer ฆ่าในกระบวนการแปลงกลางทาง ซึ่งมักปรากฏเป็นกระบวนการหายไปโดยไม่มี traceback ของ Python หากเกิดเหตุนี้ ให้เพิ่มขีดจำกัดหน่วยความจำของคอนเทนเนอร์ก่อนตรวจสอบโค้ด.