goharbor/harbor · error · Exception
Error: storage driver %s is not supported, only the followin
Error message
Error: storage driver %s is not supported, only the following ones are supported: %s
What it means
Thrown by validate() in make/photon/prepare/utils/configs.py when storage_provider_name is not one of filesystem, azure, gcs, s3, swift, oss. These are the Docker Distribution storage backends Harbor can render into the registry config. Note: in the harbor.yml flow the parser itself only assigns these exact names (defaulting to 'filesystem'), so this branch fires when validate() is called on a dict whose provider name is missing (None) or mistyped — typically from scripts/tests that build the conf dict by hand; the legacy harbor.cfg variant of the same message (misc.py:44) fires on typos in registry_storage_provider_name.
Source
Thrown at make/photon/prepare/utils/configs.py:49
raise Exception("Error: The protocol is https but attribute ssl_cert is not set")
if not conf.get("cert_key_path") or conf['cert_key_path'] == default_https_key_path:
raise Exception("Error: The protocol is https but attribute ssl_cert_key is not set")
if protocol == "http":
logging.warning("WARNING: HTTP protocol is insecure. Harbor will deprecate http protocol in the future. Please make sure to upgrade to https")
# log endpoint validate
if ('log_ep_host' in conf) and not conf['log_ep_host']:
raise Exception('Error: must set log endpoint host to enable external host')
if ('log_ep_port' in conf) and not conf['log_ep_port']:
raise Exception('Error: must set log endpoint port to enable external host')
if ('log_ep_protocol' in conf) and (conf['log_ep_protocol'] not in ['udp', 'tcp']):
raise Exception("Protocol in external log endpoint must be one of 'udp' or 'tcp' ")
# Storage validate
valid_storage_drivers = ["filesystem", "azure", "gcs", "s3", "swift", "oss"]
storage_provider_name = conf.get("storage_provider_name")
if storage_provider_name not in valid_storage_drivers:
raise Exception("Error: storage driver %s is not supported, only the following ones are supported: %s" % (
storage_provider_name, ",".join(valid_storage_drivers)))
# original is registry_storage_provider_config
storage_provider_config = conf.get("storage_provider_config")
if storage_provider_name != "filesystem":
if storage_provider_config == "":
raise Exception(
"Error: no provider configurations are provided for provider %s" % storage_provider_name)
# ca_bundle validate
if conf.get('registry_custom_ca_bundle_path'):
registry_custom_ca_bundle_path = conf.get('registry_custom_ca_bundle_path') or ''
if registry_custom_ca_bundle_path.startswith('/data/'):
ca_bundle_host_path = registry_custom_ca_bundle_path
else:
ca_bundle_host_path = os.path.join(host_root_dir, registry_custom_ca_bundle_path.lstrip('/'))
try:
uid = os.stat(ca_bundle_host_path).st_uid
st_mode = os.stat(ca_bundle_host_path).st_modeView on GitHub (pinned to 7b2fd08cc5)
Solutions
- Use one of the exact lowercase names: filesystem, azure, gcs, s3, swift, oss
- For S3-compatible endpoints (minio, ceph, wasabi) choose 's3' and set regionendpoint in the provider config
- If you do not need object storage, remove the storage_service provider section so 'filesystem' applies
- Re-run prepare and confirm the registry config renders
Example fix
# hand-built conf / legacy harbor.cfg (before) conf['storage_provider_name'] = 'S3' # after conf['storage_provider_name'] = 's3' # minio/ceph also use 's3'
Defensive patterns
Strategy: validation
Validate before calling
VALID = {'filesystem', 'azure', 'gcs', 's3', 'swift', 'oss'}
name = conf.get('storage_provider_name')
if name not in VALID:
raise SystemExit('storage driver %r not supported; use one of %s' % (name, sorted(VALID))) Prevention
- Driver names are case-sensitive lowercase identifiers
- S3-compatible services are configured under 's3', not their own driver
- When calling validate() programmatically, always set storage_provider_name explicitly
When it happens
Trigger: Calling utils.configs.validate(conf) directly with conf['storage_provider_name'] unset or misspelled; in the legacy harbor.cfg flow, registry_storage_provider_name = S3 / FileSystem / minio. A None provider (key absent) also raises, which is how direct API callers hit it.
Common situations: Custom deployment tooling that wraps Harbor's prepare; harbor.cfg-era configs; users assuming arbitrary S3-compatible backends (minio, ceph) are separate drivers.
Related errors
- Error: no provider configurations are provided for provider
- Error: storage driver %s is not supported, only the followin
- Only can have one trace exporter at a time
- Please specify hostname
- Protocol in external log endpoint must be one of 'udp' or 't
AI-assisted analysis of goharbor/harbor@7b2fd08cc5 (2026-08-16).
Data as JSON: /api/errors/b9d7e6519cc53dbf.
Report an issue: GitHub.