Aller au contenu
Conteneurs & Orchestration medium

Gérez vos images conteneurs avec Skopeo

14 min de lecture

logo skopeo

Skopeo vous permet d’inspecter, copier et supprimer des images conteneurs directement sur les registres, sans les télécharger ni démarrer de daemon. En 10 minutes, vous saurez transférer une image entre Docker Hub et un registre privé, créer un miroir local, et préparer des images pour un environnement air-gap.

  • Inspecter une image distante : consulter métadonnées, tags et digest sans télécharger
  • Copier entre registres : transférer images entre Docker Hub, Quay.io, Harbor
  • Synchroniser un miroir : répliquer plusieurs images avec un fichier YAML
  • Gérer l’air-gap : exporter et importer des images pour environnements déconnectés

Skopeo couvre quatre cas d’usage principaux pour la gestion des images conteneurs :

FonctionnalitéCommandeCas d’usage
Inspectionskopeo inspectVérifier les métadonnées, l’architecture, les couches avant téléchargement
Copieskopeo copyTransférer une image entre registres ou vers un fichier local
Synchronisationskopeo syncRépliquer plusieurs images/tags vers un miroir privé
Suppressionskopeo deleteSupprimer une image d’un registre distant

Skopeo supporte plusieurs formats de source/destination (appelés “transports”) :

TransportFormatDescription
docker://docker://registry/image:tagRegistre Docker (Docker Hub, Quay.io, Harbor, etc.)
dir:dir:/chemin/localRépertoire local avec les couches et le manifest
docker-archive:docker-archive:/chemin/image.tarArchive au format docker save
oci:oci:/chemin:tagRépertoire au format OCI
oci-archive:oci-archive:/chemin/image.tarArchive au format OCI
containers-storage:containers-storage:image:tagStockage local Podman/Buildah
Fenêtre de terminal
sudo apt update && sudo apt install -y skopeo

Vérification de l’installation :

Fenêtre de terminal
skopeo --version

Résultat attendu (la version peut varier) :

skopeo version 1.21.0
commit: 8bd9c541f0513a3f688bdae54c5f0ec4e581f420

La commande skopeo inspect permet de consulter les métadonnées d’une image sans la télécharger. Pratique pour vérifier l’architecture, la date de création ou les variables d’environnement avant de déployer.

Fenêtre de terminal
skopeo inspect docker://docker.io/library/nginx:1.27.3

Extrait du résultat :

{
"Name": "docker.io/library/nginx",
"Digest": "sha256:bc2f6a7c8ddbccf55bdb19659ce3b0a92ca6559e86d42677a5a02ef6bda2fcef",
"RepoTags": ["1", "1-alpine", "1.27", "1.27.3", "..."],
"Architecture": "amd64",
"Os": "linux",
"Created": "2024-11-26T18:42:08Z",
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.27.3",
"NJS_VERSION=0.8.7"
]
}

Les informations clés retournées :

  • Digest : empreinte SHA256 unique de l’image (garantit l’intégrité)
  • RepoTags : tous les tags disponibles pour cette image
  • Architecture/Os : plateforme cible (amd64, arm64, linux, windows)
  • Created : date de build de l’image
  • Env : variables d’environnement définies dans l’image

Pour n’afficher que certains champs, combinez avec jq :

Fenêtre de terminal
skopeo inspect docker://docker.io/library/nginx:1.27.3 | jq '{Name, Digest, Architecture, Os, Created}'

Résultat :

{
"Name": "docker.io/library/nginx",
"Digest": "sha256:bc2f6a7c8ddbccf55bdb19659ce3b0a92ca6559e86d42677a5a02ef6bda2fcef",
"Architecture": "amd64",
"Os": "linux",
"Created": "2024-11-26T18:42:08Z"
}

Pour connaître toutes les versions publiées d’une image :

Fenêtre de terminal
skopeo list-tags docker://docker.io/library/nginx

Filtrer les tags avec jq (ici, les versions 1.27.x) :

Fenêtre de terminal
skopeo list-tags docker://docker.io/library/nginx | jq '.Tags | map(select(startswith("1.27"))) | .[:10]'

Résultat :

[
"1.27",
"1.27-alpine",
"1.27-alpine-otel",
"1.27-alpine-perl",
"1.27-alpine-slim",
"1.27-alpine3.19",
"1.27-alpine3.19-otel",
"1.27-alpine3.19-perl",
"1.27-alpine3.19-slim",
"1.27-alpine3.20"
]

Si le registre nécessite une authentification :

Fenêtre de terminal
skopeo inspect --creds utilisateur:mot_de_passe docker://registry.example.com/mon-image:1.0.0

Ou avec un fichier d’authentification (format Docker) :

Fenêtre de terminal
skopeo inspect --authfile ~/.docker/config.json docker://registry.example.com/mon-image:1.0.0

La commande skopeo copy transfère une image d’une source vers une destination. Le transfert s’effectue directement entre les registres — votre machine ne stocke pas l’image.

Fenêtre de terminal
skopeo copy docker://docker.io/library/alpine:3.20.6 docker://registry.example.com/alpine:3.20.6

L’image alpine:3.20.6 est copiée de Docker Hub vers votre registre privé.

Quand source et/ou destination nécessitent des credentials :

Fenêtre de terminal
skopeo copy \
--src-creds utilisateur_source:mdp_source \
--dest-creds utilisateur_dest:mdp_dest \
docker://quay.io/mon-org/mon-app:2.1.0 \
docker://registry.example.com/mon-app:2.1.0

Pour extraire les couches et le manifest dans un dossier :

Fenêtre de terminal
skopeo copy docker://docker.io/library/alpine:3.20.6 dir:/tmp/alpine-3.20.6

Contenu du répertoire créé :

/tmp/alpine-3.20.6/
├── 0a9a5dfd008f... # Couche (layer) compressée
├── ff221270b9fb... # Configuration de l'image
├── manifest.json # Manifest décrivant l'image
└── version # Version du format

Pour créer un fichier .tar compatible avec docker load :

Fenêtre de terminal
skopeo copy docker://docker.io/library/alpine:3.20.6 docker-archive:/tmp/alpine-3.20.6.tar

Format OCI, compatible avec podman load et les runtimes OCI :

Fenêtre de terminal
skopeo copy docker://docker.io/library/alpine:3.20.6 oci-archive:/tmp/alpine-3.20.6-oci.tar

De Docker vers OCI :

Fenêtre de terminal
skopeo copy docker://docker.io/library/nginx:1.27.3 oci:nginx-oci:1.27.3

De OCI vers archive Docker :

Fenêtre de terminal
skopeo copy oci:nginx-oci:1.27.3 docker-archive:nginx.tar
OptionDescription
--allCopie toutes les architectures d’une image multi-arch
--preserve-digestsConserve les digests d’origine (utile pour les signatures)
--retry-times 3Nombre de tentatives en cas d’échec réseau
--retry-delay 5sDélai entre les tentatives (v1.18.0+)
--digestfile /tmp/digest.txtÉcrit le digest de l’image copiée dans un fichier

Exemple avec options de fiabilité :

Fenêtre de terminal
skopeo copy \
--retry-times 3 \
--retry-delay 5s \
--digestfile /tmp/nginx-digest.txt \
docker://docker.io/library/nginx:1.27.3 \
docker://registry.example.com/nginx:1.27.3

Dans les environnements isolés d’Internet, Skopeo permet d’exporter puis d’importer des images sans connexion réseau.

  1. Sur une machine connectée : exportez l’image vers une archive

    Fenêtre de terminal
    skopeo copy docker://docker.io/library/nginx:1.27.3 docker-archive:/media/usb/nginx-1.27.3.tar
  2. Transférez l’archive vers l’environnement air-gap (clé USB, disque, etc.)

  3. Sur la machine air-gap : importez l’image vers le registre privé

    Fenêtre de terminal
    skopeo copy docker-archive:/media/usb/nginx-1.27.3.tar docker://registre-interne.local/nginx:1.27.3

La commande skopeo sync réplique plusieurs images ou tags en une seule opération. Idéal pour maintenir un miroir privé à jour.

Synchroniser tous les tags d’une image :

Fenêtre de terminal
skopeo sync --src docker --dest docker docker.io/library/alpine registry.example.com

Cette commande copie tous les tags de alpine vers votre registre.

Pour un contrôle fin, définissez les images dans un fichier YAML :

sync.yaml
# Registre source : docker.io
docker.io:
images:
# Toutes les versions d'alpine >= 3.19
alpine:
- "3.19"
- "3.20"
- "3.20.6"
# Versions spécifiques de nginx
nginx:
- "1.27.3"
- "1.27.3-alpine"
tls-verify: true
# Registre source : quay.io
quay.io:
images:
prometheus/prometheus:
- "v2.54.1"
- "v2.55.0"
tls-verify: true

Exécution :

Fenêtre de terminal
skopeo sync --src yaml --dest docker sync.yaml registry.example.com/mirror/
OptionDescription
--dry-runSimule la synchronisation sans copier
--keep-goingContinue même si une image échoue
--scopedPréfixe les images avec leur chemin source
--allSynchronise toutes les architectures

Exemple avec dry-run pour vérifier avant d’exécuter :

Fenêtre de terminal
skopeo sync --src yaml --dest docker --dry-run sync.yaml registry.example.com/mirror/

Pour stocker les images localement avant de les transférer :

Fenêtre de terminal
skopeo sync --src docker --dest dir docker.io/library/alpine /backup/images/

Puis pousser le miroir local vers un registre :

Fenêtre de terminal
skopeo sync --src dir --dest docker /backup/images/ registry.example.com

La commande skopeo delete supprime une image directement sur le registre :

Fenêtre de terminal
skopeo delete docker://registry.example.com/mon-app:1.0.0-obsolete

Avec authentification :

Fenêtre de terminal
skopeo delete --creds admin:secret docker://registry.example.com/test-image:dev

Pour vérifier si deux images sont identiques (même contenu), comparez leurs digests :

Fenêtre de terminal
# Digest de l'image sur Docker Hub
skopeo inspect docker://docker.io/library/nginx:1.27.3 | jq -r '.Digest'
# Digest de l'image sur votre registre
skopeo inspect docker://registry.example.com/nginx:1.27.3 | jq -r '.Digest'

Si les deux digests sont identiques, les images sont strictement équivalentes (même contenu binaire).

Erreur “unauthorized: authentication required”

Section intitulée « Erreur “unauthorized: authentication required” »

Le registre nécessite une authentification. Solutions :

Fenêtre de terminal
# Option 1 : credentials en ligne de commande
skopeo inspect --creds utilisateur:mot_de_passe docker://registry.example.com/image:tag
# Option 2 : fichier d'authentification
skopeo login registry.example.com
skopeo inspect docker://registry.example.com/image:tag

Erreur “certificate signed by unknown authority”

Section intitulée « Erreur “certificate signed by unknown authority” »

Le certificat TLS du registre n’est pas reconnu. Solutions :

Fenêtre de terminal
# Option 1 : désactiver la vérification TLS (non recommandé en production)
skopeo inspect --tls-verify=false docker://registry.example.com/image:tag
# Option 2 : spécifier le répertoire des certificats
skopeo inspect --cert-dir /etc/docker/certs.d/registry.example.com docker://registry.example.com/image:tag

L’image ou le tag n’existe pas. Vérifiez :

  1. Le nom exact de l’image et du tag
  2. Que vous avez les permissions de lecture
  3. Listez les tags disponibles : skopeo list-tags docker://registry/image

Pour les images volumineuses, augmentez les tentatives :

Fenêtre de terminal
skopeo copy --retry-times 5 --retry-delay 10s docker://source/image:tag docker://dest/image:tag
  • Skopeo fonctionne sans daemon : contrairement à Docker, il ne nécessite aucun service en arrière-plan
  • Transfert direct : les images passent de registre à registre sans stockage intermédiaire
  • Pinner les versions : utilisez toujours des tags précis (ex: 1.27.3) plutôt que latest
  • Plusieurs formats : Skopeo convertit entre Docker, OCI, archives et répertoires
  • Air-gap ready : export/import via archives pour les environnements déconnectés