Packaging For Deployment

Stateful Functions applications can be packaged as either standalone applications or Flink jobs that can be submitted to a cluster.


The recommended deployment mode for Stateful Functions applications is to build a Docker image. This way, user code does not need to package any Apache Flink components. The provided base image allows teams to package their applications with all the necessary runtime dependencies quickly.

Below is an example Dockerfile for building a Stateful Functions image with both an embedded module and a remote module for an application called statefun-example.

FROM flink-statefun:2.3-SNAPSHOT

RUN mkdir -p /opt/statefun/modules/statefun-example
RUN mkdir -p /opt/statefun/modules/remote

COPY target/statefun-example*jar /opt/statefun/modules/statefun-example/
COPY module.yaml /opt/statefun/modules/remote/module.yaml
Attention: The Flink community does not publish images for snapshot versions. You can build this version locally by cloning the repo and following the instructions in tools/docker/

If you prefer to package your job to submit to an existing Flink cluster, simply include statefun-flink-distribution as a dependency to your application.


It includes all of Stateful Functions’ runtime dependencies and configures the application’s main entry-point.

Attention: The distribution must be bundled in your application fat JAR so that it is on Flink's user code class loader
./bin/flink run -c org.apache.flink.statefun.flink.core.StatefulFunctionsJob ./statefun-example.jar

The following configurations are strictly required for running StateFun application.

classloader.parent-first-patterns.additional: org.apache.flink.statefun;org.apache.kafka;