# Container Registries

The container registry is an essential part of most remote MLOps stacks. It is used to store container images that are built to run machine learning pipelines in remote environments. Containerization of the pipeline code creates a portable environment that allows code to run in an isolated manner.

### When to use it

The container registry is needed whenever other components of your stack need to push or pull container images. Currently, this is the case for most of ZenML's remote [orchestrators](https://docs.zenml.io/stacks/orchestrators/) , [step operators](https://docs.zenml.io/stacks/step-operators/), and some [model deployers](https://docs.zenml.io/stacks/model-deployers/). These containerize your pipeline code and therefore require a container registry to store the resulting [Docker](https://www.docker.com/) images. Take a look at the documentation page of the component you want to use in your stack to see if it requires a container registry or even a specific container registry flavor.

### Container Registry Flavors

ZenML comes with a few container registry flavors that you can use:

* Default flavor: Allows any URI without validation. Use this if you want to use a local container registry or when using a remote container registry that is not covered by other flavors.
* Specific flavors: Validates your container registry URI and performs additional checks to ensure you're able to push to the registry.

{% hint style="warning" %}
We highly suggest using the specific container registry flavors in favor of the `default` one to make use of the additional URI validations.
{% endhint %}

| Container Registry                                                                       | Flavor      | Integration | URI example                               |
| ---------------------------------------------------------------------------------------- | ----------- | ----------- | ----------------------------------------- |
| [DefaultContainerRegistry](/stacks/stack-components/container-registries/default.md)     | `default`   | *built-in*  | -                                         |
| [DockerHubContainerRegistry](/stacks/stack-components/container-registries/dockerhub.md) | `dockerhub` | *built-in*  | docker.io/zenml                           |
| [GCPContainerRegistry](/stacks/stack-components/container-registries/gcp.md)             | `gcp`       | *built-in*  | gcr.io/zenml                              |
| [AzureContainerRegistry](/stacks/stack-components/container-registries/azure.md)         | `azure`     | *built-in*  | zenml.azurecr.io                          |
| [GitHubContainerRegistry](/stacks/stack-components/container-registries/github.md)       | `github`    | *built-in*  | ghcr.io/zenml                             |
| [AWSContainerRegistry](/stacks/stack-components/container-registries/aws.md)             | `aws`       | `aws`       | 123456789.dkr.ecr.us-east-1.amazonaws.com |

If you would like to see the available flavors of container registries, you can use the command:

```shell
zenml container-registry flavor list
```

<figure><img src="https://static.scarf.sh/a.png?x-pxid=f0b4f458-0a54-4fcd-aa95-d5ee424815bc" alt="ZenML Scarf"><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.zenml.io/stacks/stack-components/container-registries.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
