- Write a Dockerfile to build an image that stores your Prefect flow code.
- Build a Docker image for your flow.
- Deploy and run your Docker image on a Kubernetes cluster.
- Look at the Prefect-maintained Docker images and discuss options for use.
prefect.yaml file, the build step makes it easy to customize your
Docker image and push it to the registry of your choice. See an example.
Deployment creation with a Python script that includes
flow.deploy similarly allows you to customize
your Docker image with keyword arguments as shown below.Prerequisites
- A Python script that defines and serves a flow. This guide uses the flow script and deployment from the Deployments guide.
- Access to a running Prefect API server. Sign up for a forever free
Prefect Cloud account, or run a Prefect API server
locally with
prefect server start. - Docker Desktop installed on your machine.
Write a Dockerfile
Make a clean directory to work from, calledprefect-docker-guide.
flows and put your flow script
from the Deployments guide in it.
prefect-docker-guide-flow.py
requirements.txt to the prefect-docker-guide directory.
Include all dependencies required for your prefect-docker-guide-flow.py script in the
Docker image to build.
requirements.txt file:
requirements.txt
Dockerfile to create a Docker image that also stores the flow code:
Dockerfile:
Dockerfile
Build a Docker image
Now that you have a Dockerfile, build your image by running:- Cloud
- Self-hosted
Your container needs an API URL and an API key to communicate with Prefect Cloud.After running the above command, the container should start up and serve the flow within the container.
- You can get an API key from the API Keys section of the user settings in the Prefect UI.
-
You can get your API URL by running
prefect config viewand copying thePREFECT_API_URLvalue.
-e flag.Deploy to a remote environment
Now that you have a Docker image with your flow code embedded, you can deploy it to a remote environment. This guide simulates a remote environment by using Kubernetes locally with Docker Desktop. Use the instructions provided by Docker to set up Kubernetes locally.Create a Kubernetes deployment manifest
To ensure the process serving your flow is always running, create a Kubernetes deployment. If your flow’s container crashes, Kubernetes automatically restarts it, ensuring you don’t miss any scheduled runs. First, create adeployment-manifest.yaml file in your prefect-docker-guide directory:
deployment-manifest.yaml file:
- Cloud
- Self-hosted
deployment-manifest.yaml
replicas value.
Deploy your flow to the cluster
You now have a deployment manifest. To deploy your flow to the cluster, use:prefect deployment run command and follow the flow run
through the logs in the Prefect UI.
Prefect-maintained Docker images
Every release of Prefect results in several new Docker images. These images are all named prefecthq/prefect and their tags identify their differences.Image tags
When a release is published, images are built for all of Prefect’s supported Python versions. These images are tagged to identify the combination of Prefect and Python versions contained. Additionally, we have “convenience” tags which are updated with each release to facilitate automatic updates. For example, when release3.1.1 is published:
- Images with the release packaged are built for each supported Python version (3.9, 3.10, 3.11, 3.12) with both standard Python and Conda.
- These images are tagged with the full description. For example,
prefect:3.1.1-python3.10andprefect:3.1.1-python3.10-conda. - For users that want more specific pins, these images are also tagged with the SHA of the
git commit of the release. For example,
sha-88a7ff17a3435ec33c95c0323b8f05d7b9f3f6d2-python3.10. - To be on the latest
3.1.xrelease and receiving patch updates, we update a tag without the patch version to this release. For example,prefect.3.1-python3.10. - To be on the latest
3.x.yrelease and receiving minor version updates, we update a tag without the minor or patch version to this release. For example,prefect.3-python3.10. - For users who want the latest
3.x.yrelease without specifying a Python version, we update3-latestto the image for our highest supported Python version, which in this case is equivalent toprefect:3.1.1-python3.10.
Standard Python
Standard Python images are based on the official Pythonslim images, such as python:3.10-slim.
| Tag | Prefect Version | Python Version |
|---|---|---|
| 3-latest | most recent v2 PyPi version | 3.10 |
| 3-python3.12 | most recent v2 PyPi version | 3.12 |
| 3-python3.11 | most recent v2 PyPi version | 3.11 |
| 3-python3.10 | most recent v2 PyPi version | 3.10 |
| 3-python3.9 | most recent v2 PyPi version | 3.9 |
| 3.X-python3.12 | 2.X | 3.12 |
| 3.X-python3.11 | 2.X | 3.11 |
| 3.X-python3.10 | 2.X | 3.10 |
| 3.X-python3.9 | 2.X | 3.9 |
| sha-<hash>-python3.12 | <hash> | 3.12 |
| sha-<hash>-python3.11 | <hash> | 3.11 |
| sha-<hash>-python3.10 | <hash> | 3.10 |
| sha-<hash>-python3.9 | <hash> | 3.9 |
Conda-flavored Python
Conda-flavored images are based oncontinuumio/miniconda3.
Prefect is installed into a conda environment named prefect.
| Tag | Prefect Version | Python Version |
|---|---|---|
| 3-latest-conda | most recent v3 PyPi version | 3.10 |
| 3-python3.12-conda | most recent v3 PyPi version | 3.12 |
| 3-python3.11-conda | most recent v3 PyPi version | 3.11 |
| 3-python3.10-conda | most recent v3 PyPi version | 3.10 |
| 3-python3.9-conda | most recent v3 PyPi version | 3.9 |
| 3.X-python3.12-conda | 3.X | 3.12 |
| 3.X-python3.11-conda | 3.X | 3.11 |
| 3.X-python3.10-conda | 3.X | 3.10 |
| 3.X-python3.9-conda | 3.X | 3.9 |
| sha-<hash>-python3.12-conda | <hash> | 3.12 |
| sha-<hash>-python3.11-conda | <hash> | 3.11 |
| sha-<hash>-python3.10-conda | <hash> | 3.10 |
| sha-<hash>-python3.9-conda | <hash> | 3.9 |
Build your own image
If your flow relies on dependencies not found in the defaultprefecthq/prefect images,
you may want to build your own image. You can either
base it off of one of the provided prefecthq/prefect images, or build your own image.
See the Work pool deployment guide
to build custom images with dependencies specified in a requirements.txt file.
By default, Prefect work pools
that use containers refer to the 3-latest image.
You can specify another image at work pool creation.
You can override the work pool image choice in individual deployments.
Extend the prefecthq/prefect image manually
Here is an example Dockerfile for building an image based on
prefecthq/prefect:2-latest, but with scikit-learn installed:
Choose an image strategy
The options described above have different complexity and performance characteristics. We recommend the following when choosing a strategy:-
If your flow only makes use of tasks defined in the same file as the flow,
or tasks that are part of
prefectitself, you can rely on the default providedprefecthq/prefectimage. -
If your flow requires a few extra dependencies found on PyPI, you can use the default
prefecthq/prefectimage and specify additional packages to install at runtime when you create a deployment or a work pool. - If the installation process requires compiling code or other expensive operations, consider building a custom image instead.
- If your flow requires extra dependencies or shared libraries, we recommend building a shared custom image with all the extra dependencies and shared task definitions you need. Your flows can all rely on the same image, but have their source stored externally. This option eases development, since the shared image only needs to be rebuilt when dependencies change, not when a flow’s code changes.
Next steps
- You can extend this setup to serve
multiple flows in a single Docker image by updating your Python script to use
flow.to_deploymentandserveto serve multiple flows or the same flow with different configuration. - To learn more about deploying flows, check out the Deployments concept doc.
- For advanced infrastructure requirements, such as executing each flow run within its own dedicated Docker container, learn more in the Work pool deployment guide.