Aller au contenu
Conteneurs & Orchestration medium

Quay.io : registry sécurisée avec scan Clair et robot accounts

15 min de lecture

Vous cherchez une alternative à Docker Hub avec un scan de sécurité intégré et des dépôts privés illimités ? Quay.io est la registry de conteneurs de Red Hat, connue pour son scanner Clair et ses robot accounts — des comptes de service parfaits pour l’automatisation CI/CD.

Ce guide couvre l’ensemble du workflow Quay.io, de la création de compte jusqu’à l’intégration complète dans vos pipelines de déploiement.

  • Créer un compte et comprendre les plans (gratuit vs payant)
  • Configurer un robot account pour l’authentification CI/CD
  • Scanner vos images avec Clair (vulnérabilités CVE)
  • Publier une image avec docker push vers quay.io
  • Automatiser vos builds avec GitHub Actions
  • Gérer les équipes et permissions dans une organisation

Quay.io est la registry cloud de Red Hat, lancée en 2013 par CoreOS puis acquise par Red Hat en 2018. Elle stocke et distribue des images de conteneurs au format OCI, comme Docker Hub, mais avec une orientation sécurité plus marquée.

Pourquoi choisir Quay.io ?

CritèreDocker HubQuay.io
Scan de sécuritéDocker Scout (payant)Clair intégré (gratuit)
Dépôts privés1 gratuitIllimités (publics)
Robot accounts❌ Non✅ Oui, natif
Rate limiting100 pulls/h (gratuit)Pas de limite documentée
Geo-replication❌ Non✅ Oui (self-hosted)
Builds automatisés❌ Supprimé✅ Oui

Analogie : si Docker Hub est comme GitHub (grand public, communauté), Quay.io est comme GitLab (plus orienté entreprise, sécurité intégrée, self-hosting possible).

Le différenciateur majeur de Quay.io est Clair, un scanner open source qui analyse chaque layer de vos images pour détecter les CVE (Common Vulnerabilities and Exposures). Le scan est automatique : dès que vous poussez une image, Clair l’analyse et affiche les résultats dans l’interface.

Clair agrège les données de plusieurs sources de vulnérabilités :

  • NVD (National Vulnerability Database)
  • Red Hat Security Data
  • Debian Security Tracker
  • Ubuntu CVE Tracker
  • Alpine SecDB
  1. Accéder au site

    Rendez-vous sur quay.io et cliquez sur Sign In puis Create Account.

  2. Choisir une méthode d’authentification

    Quay.io propose plusieurs options :

    • Compte Red Hat (recommandé si vous utilisez OpenShift)
    • Compte GitHub (pratique pour lier vos repos)
    • Email + mot de passe (classique)
  3. Confirmer votre email

    Vérifiez votre boîte mail et cliquez sur le lien de confirmation.

  4. Accéder au tableau de bord

    Vous arrivez sur votre dashboard avec vos repositories (vides pour l’instant).

Quay.io propose plusieurs formules adaptées aux besoins individuels et aux équipes. Le plan gratuit est généreux pour les projets open source avec des dépôts publics illimités.

PlanDépôts privésDépôts publicsÉquipesPrix
Free0IllimitésGratuit
Developer5Illimités$15/mois
Micro10Illimités$30/mois
Small20Illimités$50/mois
Large50Illimités$100/mois

Les robot accounts sont des comptes de service dédiés à l’automatisation. Contrairement à votre compte personnel, ils n’ont pas de mot de passe à expiration et peuvent avoir des permissions limitées à certains repositories.

Les robot accounts offrent plusieurs avantages par rapport à l’utilisation de vos identifiants personnels dans les pipelines CI/CD :

CritèreCompte personnelRobot account
RévocationBloque tous vos accèsRévocable individuellement
PermissionsAccès totalLimité à certains repos
AuditDifficile à tracerActivité séparée
PartageRisque de fuiteConçu pour être partagé
ExpirationMot de passe à gérerToken permanent (révocable)
  1. Accéder aux paramètres du repository

    Allez sur votre repository → SettingsRobot Accounts.

  2. Créer le robot

    Cliquez sur Create Robot Account :

    • Name : nom descriptif (ex: github_actions_push, kubernetes_pull)
    • Le nom complet sera : votre-user+nom_robot ou votre-org+nom_robot
  3. Définir les permissions

    Pour chaque repository, choisissez :

    • None : aucun accès
    • Read : docker pull uniquement
    • Write : docker pull + docker push
    • Admin : accès complet + gestion du repo
  4. Récupérer les credentials

    Quay.io génère automatiquement :

    • Username : votre-user+nom_robot
    • Token : chaîne longue à copier immédiatement

    Le token n’est affiché qu’une seule fois (comme les PAT Docker Hub).

  5. Tester la connexion

    Fenêtre de terminal
    # Connexion avec le robot account
    docker login quay.io -u "votre-user+github_actions_push" -p "TOKEN"
    # Résultat attendu
    Login Succeeded

Le workflow est similaire à Docker Hub, avec un préfixe de registry différent.

Fenêtre de terminal
# 1. Construire l'image localement
docker build -t monapp:v1.0.0 .
# 2. Taguer pour Quay.io
# Format : quay.io/namespace/repository:tag
docker tag monapp:v1.0.0 quay.io/mon-user/monapp:v1.0.0
# Optionnel : ajouter le tag latest
docker tag monapp:v1.0.0 quay.io/mon-user/monapp:latest
Fenêtre de terminal
# 3. Se connecter (avec robot account recommandé)
docker login quay.io -u "mon-user+ci_push" -p "$QUAY_TOKEN"
# 4. Pousser l'image
docker push quay.io/mon-user/monapp:v1.0.0
docker push quay.io/mon-user/monapp:latest

Résultat attendu :

The push refers to repository [quay.io/mon-user/monapp]
a3b52c...: Pushed
b4c63d...: Pushed
v1.0.0: digest: sha256:abc123... size: 1234

Après le push, Quay.io lance automatiquement le scan Clair. Rendez-vous sur https://quay.io/repository/mon-user/monapp → onglet Tags → colonne Security Scan.

Les résultats affichent :

  • Passed (vert) : aucune vulnérabilité critique/haute
  • Warning (orange) : vulnérabilités medium/low
  • Failed (rouge) : vulnérabilités critiques ou hautes détectées

Voici un workflow complet pour builder, scanner et pousser vos images vers Quay.io à chaque commit.

Pour permettre à GitHub Actions de pousser vers Quay.io, créez des secrets dans votre repository GitHub. Ces secrets sont chiffrés et injectés uniquement au runtime du workflow.

Dans votre repo GitHub : SettingsSecrets and variablesActionsNew repository secret :

SecretValeur
QUAY_USERNAMEvotre-user+robot_name (avec le +)
QUAY_TOKENLe token du robot account

Créez .github/workflows/quay-publish.yml :

name: Build and Push to Quay.io
on:
push:
branches: [main]
tags: ['v*']
pull_request:
branches: [main]
env:
REGISTRY: quay.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
# Toutes les actions sont pinées par SHA pour la sécurité
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db # v3.6.1
- name: Login to Quay.io
if: github.event_name != 'pull_request'
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0
with:
registry: quay.io
username: ${{ secrets.QUAY_USERNAME }}
password: ${{ secrets.QUAY_TOKEN }}
- name: Extract metadata (tags, labels)
id: meta
uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=ref,event=branch
type=semver,pattern={{version}}
type=sha,prefix=
- name: Build and push
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
  1. Checkout : récupère le code source du repository
  2. Buildx : configure le builder Docker moderne avec support du cache
  3. Login : s’authentifie avec le robot account (sauf pour les PR)
  4. Metadata : génère les tags automatiquement (main, v1.2.3, sha-abc123)
  5. Build & Push : construit l’image multi-plateforme et la pousse vers Quay.io

Le scan Clair se déclenche automatiquement après le push — pas besoin d’action supplémentaire.

Pour les projets d’équipe, Quay.io propose des organisations avec une gestion fine des permissions par équipe et par repository.

  1. Quay.io → + (menu) → New Organization
  2. Choisissez un nom (ex: mon-entreprise)
  3. Sélectionnez le plan (Micro minimum pour les équipes)

Le modèle de permissions de Quay.io suit le principe du moindre privilège. Créez des équipes par fonction et assignez-leur des rôles spécifiques sur chaque repository.

RôlePermissions
CreatorCréer de nouveaux repositories dans l’organisation
AdminAccès total au repository (settings, permissions, suppression)
WritePull + Push d’images
ReadPull uniquement

Exemple de structure :

Organisation: mon-entreprise
├── Team: backend-devs
│ ├── Rôle: Write sur mon-entreprise/api-*
│ └── Membres: alice, bob
├── Team: devops
│ ├── Rôle: Admin sur tous les repos
│ └── Membres: charlie
├── Team: qa
│ ├── Rôle: Read sur tous les repos
│ └── Membres: diana
└── Robot: mon-entreprise+ci_deploy
└── Rôle: Write sur mon-entreprise/prod-*

Quay.io permet de synchroniser automatiquement des images depuis d’autres registries (Docker Hub, gcr.io, ECR…). Cette fonctionnalité est utile pour avoir une copie locale de vos dépendances.

Le mirroring résout plusieurs problèmes opérationnels courants :

  • Contourner le rate limiting de Docker Hub
  • Garantir la disponibilité en cas de panne de la source
  • Scanner les images externes avec Clair avant utilisation
  • Respecter les politiques de sécurité (pas d’accès direct à Internet)
  1. Créer un repository de type “Mirror”

    Repository → SettingsRepository StateMirror

  2. Configurer la source

    • External Registry : docker.io/library/nginx
    • Sync Interval : fréquence de synchronisation (ex: 1h)
    • Robot Account : compte pour l’authentification si la source est privée
  3. Définir les tags à synchroniser

    Utilisez des patterns : v1.*, latest, stable

  4. Activer la synchronisation

    Le premier sync peut prendre du temps selon la taille des images.

Pour tirer des images depuis Quay.io dans Kubernetes, créez un Secret de type docker-registry.

Fenêtre de terminal
kubectl create secret docker-registry quay-secret \
--docker-server=quay.io \
--docker-username="mon-org+k8s_pull" \
--docker-password="$QUAY_TOKEN" \
--docker-email=devops@example.com \
-n mon-namespace
apiVersion: v1
kind: Pod
metadata:
name: mon-app
spec:
containers:
- name: app
image: quay.io/mon-org/monapp:v1.0.0
imagePullSecrets:
- name: quay-secret

Voici les erreurs les plus fréquentes lors de l’utilisation de Quay.io et leurs solutions. La majorité des problèmes viennent de l’authentification ou des permissions.

SymptômeCause probableSolution
unauthorized: access deniedRobot account sans permissionVérifier les permissions Write sur le repo
denied: requested access is deniedMauvais namespaceVérifier quay.io/user/repo vs quay.io/org/repo
name unknown: repository not foundRepo inexistantCréer le repo manuellement ou activer auto-create
Error: Invalid username/passwordToken expiré ou mal copiéRégénérer le token du robot account
Scan bloqué sur “Queued”Image trop grosse ou service surchargéAttendre ou repousser l’image
  1. Quay.io est l’alternative Red Hat à Docker Hub, avec un focus sécurité. Le scan Clair est inclus gratuitement et analyse chaque image automatiquement.

  2. Les robot accounts sont essentiels pour la CI/CD. Créez-en un par usage (CI push, Kubernetes pull) avec les permissions minimales nécessaires.

  3. Le format du registry est quay.io/namespace/repo:tag. N’oubliez pas le préfixe quay.io dans vos tags et manifests Kubernetes.

  4. Le mirroring permet de cacher les images externes et de contourner le rate limiting de Docker Hub tout en bénéficiant du scan Clair.

  5. Pinz vos actions GitHub par SHA pour la sécurité supply chain. Les tags comme @v4 peuvent être déplacés par un attaquant.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.