goharbor/harbor · error · Exception

Error: no provider configurations are provided for provider

Error message

Error: no provider configurations are provided for provider %s

What it means

Thrown by validate() in make/photon/prepare/utils/configs.py when storage_provider_name is a non-filesystem driver but storage_provider_config is the empty string — i.e., a cloud storage backend was selected without any credentials/settings. Distribution cannot use s3/gcs/azure/swift/oss without their required options (bucket, region, keys), so prepare aborts. In the harbor.yml flow the parser stores provider options as a dict (and silently falls back to filesystem when the section is empty), so this exact raise mainly affects conf dicts built the legacy string way; the user-facing twin is misc.py:51 for harbor.cfg.

Source

Thrown at make/photon/prepare/utils/configs.py:56

    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_mode
        except Exception as e:
            logging.error(e)
            raise Exception('Can not get file info')
        err_msg = 'Cert File {} should be owned by user with uid 10000 or readable by others'.format(registry_custom_ca_bundle_path)
        if uid == DEFAULT_UID and not owner_can_read(st_mode):
            raise Exception(err_msg)
        if uid != DEFAULT_UID and not other_can_read(st_mode):

View on GitHub (pinned to 7b2fd08cc5)

Solutions

  1. Fill the provider section under 'storage_service:' in harbor.yml with the required keys for the driver (s3 needs region, bucket, accesskey, secretkey)
  2. In legacy harbor.cfg, set registry_storage_provider_config to the provider's comma-separated options
  3. If you meant to keep local disk, set the provider back to filesystem and remove the cloud section
  4. Re-run ./install.sh

Example fix

# harbor.yml (before)
storage_service:
  s3:

# harbor.yml (after)
storage_service:
  s3:
    region: us-east-1
    bucket: harbor-artifacts
    accesskey: AKIA...
    secretkey: <secret>
Defensive patterns

Strategy: validation

Validate before calling

name = conf.get('storage_provider_name', 'filesystem')
prov = conf.get('storage_provider_config')
if name != 'filesystem' and not prov:
    raise SystemExit('driver %s selected but no provider config given' % name)

Prevention

When it happens

Trigger: storage_provider_name = 's3' (or azure/gcs/swift/oss) while storage_provider_config == '' — typically a hand-built conf dict, a legacy harbor.cfg with empty registry_storage_provider_config, or a migration of an old cfg where the config line was dropped.

Common situations: Switching from filesystem to S3 and filling in the name but not the settings; harbor.cfg to harbor.yml migrations that lose the registry_storage_provider_config line; automation that sets only the driver name.

Related errors


AI-assisted analysis of goharbor/harbor@7b2fd08cc5 (2026-08-16). Data as JSON: /api/errors/5b8e291cf24cce6a. Report an issue: GitHub.