如何在 Google Cloud 中运行 IronPDF for Java.

This article was translated from English: Does it need improvement?
Translated
View the article in English

在Google Cloud Functions上部署IronPDF for Java需要非默认配置,因为IronPDF依赖捆绑的Chromium二进制文件将HTML渲染为PDF。 本指南涵盖了在 Google Cloud Functions 的自定义 Docker 容器中运行 IronPDF 所需的一切内容——从正确的 pom.xml 依赖项到运行时权限和资源设置。

重要IronPDF for Java在Google Cloud上的支持目前是实验性的—并不是所有配置在所有地区或运行时版本中都已验证。 在发布到生产环境之前彻底测试部署。

如果您已经熟悉Google Cloud Functions和Docker,这就不成问题。 配置更改很简单:换掉默认功能镜像为自定义Dockerfile,添加Linux引擎依赖项,调整资源限制,并设置工作目录。 以下将解释每一个步骤。

快速入门:在Google Cloud上部署IronPDF for Java

最低运行配置需要一个自定义的 Dockerfile(因为默认的 Cloud Function 镜像缺少 Chrome 的系统依赖项)、您 pom.xml 中的 ironpdf-engine-linux-x64 构建产物,以及指向 /tmp/ 的工作目录。 下面的代码展示了如何在您的函数入口点设置引擎工作目录:

//:path=/static-assets/pdf/content-code-examples/tutorials/google-cloud/configure-working-directory.java
import com.ironsoftware.ironpdf.设置s;
import java.nio.file.Paths;

// Point IronPDF at a writable directory in the Cloud Function runtime
设置s.setIronPdfEngineWorkingDirectory(Paths.get("/tmp/"));
//:path=/static-assets/pdf/content-code-examples/tutorials/google-cloud/configure-working-directory.java
import com.ironsoftware.ironpdf.设置s;
import java.nio.file.Paths;

// Point IronPDF at a writable directory in the Cloud Function runtime
设置s.setIronPdfEngineWorkingDirectory(Paths.get("/tmp/"));
JAVA

设置工作目录后,IronPDF可以在Cloud Function的短暂文件系统中提取并执行其引擎二进制。 在大多数 Google Cloud Function 运行时环境中,/tmp/ 目录是唯一可写入且可执行的路径。

目录

为什么默认Cloud Function镜像不起作用?

Google Cloud Function的默认运行时镜像设计很小——它们只包含执行用常见语言编写的函数代码所需的包。 IronPDF的基于Chromium的渲染引擎依赖于一组更广泛的Linux系统库(字体、图形库、沙箱工具),这些在标准镜像中是缺失的。

Google在Google Cloud Functions系统包参考中发布了每个运行时可用系统包的完整列表。 Chromium的依赖项不包括在任何标准的第二代运行时中。 尝试在默认镜像中加载IronPDF引擎导致启动时的本地库加载失败。

解决方案是构建一个自定义Docker镜像,在添加功能二进制文件之前显式安装这些包。 这种方法得到Google Cloud Functions的全面支持,也是任何需要本地二进制文件的函数推荐的策略。 请参考IronPDF Linux部署指南以获取完整的需包括的包列表。

请注意IronPDF在Google Cloud上不支持Zip部署。 IronPDF在运行时必须提取并执行本地二进制文件,这需要一个可写的文件系统和执行权限,而Zip部署模型不提供这些。

如何为Google Cloud构建自定义Dockerfile?

自定义Dockerfile使您可以完全控制运行环境。 从官方的Google Cloud Functions Java基础镜像开始,然后安装Chromium所需的系统库。

下面的Dockerfile展示了推荐的模式。 请将 COPYCMD 替换为您功能项目的具体内容:

//:path=Dockerfile
# Use the official Google Cloud Functions Java 17 base image
FROM gcr.io/google-appengine/java17:latest

# Install Chrome system dependencies required by IronPDF's rendering engine
RUN apt-get update && apt-get install -y \
    libglib2.0-0 \
    libnss3 \
    libatk1.0-0 \
    libatk-bridge2.0-0 \
    libcups2 \
    libdrm2 \
    libxkbcommon0 \
    libxcomposite1 \
    libxdamage1 \
    libxfixes3 \
    libxrandr2 \
    libgbm1 \
    libasound2 \
    libpango-1.0-0 \
    libpangocairo-1.0-0 \
    --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*

# Grant execute permissions on /tmp so the IronPDF engine can extract there
RUN chmod 777 /tmp/

# Copy the compiled JAR and set the entry point
COPY target/your-function.jar /app/function.jar
CMD ["java", "-jar", "/app/function.jar"]

chmod 777 /tmp/ 这一行是必要的,因为 IronPDF 需要在初始化过程中写入并执行引擎二进制文件。 如果工作目录没有执行权限,引擎将无法启动。

提示在将 Docker 镜像部署到 Cloud Functions 之前,请使用 docker builddocker run 在本地进行测试。 本地测试允许尽早捕获缺少的依赖项,避免云构建周期缓慢。

如何为Google Cloud部署配置pom.xml?

标准的 ironpdf Maven 构建产物包含适用于多个平台的引擎二进制文件。 对于Google Cloud Functions(在Linux x86-64上运行),添加平台专用的引擎工件以保持部署镜像精简,并确保始终可以使用正确的二进制文件:

//:path=pom.xml
<dependencies>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf</artifactId>
        <version>2024.9.1</version>
    </dependency>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf-engine-linux-x64</artifactId>
        <version>2024.9.1</version>
    </dependency>
</dependencies>
//:path=pom.xml
<dependencies>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf</artifactId>
        <version>2024.9.1</version>
    </dependency>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf-engine-linux-x64</artifactId>
        <version>2024.9.1</version>
    </dependency>
</dependencies>
XML

始终更新版本号到最新的IronPDF for Java版本ironpdf-engine-linux-x64 组件的版本必须与核心 ironpdf 组件的版本完全一致。

重要保持两个版本号同步。 核心工件与引擎工件版本不匹配将导致运行时启动失败。

如何添加Maven Shade插件?

当以 uber-JAR(fat JAR)形式部署到 Google Cloud Functions 时,maven-shade-plugin 可确保所有传递性依赖项的服务加载器文件被正确合并。 没有它,一些gRPC服务注册可能会被静默丢弃,导致引擎初始化失败。

请在您的 pom.xml 文件中,将以下插件配置添加到 <build><plugins> 部分:

//:path=pom.xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>

            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>
//:path=pom.xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>

            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>
XML

ServicesResourceTransformer 是关键部分。 它将每个依赖 JAR 文件中的 META-INF/services/ 条目合并为一个单一的合并文件。gRPC 使用 Java 的 ServiceLoader 机制,因此需要合并的服务文件才能在运行时使传输选择(HTTP/2 与纯文本)正常工作。

如何添加可选的gRPC依赖项?

在某些部署配置中 — 特别是使用某些版本的Google Cloud Functions框架的阴影JAR时 — 需要显式gRPC传输依赖项。 如果函数启动时出现gRPC传输或通道错误,请添加这些依赖:

//:path=pom.xml
<dependencies>

    <dependency>
        <groupId>io.perfmark</groupId>
        <artifactId>perfmark-api</artifactId>
        <version>0.26.0</version>
    </dependency>

    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-okhttp</artifactId>
        <version>1.50.2</version>
    </dependency>

    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty-shaded</artifactId>
        <version>1.50.2</version>
    </dependency>
</dependencies>
//:path=pom.xml
<dependencies>

    <dependency>
        <groupId>io.perfmark</groupId>
        <artifactId>perfmark-api</artifactId>
        <version>0.26.0</version>
    </dependency>

    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-okhttp</artifactId>
        <version>1.50.2</version>
    </dependency>

    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty-shaded</artifactId>
        <version>1.50.2</version>
    </dependency>
</dependencies>
XML

在大多数情况下,包含 grpc-netty-shaded 即可满足生产环境需求。 grpc-okhttp 传输方式是一种更轻量级的替代方案,在优先考虑缩小图像大小时非常有用。 仅当遇到关于缺少追踪注解的类路径警告时,才添加 perfmark-api

请注意Check the gRPC release notes to confirm the latest compatible version for your IronPDF dependency set.

如何为Google Cloud Functions设置资源限制?

IronPDF在其首次调用时在Cloud Function容器中启动一个Chromium子进程。 Chromium的启动和初始渲染是内存密集型的,函数必须保持活动足够长的时间让引擎初始化完成。对于可靠运行,Cloud Functions的默认资源限制过低。

在 Google Cloud Console 或通过 gcloud CLI 部署函数时,请配置以下限制:

IronPDF Java的推荐Google Cloud Function资源设置
设置 推荐值 原因
超时 330秒 冷启动时Chromium的初始化可能需要60-90秒。函数在引擎准备好之前不应超时。
内存 2,048 MB或更高 Chromium需要大量RAM来渲染复杂的HTML页面。不足的内存会导致进程在渲染中途被终止。
临时存储 1,024 MB或更高 引擎二进制文件和临时PDF文件写入/tmp/。低存储会导致提取或写入失败。

这些值是起始点。 高容量或复杂的PDF生成可能需要更高的内存分配。 在Google Cloud Console中监控Cloud Function内存使用指标,如果观察到内存不足错误,请提高限制。

警告不要将超时减少到180秒以下。 Cloud Functions上IronPDF的冷启动初始化一直需要比标准Java函数更多的时间。

如何配置工作目录和文件权限?

IronPDF 引擎会在启动时将其二进制文件提取到工作目录中。在 Google Cloud Functions 上,唯一可写入和可执行的路径是 /tmp/。 在调用任何IronPDF API之前显式设置工作目录,并确保Dockerfile授予该路径必要的权限。

在函数的入口点顶部,任何PDF操作之前添加此配置调用:

//:path=/static-assets/pdf/content-code-examples/tutorials/google-cloud/configure-working-directory.java
import com.ironsoftware.ironpdf.设置s;
import java.nio.file.Paths;

public class PdfFunction {
    static {
        // Must be called before any IronPDF operation.
        // /tmp/ is the only writable and executable directory in Cloud Functions.
        设置s.setIronPdfEngineWorkingDirectory(Paths.get("/tmp/"));
    }
}
//:path=/static-assets/pdf/content-code-examples/tutorials/google-cloud/configure-working-directory.java
import com.ironsoftware.ironpdf.设置s;
import java.nio.file.Paths;

public class PdfFunction {
    static {
        // Must be called before any IronPDF operation.
        // /tmp/ is the only writable and executable directory in Cloud Functions.
        设置s.setIronPdfEngineWorkingDirectory(Paths.get("/tmp/"));
    }
}
JAVA

然后在您的Dockerfile中添加相应的权限命令:

//:path=Dockerfile
# Ensure the IronPDF engine can extract and run binaries from /tmp/
RUN chmod 777 /tmp/

使用 static {} 初始化块可确保在函数中的任何类尝试加载 IronPDF 引擎之前,工作目录已完成配置。若在实例方法或请求处理程序中设置该块,则存在其他线程在路径配置完成前就初始化引擎的风险。

下一步是什么?

本指南介绍了使用自定义Docker容器在Google Cloud Function中运行IronPDF for Java的完整配置。 关键要点包括:使用自定义的 Dockerfile 安装 Chrome 系统依赖项,包含 ironpdf-engine-linux-x64 Maven 构建产物,将工作目录配置为 /tmp/,将超时时间设置为至少 330 秒,内存设置为至少 2,048 MB,并添加 maven-shade-plugin 以合并服务加载器文件。

要探索IronPDF for Java的更多功能,请访问IronPDF for Java文档或尝试以下指南之一:

获取免费试用许可证,在您的Google Cloud环境中测试IronPDF for Java。 生产环境部署需要许可证密钥。 购买许可证,当您准备好上线时。

常见问题解答

为什么IronPDF for Java在默认的Google Cloud Function镜像上无法启动?

默认的Cloud Function运行时镜像不包含Chromium所需的Linux系统库,如libnss3libatk1.0-0 以及相关的图形包。IronPDF的渲染引擎在内部使用Chromium,因此需要一个明确安装这些依赖项的自定义Dockerfile。

为什么在Google Cloud上不支持Zip部署IronPDF?

IronPDF必须在运行时提取并执行一个本地的Chromium二进制文件。Zip部署模型不提供可写、可执行的文件系统,因此引擎无法提取或启动其二进制文件。需要基于Docker的部署。

Google Cloud Functions上IronPDF需要什么Maven依赖?

ironpdf-engine-linux-x64com.ironsoftware 组添加到您的pom.xml中。版本号必须与核心ironpdf工件完全匹配。此工件捆绑了IronPDF用于渲染的Linux x86-64 Chromium二进制文件。

为什么IronPDF for Java需要maven-shade-plugin?

当以uber-JAR打包时,maven-shade-pluginServicesResourceTransformer 合并所有依赖JAR的META-INF/services/ 文件。如果没有它,gRPC服务注册可能会无声地丢失,导致IronPDF引擎初始化失败。

Google Cloud Functions运行IronPDF需要什么超时和内存设置?

将函数超时设置为330秒,内存至少2048 MB,临时存储至少1024 MB。在冷启动时,Chromium初始化可能需要60到90秒,并且引擎需要大量内存来渲染复杂的HTML页面。

为什么Settings.setIronPdfEngineWorkingDirectory在Google Cloud上必须指向/tmp/?

/tmp/目录是在大多数Google Cloud Function运行时中唯一可写和可执行的路径。IronPDF需要在此位置提取其引擎二进制文件和写临时文件。如果没有此设置,引擎无法找到合适的提取目标,将无法启动。

为什么Dockerfile需要RUN chmod 777 /tmp/?

IronPDF的引擎二进制文件必须同时从/tmp/写入和执行。一些基础镜像中的/tmp/默认权限不包括为所有用户授予执行权限。chmod 777命令确保函数运行时用户可以提取和启动二进制文件。

何时应使用grpc-okhttp而不是grpc-netty-shaded?

grpc-netty-shaded推荐用于生产,因为它提供了更完整的HTTP/2实现。grpc-okhttp是一个较轻的替代方案,在最小化Docker镜像大小时非常有用。两种传输均可在Google Cloud Functions上的IronPDF for Java中使用。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

准备开始了吗?
版本: 2026.5 just released
Still Scrolling Icon

还在滚动吗?

想快速获得证据?
运行示例看着你的HTML代码变成PDF文件。