- 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: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 view
and copying thePREFECT_API_URL
value.
-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:
deployment-manifest.yaml
Keep your API key secretIn the above manifest, you are passing the Prefect API URL and API key as environment variables.
This approach is simple, but not secure. If you are deploying your flow to a remote cluster, use a
Kubernetes secret
to store your API key.
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.10
andprefect: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.x
release 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.y
release 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.y
release without specifying a Python version, we update3-latest
to the image for our highest supported Python version, which in this case is equivalent toprefect:3.1.1-python3.10
.
Choose image versions carefullyIt’s a good practice to use Docker images with specific Prefect versions in production.Be careful when employing images that automatically update to new versions
(such as
prefecthq/prefect:2-python3.11
or prefecthq/prefect:3-latest
).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
prefect
itself, you can rely on the default providedprefecthq/prefect
image. -
If your flow requires a few extra dependencies found on PyPI, you can use the default
prefecthq/prefect
image 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_deployment
andserve
to 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.