goharbor/harbor

Azure ACR replication adapter does not support chunked/resumable blob uploads (413 error)

Open

#23015 opened on Mar 19, 2026

View on GitHub
 (2 comments) (0 reactions) (0 assignees)Go (28,490 stars) (5,235 forks)batch import
Stalehelp wantedreplication/adapters

Description

Description

Harbor's azure-acr replication adapter pushes blobs as single monolithic PUT requests. Azure ACR enforces a request body size limit and rejects uploads above ~20MB with HTTP 413. This makes push-based replication to Azure ACR unusable for any image with layers larger than ~20MB.

This is a continuation of #21640 which was closed without resolution.

Environment

  • Harbor version: v2.16.0 (Helm, Kubernetes)
  • Replication mode: Push-based, event-based trigger
  • Destination: Azure ACR Basic tier (*.azurecr.io)

Steps to reproduce

  1. Create a push-based replication rule targeting an Azure ACR registry
  2. Push an image with any blob layer > ~20MB
  3. Replication fails with 413

Error log [ERROR] failed to pushing the blob sha256:77dab3318d..., size 29154834: http status code: 413, body: 413 Request Entity Too Large - AzureContainerRegistry

What we tried

  • Set REPLICATION_CHUNK_SIZE=5242880 (5MB) as env var on jobservice pod — confirmed present but has no effect on the azure-acr adapter
  • Per the documentation: "Copy by chunk has not been verified officially between harbor and other type registries"
  • Docker CLI push to the same ACR endpoint works fine (uses OCI-compliant chunked uploads)

Expected behavior The azure-acr replication adapter should use chunked/resumable uploads (as per the OCI distribution spec) when pushing blobs, similar to how the Docker client handles it.

Contributor guide