IRONSOFTWAREHOME

How to Run IronPDF for Java in Google Cloud

Curtis Chau
Curtis Chau
Updated: September 17, 2026

Deploying IronPDF for Java on Google Cloud Functions requires a non-default configuration because IronPDF relies on a bundled Chromium binary to render HTML into PDF. This guide covers everything needed to run IronPDF inside a custom Docker container on Google Cloud Functions, from the correct pom.xml dependencies to runtime permissions and resource settings.

Important: Google Cloud support for IronPDF for Java is currently experimental; not all configurations have been validated in every region or runtime version. Test deployments thoroughly before publishing to production.

This is not a concern if you are already comfortable with Google Cloud Functions and Docker. The configuration changes are straightforward: swap the default function image for a custom Dockerfile, add the Linux engine dependency, tune the resource limits, and set the working directory. Each step is explained below.

Quickstart: Deploy IronPDF for Java on Google Cloud

The minimal working configuration requires a custom Dockerfile (because the default Cloud Function images lack Chrome's system dependencies), the ironpdf-engine-linux-x64 artifact in your pom.xml, and a working directory pointing to /tmp/. The code below shows how to set the engine working directory in your function entry point:

import com.ironsoftware.ironpdf.Settings;
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.
        Settings.setIronPdfEngineWorkingDirectory(Paths.get("/tmp/"));
    }
}
Java

After setting the working directory, IronPDF can extract and execute its engine binary within the Cloud Function's ephemeral filesystem. The /tmp/ directory is the only writable, executable path available in most Google Cloud Function runtimes.

Table of Contents

Why Don't Default Cloud Function Images Work?

Default Google Cloud Function runtime images are minimal by design; they include only the packages needed to execute function code written in common languages. IronPDF's Chromium-based rendering engine depends on a broader set of Linux system libraries (fonts, graphics libraries, sandboxing tools) that are absent from the standard images.

Google publishes a full list of available system packages for each runtime at the Google Cloud Functions system packages reference. Chromium's dependencies are not included in any of the standard 2nd-gen runtimes. Attempting to load the IronPDF engine in the default image results in a native library load failure at startup.

The solution is to build a custom Docker image that explicitly installs those packages before the function binary is added. This approach is fully supported by Google Cloud Functions and is the same strategy recommended for any function that requires native binaries. Refer to the IronPDF Linux deployment guide for the complete list of packages to include.

Please note: Zip Deployment is not supported for IronPDF on Google Cloud. IronPDF must extract and execute native binaries at runtime, which requires a writable filesystem and execution permissions that the Zip Deployment model does not provide.

How Do I Build a Custom Dockerfile for Google Cloud?

A custom Dockerfile gives complete control over the runtime environment. Start from the official Google Cloud Functions Java base image, then install the system libraries that Chromium requires.

The Dockerfile below demonstrates the recommended pattern. Replace the COPY and CMD entries with the specifics of your function project:

# 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"]
Text

The chmod 777 /tmp/ line is necessary because IronPDF needs to write and execute the engine binary during initialization. Without execute permission on the working directory, the engine will fail to start.

Tips: Test the Docker image locally with docker build and docker run before deploying to Cloud Functions. Local testing catches missing dependencies early and avoids slow cloud build cycles.

How Do I Configure pom.xml for Google Cloud Deployment?

The standard ironpdf Maven artifact bundles engine binaries for multiple platforms. For Google Cloud Functions (which run on Linux x86-64), add the platform-specific engine artifact to keep the deployment image lean and to ensure the correct binary is always available:

<dependencies>
    <!-- Core IronPDF library -->
    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf</artifactId>
        <version>2024.9.1</version>
    </dependency>

    <!-- Linux x64 engine binary — required for Google Cloud Functions -->
    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf-engine-linux-x64</artifactId>
        <version>2024.9.1</version>
    </dependency>
</dependencies>
XML

Always update the version number to the latest IronPDF for Java release. The ironpdf-engine-linux-x64 artifact must match the version of the core ironpdf artifact exactly.

Important: Keep both version numbers in sync. A mismatch between the core artifact and the engine artifact version will cause a runtime startup failure.

How Do I Add the Maven Shade Plugin?

When deploying to Google Cloud Functions as an uber-JAR (fat JAR), the maven-shade-plugin ensures that service loader files from all transitive dependencies are merged correctly. Without it, some gRPC service registrations can be silently dropped, causing the engine to fail to initialize.

Add the following plugin configuration to the <build><plugins> section of your 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>
            <!-- ServicesResourceTransformer merges META-INF/services files
                 from all JARs — required for gRPC service discovery in Docker -->
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>
XML

The ServicesResourceTransformer is the critical piece. It combines META-INF/services/ entries from every dependency JAR into a single merged file. gRPC uses Java's ServiceLoader mechanism, so merged service files are required for transport selection (HTTP/2 vs. plain text) to work at runtime.

How Do I Add Optional gRPC Dependencies?

In some deployment configurations, particularly when using a shaded JAR with certain versions of the Google Cloud Functions framework, explicit gRPC transport dependencies are needed. Add these if the function fails to start with a gRPC transport or channel error:

<dependencies>
    <!-- Performance tracing — may be required by some gRPC versions -->
    <dependency>
        <groupId>io.perfmark</groupId>
        <artifactId>perfmark-api</artifactId>
        <version>0.26.0</version>
    </dependency>

    <!-- OkHttp-based gRPC transport — alternative to Netty for lighter images -->
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-okhttp</artifactId>
        <version>1.50.2</version>
    </dependency>

    <!-- Netty-shaded gRPC transport — recommended for production deployments -->
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty-shaded</artifactId>
        <version>1.50.2</version>
    </dependency>
</dependencies>
XML

In most cases, including grpc-netty-shaded is sufficient for production. The grpc-okhttp transport is a lighter alternative useful when minimizing image size is a priority. Add perfmark-api only if you encounter classpath warnings about missing tracing annotations.

Please note: Check the gRPC release notes to confirm the latest compatible version for your IronPDF dependency set.

How Do I Set Resource Limits for Google Cloud Functions?

IronPDF starts a Chromium subprocess inside the Cloud Function container during its first invocation. Chromium's startup and initial rendering are memory-intensive, and the function must remain alive long enough for the engine to initialize. The default resource limits for Cloud Functions are too low for reliable operation.

Configure the following limits in the Google Cloud Console or via the gcloud CLI when deploying the function:

Recommended Google Cloud Function resource settings for IronPDF Java

SettingRecommended ValueReason
Timeout330 secondsChromium initialization on a cold start can take 60-90 seconds. The function must not time out before the engine is ready.
Memory2,048 MB or higherChromium requires significant RAM to render complex HTML pages. Insufficient memory causes the process to be killed mid-render.
Ephemeral Storage1,024 MB or higherThe engine binary and temporary PDF files are written to /tmp/. Low storage causes extraction or write failures.

These values are starting points. High-volume or complex PDF generation may require higher memory allocations. Monitor Cloud Function memory usage metrics in the Google Cloud Console and increase limits if you observe out-of-memory errors.

Warning: Do not reduce the timeout below 180 seconds. Cold-start initialization for IronPDF on Cloud Functions consistently requires more time than standard Java functions.

How Do I Configure the Working Directory and File Permissions?

The IronPDF engine extracts its binary to a working directory at startup. On Google Cloud Functions, the only writable and executable path is /tmp/. Set the working directory explicitly before calling any IronPDF API, and ensure the Dockerfile grants the necessary permissions on that path.

Add this configuration call at the top of your function entry point, before any PDF operations:

import com.ironsoftware.ironpdf.Settings;
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.
        Settings.setIronPdfEngineWorkingDirectory(Paths.get("/tmp/"));
    }
}
Java

Then add the corresponding permission command to your Dockerfile:

# Ensure the IronPDF engine can extract and run binaries from /tmp/
RUN chmod 777 /tmp/
Text

Using a static {} initializer block guarantees the working directory is configured before any class in your function attempts to load the IronPDF engine. If you set it in an instance method or request handler, there is a risk that another thread initializes the engine before the path is configured.

What Are the Next Steps?

This guide covers the complete configuration for running IronPDF for Java inside a Google Cloud Function using a custom Docker container. The key points are: use a custom Dockerfile that installs Chrome system dependencies, include the ironpdf-engine-linux-x64 Maven artifact, configure the working directory to /tmp/, set the timeout to at least 330 seconds and memory to at least 2,048 MB, and add the maven-shade-plugin to merge service loader files.

To explore more of what IronPDF for Java can do, visit the IronPDF for Java documentation or try one of these guides:

Get a free trial license to test IronPDF for Java in your Google Cloud environment. A license key is required for production deployments. Purchase a license when you are ready to go live.

Frequently Asked Questions

Why do I need a custom Docker setup for IronPDF on Google Cloud Functions?

Google Cloud Function's default images don't include Chromium’s system dependencies needed by IronPDF's rendering engine. A custom Docker setup allows you to install these dependencies and configure the environment to execute IronPDF properly.

What is the importance of setting the working directory to /tmp/ in IronPDF for Java?

In Google Cloud Functions, /tmp/ is the only writable, executable directory. Configuring IronPDF to use /tmp/ as its working directory allows it to extract and execute its engine binaries successfully.

What are the recommended resource limits for deploying IronPDF on Google Cloud Functions?

The recommended settings are a timeout of at least 330 seconds, memory of 2,048 MB or higher, and ephemeral storage of 1,024 MB or higher to accommodate Chromium's resource requirements during PDF rendering.

How can I ensure that IronPDF's engine is configured before any operations?

Use a static initializer block in your Java entry point to set the working directory before executing any IronPDF operations. This ensures that concurrent threads do not attempt to start the engine before configuration.

Why is the Maven Shade Plugin required for IronPDF deployments in Google Cloud?

The Maven Shade Plugin is used to merge service loader files from all JAR dependencies, which is essential for gRPC service discovery. This prevents initialization failures of IronPDF when deploying as an uber-JAR.

What dependencies must be added to the pom.xml for Google Cloud deployment?

In the pom.xml, include the `ironpdf-engine-linux-x64` artifact along with the core IronPDF library to ensure that the engine binaries for Linux x86-64 systems are available, which are necessary for Google Cloud Functions.

What steps are needed to build a custom Dockerfile for IronPDF on Google Cloud?

Start with the official Google Cloud Functions Java base image, install Chromium's system dependencies, set execute permissions on /tmp/, and specify the entry point for your JAR application.

How do I resolve gRPC transport errors in my IronPDF deployment?

Add explicit dependencies like `grpc-netty-shaded` or `grpc-okhttp` to your project to resolve any gRPC transport or channel errors during function initialization.

How do I configure pom.xml for optimal performance in IronPDF deployments?

Ensure the `ironpdf-engine-linux-x64` artifact's version matches the core `ironpdf` library version in your pom.xml. This ensures compatibility and prevents runtime errors.

What troubleshooting steps should I take if my IronPDF function fails to initialize?

Verify that all Chromium dependencies are included in your Docker setup, check resource limits for sufficient allocation, and ensure that `/tmp/` permissions are correctly set in your Dockerfile.

Curtis Chau
Technical Writer

Curtis Chau holds a Bachelor’s degree in Computer Science (Carleton University) and specializes in front-end development with expertise in Node.js, TypeScript, JavaScript, and React. Passionate about crafting intuitive and aesthetically pleasing user interfaces, Curtis enjoys working with modern frameworks and creating well-structured, visually appealing manuals.

...
Read More

Ready to Get Started?

Version:2026.8just released

Get your free 30-day Trial Key instantly.
No credit card or account creation required
Java Maven Library for PDF
Install with Maven

Version: 2026.8

<dependency>
   <groupId>com.ironsoftware</groupId>
   <artifactId>ironpdf</artifactId>
   <version>2026.8.2</version>
</dependency>
https://central.sonatype.com/artifact/com.ironsoftware/ironpdf/2026.8.2
or
Java PDF JAR
Download JAR

Version: 2026.8

Manually install into your project

Key in blue circle

Get your free 30-day Trial Key instantly.

Your trial license will be sent to your email address

No limitations. 100% unlocked. No credit card.

OR
bullet_checkedNo credit card or account creation requiredNo limitations. 100% unlocked. No credit card.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried Iron Suite
Book your free Live Demo
Booking Badge

Trusted by Millions of Engineers Worldwide

Iron Software's customer logos
Get Your No-Obligation Consult
Complete the form below or email sales@ironsoftware.com
Your details will always be kept confidential.
Trusted by Millions of Engineers Worldwide
Iron Software's customer logos
Get your free 30-day Trial Key instantly.
No credit card or account creation required
Java Maven Library for PDF
Install with Maven

Version: 2026.8

<dependency>
   <groupId>com.ironsoftware</groupId>
   <artifactId>ironpdf</artifactId>
   <version>2026.8.2</version>
</dependency>
https://central.sonatype.com/artifact/com.ironsoftware/ironpdf/2026.8.2
or
Java PDF JAR
Download JAR

Version: 2026.8

Manually install into your project