Adds support for copying non-image OCI artifacts, and for creating and enforcing sigstore signatures. Shell autocompletions are now auto-generated, adding support for zsh, fish and PowerShell. Now requires Go 1.17. - Bump github.com/docker/docker - Config files live in /usr/local/etc on FreeBSD - Avoid hard-coding the location of bash - Bump github.com/containers/storage from 1.40.2 to 1.41.0 - Bump github.com/docker/docker - add completion command to generate shell completion scripts - Remove cgo_pthread_ordering_workaround.go - Update c/image - Stop calling gpgme-config - shell completion: add Makefile target - shell completion: add install instructions docs - shell completion: add completion for transports names - [CI:DOCS] Pin actions to a full length commit SHA - Updated skopeo logo with new artwork - Update to gopkg.in/yaml.v3 v3.0.0 - fix make completions for all POSIX shells - Update to github.com/opencontainers/runc >= 1.1.2 - Cirrus: use Ubuntu 22.04 LTS - Bump github.com/containers/ocicrypt from 1.1.4 to 1.1.5 - Bump github.com/stretchr/testify from 1.7.1 to 1.7.2 - Bump github.com/docker/docker - Update go.mod to Go 1.17 - Use testing.T.Setenv instead of os.Setenv in tests - Change a repo used for sync tests - Use an updated CI image - Update for docker/distribution CLI change - Enable schema1 support on the test registries - CoPR: Autobuild rpm on rhcontainerbot/podman-next - [CI:DOCS] Makefile: include cautionary note for rpm target - [CI:DOCS] skopeo.spec.rpkg: Fix syntax highlighting - Bump github.com/spf13/cobra from 1.4.0 to 1.5.0 - Bump github.com/stretchr/testify from 1.7.2 to 1.7.4 - Bump github.com/stretchr/testify from 1.7.4 to 1.7.5 - Cirrus: Migrate multiarch build off github actions - Update & fix skopeo multiarch image Containerfiles - Use bytes.ReplaceAll instead of bytes.Replace(..., -1) - Update IRC information - Bump github.com/stretchr/testify from 1.7.5 to 1.8.0 - Introduce noteCloseFailure, use it for reporting of cleanup errors - Modify error messages on failures to close - Remove uses of pkg/errors - Use errors.As() instead of direct type checks - Vendor unreleased c/image with OCI artifact support - Revert "Change a repo used for sync tests" - Vendor in c/image with sigstore support - Add --sign-by-sigstore-private-key to (skopeo copy) and (skopeo sync) - Update for the renames of sigstore to lookaside Signed-off-by: Miloslav Trmač <mitr@redhat.com>
skopeo 
skopeo
is a command line utility that performs various operations on container images and image repositories.
skopeo
does not require the user to be running as root to do most of its operations.
skopeo
does not require a daemon to be running to perform its operations.
skopeo
can work with OCI images as well as the original Docker v2 images.
Skopeo works with API V2 container image registries such as docker.io and quay.io registries, private registries, local directories and local OCI-layout directories. Skopeo can perform operations which consist of:
- Copying an image from and to various storage mechanisms. For example you can copy images from one registry to another, without requiring privilege.
- Inspecting a remote image showing its properties including its layers, without requiring you to pull the image to the host.
- Deleting an image from an image repository.
- Syncing an external image repository to an internal registry for air-gapped deployments.
- When required by the repository, skopeo can pass the appropriate credentials and certificates for authentication.
Skopeo operates on the following image and repository types:
-
containers-storage:docker-reference An image located in a local containers/storage image store. Both the location and image store are specified in /etc/containers/storage.conf. (This is the backend for Podman, CRI-O, Buildah and friends)
-
dir:path An existing local directory path storing the manifest, layer tarballs and signatures as individual files. This is a non-standardized format, primarily useful for debugging or noninvasive container inspection.
-
docker://docker-reference An image in a registry implementing the "Docker Registry HTTP API V2". By default, uses the authorization state in
$XDG_RUNTIME_DIR/containers/auth.json
, which is set usingskopeo login
. -
docker-archive:path[:docker-reference] An image is stored in a
docker save
-formatted file. docker-reference is only used when creating such a file, and it must not contain a digest. -
docker-daemon:docker-reference An image docker-reference stored in the docker daemon internal storage. docker-reference must contain either a tag or a digest. Alternatively, when reading images, the format can also be docker-daemon:algo:digest (an image ID).
-
oci:path:tag An image tag in a directory compliant with "Open Container Image Layout Specification" at path.
Inspecting a repository
skopeo
is able to inspect a repository on a container registry and fetch images layers.
The inspect command fetches the repository's manifest and it is able to show you a docker inspect
-like
json output about a whole repository or a tag. This tool, in contrast to docker inspect
, helps you gather useful information about
a repository or a tag before pulling it (using disk space). The inspect command can show you which tags are available for the given
repository, the labels the image has, the creation date and operating system of the image and more.
Examples:
Show properties of fedora:latest
$ skopeo inspect docker://registry.fedoraproject.org/fedora:latest
{
"Name": "registry.fedoraproject.org/fedora",
"Digest": "sha256:655721ff613ee766a4126cb5e0d5ae81598e1b0c3bcf7017c36c4d72cb092fe9",
"RepoTags": [
"24",
"25",
"26-modular",
...
],
"Created": "2020-04-29T06:48:16Z",
"DockerVersion": "1.10.1",
"Labels": {
"license": "MIT",
"name": "fedora",
"vendor": "Fedora Project",
"version": "32"
},
"Architecture": "amd64",
"Os": "linux",
"Layers": [
"sha256:3088721d7dbf674fc0be64cd3cf00c25aab921cacf35fa0e7b1578500a3e1653"
],
"Env": [
"DISTTAG=f32container",
"FGC=f32",
"container=oci"
]
}
Show container configuration from fedora:latest
$ skopeo inspect --config docker://registry.fedoraproject.org/fedora:latest | jq
{
"created": "2020-04-29T06:48:16Z",
"architecture": "amd64",
"os": "linux",
"config": {
"Env": [
"DISTTAG=f32container",
"FGC=f32",
"container=oci"
],
"Cmd": [
"/bin/bash"
],
"Labels": {
"license": "MIT",
"name": "fedora",
"vendor": "Fedora Project",
"version": "32"
}
},
"rootfs": {
"type": "layers",
"diff_ids": [
"sha256:a4c0fa2b217d3fd63d51e55a6fd59432e543d499c0df2b1acd48fbe424f2ddd1"
]
},
"history": [
{
"created": "2020-04-29T06:48:16Z",
"comment": "Created by Image Factory"
}
]
}
Show unverified image's digest
$ skopeo inspect docker://registry.fedoraproject.org/fedora:latest | jq '.Digest'
"sha256:655721ff613ee766a4126cb5e0d5ae81598e1b0c3bcf7017c36c4d72cb092fe9"
Copying images
skopeo
can copy container images between various storage mechanisms, including:
-
Container registries
- The Quay, Docker Hub, OpenShift, GCR, Artifactory ...
-
Container Storage backends
-
github.com/containers/storage (Backend for Podman, CRI-O, Buildah and friends)
-
Docker daemon storage
-
-
Local directories
-
Local OCI-layout directories
$ skopeo copy docker://quay.io/buildah/stable docker://registry.internal.company.com/buildah
$ skopeo copy oci:busybox_ocilayout:latest dir:existingemptydirectory
Deleting images
$ skopeo delete docker://localhost:5000/imagename:latest
Syncing registries
$ skopeo sync --src docker --dest dir registry.example.com/busybox /media/usb
Authenticating to a registry
Private registries with authentication
skopeo uses credentials from the --creds (for skopeo inspect|delete) or --src-creds|--dest-creds (for skopeo copy) flags, if set; otherwise it uses configuration set by skopeo login, podman login, buildah login, or docker login.
$ skopeo login --username USER myregistrydomain.com:5000
Password:
$ skopeo inspect docker://myregistrydomain.com:5000/busybox
{"Tag":"latest","Digest":"sha256:473bb2189d7b913ed7187a33d11e743fdc2f88931122a44d91a301b64419f092","RepoTags":["latest"],"Comment":"","Created":"2016-01-15T18:06:41.282540103Z","ContainerConfig":{"Hostname":"aded96b43f48","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["/bin/sh","-c","#(nop) CMD [\"sh\"]"],"Image":"9e77fef7a1c9f989988c06620dabc4020c607885b959a2cbd7c2283c91da3e33","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"DockerVersion":"1.8.3","Author":"","Config":{"Hostname":"aded96b43f48","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["sh"],"Image":"9e77fef7a1c9f989988c06620dabc4020c607885b959a2cbd7c2283c91da3e33","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"Architecture":"amd64","Os":"linux"}
$ skopeo logout myregistrydomain.com:5000
Using --creds directly
$ skopeo inspect --creds=testuser:testpassword docker://myregistrydomain.com:5000/busybox
{"Tag":"latest","Digest":"sha256:473bb2189d7b913ed7187a33d11e743fdc2f88931122a44d91a301b64419f092","RepoTags":["latest"],"Comment":"","Created":"2016-01-15T18:06:41.282540103Z","ContainerConfig":{"Hostname":"aded96b43f48","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["/bin/sh","-c","#(nop) CMD [\"sh\"]"],"Image":"9e77fef7a1c9f989988c06620dabc4020c607885b959a2cbd7c2283c91da3e33","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"DockerVersion":"1.8.3","Author":"","Config":{"Hostname":"aded96b43f48","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["sh"],"Image":"9e77fef7a1c9f989988c06620dabc4020c607885b959a2cbd7c2283c91da3e33","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"Architecture":"amd64","Os":"linux"}
$ skopeo copy --src-creds=testuser:testpassword docker://myregistrydomain.com:5000/private oci:local_oci_image
Obtaining skopeo
For a detailed description how to install or build skopeo, see install.md.
Contributing
Please read the contribution guide if you want to collaborate in the project.
Commands
Command | Description |
---|---|
skopeo-copy(1) | Copy an image (manifest, filesystem layers, signatures) from one location to another. |
skopeo-delete(1) | Mark the image-name for later deletion by the registry's garbage collector. |
skopeo-inspect(1) | Return low-level information about image-name in a registry. |
skopeo-list-tags(1) | Return a list of tags for the transport-specific image repository. |
skopeo-login(1) | Login to a container registry. |
skopeo-logout(1) | Logout of a container registry. |
skopeo-manifest-digest(1) | Compute a manifest digest for a manifest-file and write it to standard output. |
skopeo-standalone-sign(1) | Debugging tool - Publish and sign an image in one step. |
skopeo-standalone-verify(1) | Verify an image signature. |
skopeo-sync(1) | Synchronize images between container registries and local directories. |
License
skopeo is licensed under the Apache License, Version 2.0. See LICENSE for the full license text.