.gitlab
chore: apply suggestion
cmd
feat(benchmark): Add manifest and chunked upload support (#2)
config
ci: replace bitnami postgresql with stgres:${PG_VERSION}-trixie image
configuration
feat(registry): add database prefer mode
containers
chore: revert/adjust few changes from community contribution
context
chore: rename few var names that I missed
docs
chore: roll documentation linting tool versions forward
health
chore: consolidate DLB host log key
internal
Merge branch 'fix-importer-ff-handling' into 'master'
log
refactor: unify storage driver logging around log.Logger
manifest
test: avoid variable aliasing in conformance tests
metrics
refactor: notifications metrics improvements
notifications
fix: do not skip setting up ignore actions filter when ignored media types filter is not set
reference
test: avoid variable aliasing in conformance tests
registry
fix(handlers): prevent fk violation cache race
script
ci: ci-tool should use BIGINT for pipeline-id
testutil
test: reduce log level for verbose flaky test
uuid
test: refactor legacy assertions using testify package part 1
version
ci: revive linter fixes part 2 (of around 11)
.commitlintrc.yml
ci: enforce and validate conventional commits spec
.dockerignore
chore: update Dockerfile
.gitignore
chore: add node_modules to gitignore
.gitlab-ci.yml
ci: automate backport patch job
.golangci.yml
ci: add missing buildtag to linter config
.markdownlint-cli2.yaml
chore: roll documentation linting tool versions forward
.releaserc.yml
chore(semantic-release): allow build commits to trigger release
.tool-versions
chore: roll documentation linting tool versions forward
.vale.ini
chore: update linting tools in project
blobs.go
ci: revive linter fixes part 1 (of around 11)
CHANGELOG.md
chore(release): 4.32.0
CONTRIBUTING.md
ci: automate backport patch job
Dangerfile
ci: add dangerfiles for mr hygiene
doc.go
docs: new README and CONTRIBUTING docs
errors.go
feat(handlers/configuration): enable manifest payload size limit
Gemfile
ci: add dangerfiles for mr hygiene
go.mod
build(deps): update module github.com/aws/aws-sdk-go-v2/service/s3 to v1.92.1
go.sum
build(deps): update module github.com/aws/aws-sdk-go-v2/service/s3 to v1.92.1
LICENSE
Initial commit
Makefile
chore: roll documentation linting tool versions forward
manifests.go
refactor: fix revive linter issues, part 10/11
README.md
feat(benchmark): Add manifest and chunked upload support (#2)
registry.go
fix(datastore): importer: manage lockfiles when REGISTRY_FF_ENFORCE_LOCKFILES is disabled
tags.go
context: remove definition of Context

GitLab Container Registry

Quick Links: Roadmap | Want to Contribute? |

Historical Background

The GitLab Container Registry originated as a fork of the Docker Distribution Registry, now CNCF Distribution, both distributed under Apache License Version 2.0.

The first GitLab change on top of the upstream implementation was efe421fd, and since then we have diverged enough to the point where we decided to detach from upstream and proceed on our own path.

Since then, we have implemented and released several major performance improvements and bug fixes. For a list of changes, please see differences from upstream. These changes culminated on a new architecture based on a relational metadata database and the original goal, enabling online garbage collection.

Benchmarking

A benchmark tool is available to measure push/pull performance with realistic Docker-like operations.

Build

go build -o bin/benchmark ./cmd/benchmark

Usage

./bin/benchmark --help

Usage of ./bin/benchmark:
  -chunk-size int
        Chunk size in bytes for chunked uploads (default 5242880 = 5MB)
  -iterations int
        Number of iterations per size (default 3)
  -layers int
        Number of layers per image (default 1)
  -monolithic
        Use monolithic uploads instead of chunked (default: chunked)
  -output string
        Output format: text or json (default "text")
  -registry string
        Target registry URL (default "http://localhost:5000")
  -repository string
        Repository path for test images (default "benchmark/test")
  -sizes string
        Comma-separated layer sizes to test (default "1GB,2GB")
  -tag string
        Tag for manifest (default "benchmark")

How It Works

The benchmark simulates realistic Docker push/pull operations:

  • Pushes config blob + layer blobs + manifest
  • Pulls manifest + config blob + layer blobs
  • Layers are pushed/pulled concurrently (like Docker client)
  • Supports chunked (PATCH) or monolithic (PUT) uploads

Examples

# Default: 1GB layer, chunked uploads (5MB chunks)
./bin/benchmark -registry http://localhost:5555 -sizes 1GB

# Multi-layer image (3 x 1GB layers = 3GB total)
./bin/benchmark -registry http://localhost:5555 -sizes 1GB -layers 3

# Larger chunks for better throughput
./bin/benchmark -registry http://localhost:5555 -sizes 1GB -chunk-size 52428800

# Monolithic uploads (single PUT per layer)
./bin/benchmark -registry http://localhost:5555 -sizes 1GB -layers 3 -monolithic

Contributing

Please see CONTRIBUTING.md for details on how to contribute.