Docker Registry storage driver
Estimated reading time: 2 minutes
This page contains information about hosting your own registry using the open source Docker Registry. For information about Docker Hub, which offers a hosted registry with additional features such as teams, organizations, web hooks, automated builds, etc, see Docker Hub.
This document describes the registry storage driver model, implementation, and explains how to contribute new storage drivers.
Provided drivers
This storage driver package comes bundled with several drivers:
- inmemory: A temporary storage driver using a local inmemory map. This exists solely for reference and testing.
- filesystem: A local storage driver configured to use a directory tree in the local filesystem.
- s3: A driver storing objects in an Amazon Simple Storage Service (S3) bucket.
- azure: A driver storing objects in Microsoft Azure Blob Storage.
- swift: A driver storing objects in Openstack Swift.
- oss: A driver storing objects in Aliyun OSS.
- gcs: A driver storing objects in a Google Cloud Storage bucket.
Storage driver API
The storage driver API is designed to model a filesystem-like key/value storage in a manner abstract enough to support a range of drivers from the local filesystem to Amazon S3 or other distributed object storage systems.
Storage drivers are required to implement the storagedriver.StorageDriver
interface provided in storagedriver.go
, which includes methods for reading, writing, and deleting content, as well as listing child objects of a specified prefix key.
Storage drivers are intended to be written in Go, providing compile-time
validation of the storagedriver.StorageDriver
interface.
Driver selection and configuration
The preferred method of selecting a storage driver is using the StorageDriverFactory
interface in the storagedriver/factory
package. These factories provide a common interface for constructing storage drivers with a parameters map. The factory model is based on the Register and Open methods in the builtin database/sql package.
Storage driver factories may be registered by name using the
factory.Register
method, and then later invoked by calling factory.Create
with a driver name and parameters map. If no such storage driver can be found,
factory.Create
returns an InvalidStorageDriverError
.
Driver contribution
Writing new storage drivers
To create a valid storage driver, one must implement the
storagedriver.StorageDriver
interface and make sure to expose this driver
via the factory system.
Registering
Storage drivers should call factory.Register
with their driver name in an init
method, allowing callers of factory.New
to construct instances of this driver without requiring modification of imports throughout the codebase.
Testing
Storage driver test suites are provided in
storagedriver/testsuites/testsuites.go
and may be used for any storage
driver written in Go. Tests can be registered using the RegisterSuite
function, which run the same set of tests for any registered drivers.