skopeo
may already be packaged in your distribution. This document lists the
installation steps for many distros, along with their information and support links.
sudo dnf -y install skopeo
Package Info and Bugzilla
Fedora bugs can be reported on the Skopeo GitHub Issues page.
sudo dnf -y install skopeo
If you are a RHEL customer, please reach out through the official RHEL support channels for any issues.
CentOS Stream 9: Package Info and Bugzilla
CentOS Stream 8: Package Info and Bugzilla
sudo yum -y install skopeo
CentOS 7: Package Repo
sudo zypper install skopeo
sudo apk add skopeo
sudo emerge app-containers/skopeo
sudo pacman -S skopeo
brew install skopeo
$ nix-env -i skopeo
The skopeo package is available on Bullseye, and Debian Testing and Unstable.
# Debian Bullseye, Testing or Unstable/Sid
sudo apt-get update
sudo apt-get -y install skopeo
Raspberry Pi OS uses the standard Debian's repositories, so it is fully compatible with Debian's arm64 repository. You can simply follow the steps for Debian to install Skopeo.
The skopeo package is available in the official repositories for Ubuntu 20.10 and newer.
# Ubuntu 20.10 and newer
sudo apt-get -y update
sudo apt-get -y install skopeo
Skopeo has not yet been packaged for Windows. There is an open feature request and contributions are always welcome.
Skopeo container images are available at quay.io/skopeo/stable:latest
.
For example,
podman run docker://quay.io/skopeo/stable:latest copy --help
The skopeo container image build context and automation are located at https://github.com/containers/image_build/tree/main/skopeo
Otherwise, read on for building and installing it from source:
To build the skopeo
binary you need at least Go 1.22.
There are two ways to build skopeo: in a container, or locally without a container. Choose the one which better matches your needs and environment.
Building without a container requires a bit more manual work and setup in your environment, but it is more flexible:
- It should work in more environments (e.g. for native macOS builds)
- It does not require root privileges (after dependencies are installed)
- It is faster, therefore more convenient for developing
skopeo
.
Install the necessary dependencies:
# Fedora:
sudo dnf install gpgme-devel libassuan-devel btrfs-progs-devel
# Ubuntu (`libbtrfs-dev` requires Ubuntu 18.10 and above):
sudo apt install libgpgme-dev libassuan-dev libbtrfs-dev pkg-config
# macOS:
brew install gpgme
# openSUSE:
sudo zypper install libgpgme-devel libbtrfs-devel glib2-devel
# Arch Linux:
sudo pacman -S base-devel gpgme btrfs-progs
Make sure to clone this repository in your GOPATH
- otherwise compilation fails.
git clone https://github.com/containers/skopeo $GOPATH/src/github.com/containers/skopeo
cd $GOPATH/src/github.com/containers/skopeo && make bin/skopeo
By default the make
command (make all) will build bin/skopeo and the documentation locally.
Building of documentation requires go-md2man
. On systems that do not have this tool, the
document generation can be skipped by passing DISABLE_DOCS=1
:
DISABLE_DOCS=1 make
In order to dynamically link against system libraries and avoid compilation errors the CGO_ENABLED='1'
flag must be enabled. You can easily check by go env | grep CGO_ENABLED
.
An alternative would be to set the BUILDTAGS=containers_image_openpgp
(this removes the dependency on libgpgme
and its companion libraries).
For cross-building skopeo, use the command make bin/skopeo.OS.ARCH
, where OS represents
the target operating system and ARCH stands for the desired architecture. For instance,
to build skopeo for RISC-V 64-bit Linux, execute:
make bin/skopeo.linux.riscv64
To build the manual you will need go-md2man.
# Debian:
sudo apt-get install go-md2man
# Fedora:
sudo dnf install go-md2man
# MacOS:
brew install go-md2man
Then
make docs
Building in a container is simpler, but more restrictive:
- It requires the
podman
command and the ability to run Linux containers. - The created executable is a Linux executable, and depends on dynamic libraries which may only be available only in a container of a similar Linux distribution.
$ make binary
Skopeo has shell completion scripts for bash, zsh, fish and powershell. They are installed as part of make install
.
You may have to restart your shell in order for them to take effect.
For instructions to manually generate and load the scripts please see skopeo completion --help
.
Finally, after the binary and documentation is built:
sudo make install
There have been efforts in the past to produce and maintain static builds, but the maintainers prefer to run Skopeo using distro packages or within containers. This is because static builds of Skopeo tend to be unreliable and functionally restricted. Specifically:
- Some features of Skopeo depend on non-Go libraries like
libgpgme
. - Generating static Go binaries uses native Go libraries, which don't support e.g.
.local
or LDAP-based name resolution.
That being said, if you would like to build Skopeo statically, you might be able to do it by combining all the following steps.
- Export environment variable
CGO_ENABLED=0
(disabling CGO causes Go to prefer native libraries when possible, instead of dynamically linking against system libraries). - Set the
BUILDTAGS=containers_image_openpgp
Make variable (this removes the dependency onlibgpgme
and its companion libraries). - Clear the
GO_DYN_FLAGS
Make variable if even a dependency on the ELF interpreter is undesirable.
Keep in mind that the resulting binary is unsupported and might crash randomly. Only use if you know what you're doing!
For more information, history, and context about static builds, check the following issues:
- #391 - Consider distributing statically built binaries as part of release
- #669 - Static build fails with segmentation violation
- #670 - Fixing static binary build using container
- #755 - Remove static and in-container targets from Makefile
- #932 - Add nix derivation for static builds
- #1336 - Unable to run skopeo on Fedora 30 (due to dyn lib dependency)
- #1478 - Publish binary releases to GitHub (request+discussion)