Replace custom OCI implementation with go-containerregistry library #40
+564
−104
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR replaces the custom OCI/Docker registry implementation in llama.cpp with the industry-standard go-containerregistry library from Google, as requested in the issue.
Background
Previously, llama.cpp had a custom implementation for pulling models from Docker registries (~120 lines of C++ code in
common/arg.cpp). This implementation had limitations:Changes
New Go Module Integration (
oci-go/)Created a Go module that wraps go-containerregistry with a C-compatible interface using CGO:
oci.go- Core implementation with exportedPullOCIModel()functiongo.mod/go.sum- Dependencies including go-containerregistry v0.20.6liboci.afor cross-platform supportC++ Wrapper Layer (
common/oci.h,common/oci.cpp)Added a clean C++ interface to the Go library:
Updated Docker Registry Resolution (
common/arg.cpp)Simplified the
common_docker_resolve_model()function from ~120 lines to ~30 lines:Build System Integration (
common/CMakeLists.txt)Documentation (
docs/oci-registry.md)Added comprehensive documentation covering:
docker loginBenefits
✅ Proper Docker Login Support: Uses Docker's credential helpers, supporting all authentication methods including credential stores and helpers
✅ Industry Standard: Leverages Google's well-maintained library used by many container tools
✅ Better OCI Compliance: Handles edge cases and protocol changes automatically
✅ Reduced Maintenance: ~90 fewer lines of custom networking code to maintain
✅ Security: No custom HTTP/auth code to audit
Usage
The
--docker-repoflag works exactly as before:Compatibility
--docker-repousage unchangedTesting
Technical Notes
The Go library is statically linked into the final binaries, so users don't need Go installed to run llama.cpp. Go is only required at build time to compile the OCI module.
The implementation uses
authn.DefaultKeychainwhich automatically discovers Docker credentials from:~/.docker/config.jsonThis ensures seamless compatibility with
docker loginand other standard Docker authentication methods.Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
ggml.ai./build/bin/test-arg-parser(dns block)huggingface.co/usr/lib/git-core/git-remote-https origin REDACTED(dns block)/home/REDACTED/work/llama.cpp/llama.cpp/build/bin/test-thread-safety -hf ggml-org/models -hff tinyllamas/stories15M-q4_0.gguf -ngl 99 -p The meaning of life is -n 128 -c 256 -ub 32 -np 4 -t 2(dns block)/home/REDACTED/work/llama.cpp/llama.cpp/build/bin/llama-eval-callback --hf-repo ggml-org/models --hf-file tinyllamas/stories260K.gguf --model stories260K.gguf --prompt hello --seed 42 -ngl 0(dns block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.