2021-06-28 04:45:29 -05:00
# zot [![build-test](https://github.com/anuvu/zot/actions/workflows/ci-cd.yml/badge.svg?branch=master)](https://github.com/anuvu/zot/actions/workflows/ci-cd.yml) [![codecov.io](http://codecov.io/github/anuvu/zot/coverage.svg?branch=master)](http://codecov.io/github/anuvu/zot?branch=master) [![Conformance Results](https://github.com/anuvu/zot/workflows/conformance/badge.svg)](https://github.com/anuvu/zot/actions?query=workflow%3Aconformance)
2019-06-20 18:36:40 -05:00
2021-05-26 22:07:45 -05:00
**zot** is a vendor-neutral OCI image registry server purely based on
2019-10-09 13:50:10 -05:00
[OCI Distribution Specification ](https://github.com/opencontainers/distribution-spec ).
2019-06-20 18:36:40 -05:00
2020-12-16 20:49:41 -05:00
https://anuvu.github.io/zot/
2021-06-25 12:21:29 -05:00
[```docker pull ghcr.io/anuvu/zot:latest``` ](https://github.com/anuvu/zot/pkgs/container/zot )
2021-06-26 02:48:28 -05:00
2021-06-26 02:48:16 -05:00
[```docker run -p 5000:5000 ghcr.io/anuvu/zot:latest``` ](https://github.com/anuvu/zot/pkgs/container/zot )
2021-06-25 12:21:29 -05:00
2021-09-23 14:35:39 -05:00
[**Why zot?** ](COMPARISON.md )
2021-09-23 14:35:06 -05:00
2020-12-16 20:49:41 -05:00
# Features
2021-01-27 20:36:33 -05:00
* Conforms to [OCI distribution spec ](https://github.com/opencontainers/distribution-spec ) APIs
2021-06-09 16:29:15 -05:00
* Clear separation between core dist-spec and zot-specific extensions
* ```make binary-minimal``` builds a dist-spec-only zot
* ```make binary``` builds a zot with all extensions enabled
2020-10-29 11:39:00 -05:00
* Uses [OCI image layout ](https://github.com/opencontainers/image-spec/blob/master/image-layout.md ) for image storage
2021-04-29 11:36:21 -05:00
* Can serve any OCI image layout as a registry
2020-05-19 18:53:05 -05:00
* Supports [helm charts ](https://helm.sh/docs/topics/registries/ )
2021-08-31 01:30:41 -05:00
* Behavior controlled via [configuration ](./examples/README.md )
2021-08-20 16:08:41 -05:00
* Supports image deletion by tag
2020-01-16 17:44:25 -05:00
* Currently suitable for on-prem deployments (e.g. colocated with Kubernetes)
2020-09-24 12:14:41 -05:00
* Compatible with ecosystem tools such as [skopeo ](#skopeo ) and [cri-o ](#cri-o )
2020-07-06 17:44:32 -05:00
* [Vulnerability scanning of images ](#Scanning-images-for-known-vulnerabilities )
2020-06-16 20:52:40 -05:00
* [Command-line client support ](#cli )
2019-06-20 18:36:40 -05:00
* TLS support
2020-02-17 16:57:15 -05:00
* Authentication via:
* TLS mutual authentication
* HTTP *Basic* (local _htpasswd_ and LDAP)
* HTTP *Bearer* token
2021-08-31 01:30:41 -05:00
* Supports Identity-Based Access Control
2021-05-13 13:59:12 -05:00
* Supports live modifications on the config file while zot is running (Authorization config only)
2019-08-28 17:16:11 -05:00
* Doesn't require _root_ privileges
2020-02-17 16:57:15 -05:00
* Storage optimizations:
* Automatic garbage collection of orphaned blobs
* Layer deduplication using hard links when content is identical
2021-04-05 19:40:33 -05:00
* Serve [multiple storage paths (and backends) ](./examples/config-multiple.json ) using a single zot server
2021-06-08 15:11:18 -05:00
* Pull and synchronize with other zot registries [sync ](#sync )
2019-08-15 11:34:54 -05:00
* Swagger based documentation
2020-09-24 12:14:41 -05:00
* Single binary for _all_ the above features
2019-10-07 15:26:19 -05:00
* Released under Apache 2.0 License
2021-10-15 10:05:00 -05:00
* [Metrics ](#metrics ) with Prometheus
* Using a node exporter in case of dist-spec-only zot
2019-12-11 17:11:52 -05:00
* ```go get -u github.com/anuvu/zot/cmd/zot```
2019-10-07 15:26:19 -05:00
# Presentations
* [OCI Weekly Discussion - Oct 2, 2019 ](https://hackmd.io/El8Dd2xrTlCaCG59ns5cwg#October-2-2019 )
2019-06-26 16:28:34 -05:00
2019-12-11 17:11:52 -05:00
# Build and install binary (using host's toolchain)
```
go get -u github.com/anuvu/zot/cmd/zot
```
# Full CI/CD Build
2019-08-14 14:35:51 -05:00
* Build inside a container (preferred)
```
make binary-container
```
2019-08-14 18:26:25 -05:00
* Alternatively, build inside a container using [stacker ](https://github.com/anuvu/stacker ) (preferred)
```
make binary-stacker
```
2019-08-14 14:35:51 -05:00
* Build using host's toolchain
```
make
```
Build artifacts are in bin/
2019-10-09 13:50:10 -05:00
# Serving
2020-01-24 12:54:38 -05:00
2019-10-09 13:50:10 -05:00
```
2019-08-28 17:16:11 -05:00
bin/zot serve _config-file_
2019-10-09 13:50:10 -05:00
```
2019-08-28 17:16:11 -05:00
Examples of config files are available in [examples/ ](examples/ ) dir.
2020-01-24 12:54:38 -05:00
# Container Image
The [Dockerfile ](./Dockerfile ) in this repo can be used to build a container image
that runs _zot_ .
2020-01-27 10:44:07 -05:00
To build the image with ref `zot:latest` :
2020-01-24 12:54:38 -05:00
```
make image
```
Then run the image with your preferred container runtime:
```
# with podman
2020-01-27 10:47:08 -05:00
podman run --rm -it -p 5000:5000 -v $(pwd)/registry:/var/lib/registry zot:latest
2020-01-24 12:54:38 -05:00
# with docker
2020-01-27 10:47:08 -05:00
docker run --rm -it -p 5000:5000 -v $(pwd)/registry:/var/lib/registry zot:latest
2020-01-24 12:54:38 -05:00
```
2020-01-27 10:44:07 -05:00
This will run a registry at http://localhost:5000, storing content at `./registry`
(bind mounted to `/var/lib/registry` in the container). By default, auth is disabled.
2020-01-24 12:54:38 -05:00
If you wish use custom configuration settings, you can override
the YAML config file located at `/etc/zot/config.yml` :
```
# Example: using a local file "custom-config.yml" that
2020-01-27 10:44:07 -05:00
# listens on port 8080 and uses /tmp/zot for storage root
2020-01-24 12:54:38 -05:00
podman run --rm -p 8080:8080 \
-v $(pwd)/custom-config.yml:/etc/zot/config.yml \
-v $(pwd)/registry:/tmp/zot \
zot:latest
```
2020-06-16 20:52:40 -05:00
# CLI
The same zot binary can be used for interacting with any zot server instances.
## Adding a zot server URL
To add a zot server URL with an alias "remote-zot":
```console
$ zot config add remote-zot https://server-example:8080
```
List all configured URLs with their aliases:
```console
$ zot config -l
remote-zot https://server-example:8080
local http://localhost:8080
```
2020-07-06 17:44:32 -05:00
## Listing images
You can list all images from a server by using its alias specified [in this step ](#adding-a-zot-server-url ):
2020-06-16 20:52:40 -05:00
```console
$ zot images remote-zot
IMAGE NAME TAG DIGEST SIZE
postgres 9.6.18-alpine ef27f3e1 14.4MB
postgres 9.5-alpine 264450a7 14.4MB
busybox latest 414aeb86 707.8KB
```
Or filter the list by an image name:
```console
$ zot images remote-zot -n busybox
IMAGE NAME TAG DIGEST SIZE
busybox latest 414aeb86 707.8KB
```
2020-07-06 17:44:32 -05:00
## Scanning images for known vulnerabilities
You can fetch CVE (Common Vulnerabilities and Exposures) info for images hosted on zot
- Get all images affected by a CVE
```console
$ zot cve remote-zot -i CVE-2017-9935
IMAGE NAME TAG DIGEST SIZE
c3/openjdk-dev commit-5be4d92 ac3762e2 335MB
```
- Get all CVEs for an image
```console
$ zot cve remote-zot -I c3/openjdk-dev:0.3.19
ID SEVERITY TITLE
CVE-2015-8540 LOW libpng: underflow read in png_check_keyword()
CVE-2017-16826 LOW binutils: Invalid memory access in the coff_s...
```
- Get detailed json output
```console
$ zot cve remote-zot -I c3/openjdk-dev:0.3.19 -o json
{
"Tag": "0.3.19",
"CVEList": [
{
"Id": "CVE-2019-17006",
"Severity": "MEDIUM",
"Title": "nss: Check length of inputs for cryptographic primitives",
"Description": "A vulnerability was discovered in nss where input text length was not checked when using certain cryptographic primitives. This could lead to a heap-buffer overflow resulting in a crash and data leak. The highest threat is to confidentiality and integrity of data as well as system availability.",
"PackageList": [
{
"Name": "nss",
"InstalledVersion": "3.44.0-7.el7_7",
"FixedVersion": "Not Specified"
},
{
"Name": "nss-sysinit",
"InstalledVersion": "3.44.0-7.el7_7",
"FixedVersion": "Not Specified"
},
{
"Name": "nss-tools",
"InstalledVersion": "3.44.0-7.el7_7",
"FixedVersion": "Not Specified"
}
]
},
```
- Get all images in a specific repo affected by a CVE
```console
$ zot cve remote-zot -I c3/openjdk-dev -i CVE-2017-9935
IMAGE NAME TAG DIGEST SIZE
c3/openjdk-dev commit-2674e8a 71046748 338MB
c3/openjdk-dev commit-bd5cc94 0ab7fc76
```
- Get all images of a specific repo where a CVE is fixed
```console
$ zot cve remote-zot -I c3/openjdk-dev -i CVE-2017-9935 --fixed
IMAGE NAME TAG DIGEST SIZE
c3/openjdk-dev commit-2674e8a-squashfs b545b8ba 321MB
c3/openjdk-dev commit-d5024ec-squashfs cd45f8cf 321MB
```
2020-06-16 20:52:40 -05:00
2021-06-08 15:11:18 -05:00
# Sync
Periodically pull and synchronize images between zot registries.
The synchronization is achieved by copying all the images found at source to destination.
To use it see [sync-config ](examples/config-sync.json )
Supports:
- TLS verification
- Prefix filtering (can contain multiple repos, eg repo1/repoX/repoZ)
- Tags regex filtering
- Tags semver compliance filtering (the 'v' prefix is optional)
- BASIC auth
- Trigger sync with a POST call to http://registry:port/sync
2019-08-28 17:16:11 -05:00
# Ecosystem
2020-01-07 16:14:10 -05:00
2019-08-28 17:16:11 -05:00
## skopeo
[skopeo ](https://github.com/containers/skopeo ) is a tool to work with remote
image repositories.
2020-09-24 12:14:41 -05:00
* Pull Images
2019-08-28 17:16:11 -05:00
```
2020-09-24 12:14:41 -05:00
skopeo copy docker://< zot-server:port > /repo:tag docker://< another-server:port > /repo:tag
```
2019-08-28 17:16:11 -05:00
2020-09-24 12:14:41 -05:00
* Push Images
2019-08-28 17:16:11 -05:00
2020-09-24 12:14:41 -05:00
```
skopeo copy --format=oci docker://< another-server:port > /repo:tag docker://< zot-server:port > /repo:tag
2019-08-28 17:16:11 -05:00
```
## cri-o
[cri-o ](https://github.com/cri-o/cri-o ) is a OCI-based Kubernetes container
runtime interface.
2020-09-24 12:14:41 -05:00
Works with "docker://" transport which is the default.
2019-08-14 14:35:51 -05:00
2021-10-15 10:05:00 -05:00
# Metrics
Can be used for both dist-spec-only zot & the zot with all extensions enabled
## Node Exporter
The dist-spec-only zot exposes internal metrics into a Prometheus format through a node exporter.
The configuration of node exporter contains connection details for the zot server it is intend to scrape metrics from. See a [configuration example ](./examples/metrics/exporter/config-minimal.json ). The metrics are automatically enabled in the zot server on first scrape from the Node Exporter (no extra configuration option is needed). Similarly, the metrics are automatically disabled when Node Exporter did not perform any scrapings in a while.
```
bin/zot-exporter config _config-file_
```
## Enable Metrics
In the zot with all extensions case see [configuration example ](./examples/config-metrics.json ) for enabling metrics
2019-06-26 16:28:34 -05:00
# Caveats
2021-10-15 10:05:00 -05:00
* go 1.15+
2019-06-26 16:28:34 -05:00
* The OCI distribution spec is still WIP, and we try to keep up
2020-12-15 14:19:58 -05:00
# Contributing
We encourage and support an active, healthy community of contributors.
2020-12-21 22:03:28 -05:00
* Details are in the [code of conduct ](CODE_OF_CONDUCT.md )
2021-01-07 21:14:59 -05:00
* Details to get started on code development are in
[contributing ](CONTRIBUTING.md ) document.