his flavor."""

return BaseContainerRegistryConfig@property

def implementation_class(self) -> Type[BaseContainerRegistry]:

"""Implementation class."""

return BaseContainerRegistry

This is a slimmed-down version of the base implementation which aims to highlight the abstraction layer. In order to see the full implementation and get the complete docstrings, please check the SDK docs .

Building your own container registry

If you want to create your own custom flavor for a container registry, you can follow the following steps:

Create a class that inherits from the BaseContainerRegistry class and if you need to execute any checks/validation before the image gets pushed, you can define these operations in the prepare_image_push method. As an example, you can check the AWSContainerRegistry.

If you need further configuration, you can create a class which inherits from the BaseContainerRegistryConfig class.

Bring both the implementation and the configuration together by inheriting from the BaseContainerRegistryFlavor class.

Once you are done with the implementation, you can register it through the CLI. Please ensure you point to the flavor class via dot notation:

zenml container-registry flavor register <path.to.MyContainerRegistryFlavor>

For example, your flavor class MyContainerRegistryFlavor is defined in flavors/my_flavor.py, you'd register it by doing:

zenml container-registry flavor register flavors.my_flavor.MyContainerRegistryFlavor

ZenML resolves the flavor class by taking the path where you initialized zenml (via zenml init) as the starting point of resolution. Therefore, please ensure you follow the best practice of initializing zenml at the root of your repository.

If ZenML does not find an initialized ZenML repository in any parent directory, it will default to the current working directory, but usually it's better to not have to rely on this mechanism, and initialize zenml at the root.

Afterward, you should see the new flavor in the list of available flavors: