[{"data":1,"prerenderedAt":2109},["ShallowReactive",2],{"/fr-fr/blog/using-gitlab-container-virtual-registry-with-docker-hardened-images":3,"navigation-fr-fr":1334,"banner-fr-fr":1757,"footer-fr-fr":1766,"blog-post-authors-fr-fr-Tim Rizzi":2007,"blog-related-posts-fr-fr-using-gitlab-container-virtual-registry-with-docker-hardened-images":2022,"blog-promotions-fr-fr":2047,"next-steps-fr-fr":2100},{"id":4,"title":5,"authors":6,"body":8,"category":1314,"date":1315,"description":1316,"extension":1317,"externalUrl":1318,"featured":1319,"heroImage":1320,"meta":1321,"navigation":268,"path":1322,"seo":1323,"slug":1326,"stem":1327,"tags":1328,"template":1332,"updatedDate":1318,"__hash__":1333},"blogPosts/fr-fr/blog/using-gitlab-container-virtual-registry-with-docker-hardened-images.md","Comment utiliser le registre de conteneurs GitLab avec les images durcies Docker",[7],"Tim Rizzi",{"type":9,"value":10,"toc":1290},"minimark",[11,15,21,26,31,34,39,44,49,59,62,67,70,105,108,119,122,125,129,132,143,146,152,156,165,168,194,197,203,209,219,225,229,232,237,396,400,403,469,473,479,563,567,691,695,702,857,861,864,922,926,929,1015,1019,1022,1072,1075,1078,1082,1085,1089,1092,1168,1171,1175,1178,1182,1190,1194,1201,1215,1219,1222,1230,1233,1237,1240,1251,1260,1264,1286],[12,13,14],"p",{},"Les ingénieurs de plateforme ont probablement tous déjà eu cette conversation :",[12,16,17],{},[18,19,20],"em",{},"« L'équipe de sécurité exige que nous utilisions des images de base durcies. »",[12,22,23],{},[18,24,25],{},"« Très bien, mais où dois-je configurer les identifiants d'un nouveau registre ? »",[12,27,28],{},[18,29,30],{},"« Et comment faire pour que tout le monde les utilise vraiment ? »",[12,32,33],{},"Ou celle-ci :",[12,35,36],{},[18,37,38],{},"« Pourquoi nos builds sont-ils aussi lents ? »",[12,40,41],{},[18,42,43],{},"« Nous téléchargeons la même image de 500 Mo depuis Docker Hub dans chaque job. »",[12,45,46],{},[18,47,48],{},"« On ne pourrait pas simplement la mettre en cache quelque part ? »",[12,50,51,52,58],{},"Chez Gitlab, nous travaillons sur le ",[53,54,57],"a",{"href":55,"rel":56},"https://docs.gitlab.com/user/packages/virtual_registry/container/",[],"registre virtuel de conteneurs"," précisément pour résoudre ces problèmes. Il s'agit d'un cache pull-through qui se place devant vos registres en amont : Docker Hub, dhi.io (images durcies Docker), MCR et Quay. Vos équipes disposent d'un point de terminaison unique pour effectuer un pull des images. Les images sont mises en cache dès le premier pull, et les pulls suivants sont effectués depuis ce cache. Vos équipes n'ont pas besoin de connaître le registre en amont d'une image donnée, ni de s'en préoccuper.",[12,60,61],{},"Cet article vous montre comment configurer le registre virtuel de conteneurs, en particulier avec les images durcies Docker : il s'agit d'une combinaison qui a tout son sens pour les équipes qui souhaitent privilégier la sécurité sans compliquer la vie de leurs développeurs.",[63,64,66],"h2",{"id":65},"quel-problème-cherchons-nous-à-résoudre","Quel problème cherchons-nous à résoudre ?",[12,68,69],{},"Les équipes de plateforme avec lesquelles nous échangeons habituellement gèrent des images de conteneurs réparties sur trois à cinq registres :",[71,72,73,81,87,93,99],"ul",{},[74,75,76,80],"li",{},[77,78,79],"strong",{},"Docker Hub"," pour la plupart des images de base",[74,82,83,86],{},[77,84,85],{},"dhi.io"," pour les images durcies Docker (charges de travail sensibles en matière de sécurité)",[74,88,89,92],{},[77,90,91],{},"MCR"," pour les outils .NET et Azure",[74,94,95,98],{},[77,96,97],{},"Quay.io"," pour l'écosystème Red Hat",[74,100,101,104],{},[77,102,103],{},"Registres internes"," pour les images propriétaires",[12,106,107],{},"Chaque registre possède ses propres spécificités :",[71,109,110,113,116],{},[74,111,112],{},"Mécanismes d'authentification",[74,114,115],{},"Caractéristiques de latence réseau",[74,117,118],{},"Conventions d'organisation des chemins d'accès aux images",[12,120,121],{},"Vos configurations CI/CD finissent par être encombrées par une logique spécifique à chaque registre. La gestion des identifiants devient un projet à part entière. Chaque job de pipeline effectue un pull des mêmes images de base sur le réseau, même si elles n'ont pas changé depuis des semaines.",[12,123,124],{},"Le registre virtuel de conteneurs centralise ces processus dans une seule URL de registre, un seul flux d'authentification (celui de GitLab), et les images en cache sont servies depuis l'infrastructure de GitLab au lieu de transiter par Internet à chaque fois.",[63,126,128],{"id":127},"fonctionnement","Fonctionnement",[12,130,131],{},"Le modèle est simple :",[133,134,140],"pre",{"className":135,"code":137,"language":138,"meta":139},[136],"language-text","Votre pipeline effectue un pull :\n  gitlab.com/virtual_registries/container/1000016/python:3.13\n\nLe registre virtuel vérifie :\n  1. Cette image est-elle en cache ? → La retourner\n  2. Non ? → La récupérer en amont, la mettre en cache, la retourner\n\n","text","",[141,142,137],"code",{"__ignoreMap":139},[12,144,145],{},"Vous configurez les registres en amont par ordre de priorité. Lorsqu'une pull request arrive, le registre virtuel vérifie chaque registre en amont jusqu'à trouver l'image. Le résultat est mis en cache pour une durée configurable (24 heures par défaut).",[133,147,150],{"className":148,"code":149,"language":138,"meta":139},[136],"┌─────────────────────────────────────────────────────────┐\n│                   Pipeline CI/CD                        │\n│                          │                              │\n│                          ▼                              │\n│   gitlab.com/virtual_registries/container/\u003Cid>/image    │\n└─────────────────────────────────────────────────────────┘\n                           │\n                           ▼\n┌────────────────────────────────────────────────────────────────────┐\n│            Registre virtuel de conteneurs                          │\n│                                                                    │\n│  Registre en amont 1: Docker Hub ──────────────────┐               │\n│  Registre en amont 2: dhi.io (images durcies) ────┐│               │\n│  Registre en amont 3: MCR ───────────────────────┐││               │\n│  Registre en amont 4: Quay.io ──────────────────┐│││               │\n│                                                 ││││               │\n│                    ┌────────────────────────────┴┴┴┴──┐            │\n│                    │              Cache               │            │\n│                    │      (Manifestes + couches)      │            │\n│                    └──────────────────────────────────┘            │\n└────────────────────────────────────────────────────────────────────┘\n",[141,151,149],{"__ignoreMap":139},[63,153,155],{"id":154},"importance-de-cette-opération-pour-les-images-durcies-docker","Importance de cette opération pour les images durcies Docker",[12,157,158,159,164],{},"Les ",[53,160,163],{"href":161,"rel":162},"https://docs.docker.com/dhi/",[],"images durcies Docker"," sont idéales en raison de leur surface d'attaque minimale, de leur nombre de vulnérabilités ou expositions communes (CVE) quasi nul, de leurs nomenclatures logicielles (SBOM) complètes et de la provenance SLSA (Supply chain Levels for Software Artifacts). Ne les négligez pas si vous évaluez des images de base pour des charges de travail sensibles en matière de sécurité.",[12,166,167],{},"Cependant, leur adoption génère les mêmes frictions opérationnelles que tout nouveau registre :",[71,169,170,176,182,188],{},[74,171,172,175],{},[77,173,174],{},"Distribution des identifiants :"," vous devez fournir des identifiants Docker à chaque système qui effectue un pull des images depuis dhi.io.",[74,177,178,181],{},[77,179,180],{},"Modifications CI/CD :"," chaque pipeline doit être mis à jour pour s'authentifier auprès du registre dhi.io.",[74,183,184,187],{},[77,185,186],{},"Friction pour les développeurs :"," les équipes doivent penser à utiliser les variantes durcies.",[74,189,190,193],{},[77,191,192],{},"Manque de visibilité :"," il est difficile de savoir si les équipes utilisent réellement les images durcies plutôt que les images classiques.",[12,195,196],{},"Le registre virtuel répond à chacun de ces points :",[12,198,199,202],{},[77,200,201],{},"Un seul identifiant :"," les équipes s'authentifient auprès de GitLab. Le registre virtuel gère l'authentification en amont. Vous configurez les identifiants Docker une seule fois, au niveau du registre, et ils s'appliquent à tous les pulls.",[12,204,205,208],{},[77,206,207],{},"Aucune modification CI/CD par équipe :"," vous n'avez qu'à diriger vos pipelines vers votre registre virtuel. La configuration des registres en amont est centralisée.",[12,210,211,214,215,218],{},[77,212,213],{},"Adoption progressive :"," étant donné que les images sont mises en cache avec leur chemin complet, vous pouvez voir dans le cache quelles images font l'objet d'un pull. Si quelqu'un effectue un pull de ",[141,216,217],{},"library/python:3.11"," au lieu de la variante durcie, vous le saurez.",[12,220,221,224],{},[77,222,223],{},"Piste d'audit :"," le cache vous montre exactement quelles images sont utilisées. Cette fonctionnalité est utile pour la conformité et pour comprendre les dépendances réelles de votre flotte.",[63,226,228],{"id":227},"configuration","Configuration",[12,230,231],{},"Voici une configuration concrète utilisant le client Python de ce projet de démonstration.",[233,234,236],"h3",{"id":235},"créer-le-registre-virtuel","Créer le registre virtuel",[133,238,242],{"className":239,"code":240,"language":241,"meta":139,"style":139},"language-python shiki shiki-themes github-light","from virtual_registry_client import VirtualRegistryClient\n\nclient = VirtualRegistryClient()\n\nregistry = client.create_virtual_registry(\n    group_id=\"785414\",  # Your top-level group ID\n    name=\"platform-images\",\n    description=\"Cached container images for platform teams\"\n)\n\nprint(f\"Registry ID: {registry['id']}\")\n# You'll need this ID for the pull URL\n","python",[141,243,244,263,270,282,287,298,318,332,343,349,354,390],{"__ignoreMap":139},[245,246,249,253,257,260],"span",{"class":247,"line":248},"line",1,[245,250,252],{"class":251},"sD7c4","from",[245,254,256],{"class":255},"sgsFI"," virtual_registry_client ",[245,258,259],{"class":251},"import",[245,261,262],{"class":255}," VirtualRegistryClient\n",[245,264,266],{"class":247,"line":265},2,[245,267,269],{"emptyLinePlaceholder":268},true,"\n",[245,271,273,276,279],{"class":247,"line":272},3,[245,274,275],{"class":255},"client ",[245,277,278],{"class":251},"=",[245,280,281],{"class":255}," VirtualRegistryClient()\n",[245,283,285],{"class":247,"line":284},4,[245,286,269],{"emptyLinePlaceholder":268},[245,288,290,293,295],{"class":247,"line":289},5,[245,291,292],{"class":255},"registry ",[245,294,278],{"class":251},[245,296,297],{"class":255}," client.create_virtual_registry(\n",[245,299,301,305,307,311,314],{"class":247,"line":300},6,[245,302,304],{"class":303},"sqxcx","    group_id",[245,306,278],{"class":251},[245,308,310],{"class":309},"sYBdl","\"785414\"",[245,312,313],{"class":255},",  ",[245,315,317],{"class":316},"sAwPA","# Your top-level group ID\n",[245,319,321,324,326,329],{"class":247,"line":320},7,[245,322,323],{"class":303},"    name",[245,325,278],{"class":251},[245,327,328],{"class":309},"\"platform-images\"",[245,330,331],{"class":255},",\n",[245,333,335,338,340],{"class":247,"line":334},8,[245,336,337],{"class":303},"    description",[245,339,278],{"class":251},[245,341,342],{"class":309},"\"Cached container images for platform teams\"\n",[245,344,346],{"class":247,"line":345},9,[245,347,348],{"class":255},")\n",[245,350,352],{"class":247,"line":351},10,[245,353,269],{"emptyLinePlaceholder":268},[245,355,357,361,364,367,370,373,376,379,382,385,388],{"class":247,"line":356},11,[245,358,360],{"class":359},"sYu0t","print",[245,362,363],{"class":255},"(",[245,365,366],{"class":251},"f",[245,368,369],{"class":309},"\"Registry ID: ",[245,371,372],{"class":359},"{",[245,374,375],{"class":255},"registry[",[245,377,378],{"class":309},"'id'",[245,380,381],{"class":255},"]",[245,383,384],{"class":359},"}",[245,386,387],{"class":309},"\"",[245,389,348],{"class":255},[245,391,393],{"class":247,"line":392},12,[245,394,395],{"class":316},"# You'll need this ID for the pull URL\n",[233,397,399],{"id":398},"ajouter-docker-hub-en-tant-que-registre-en-amont","Ajouter Docker Hub en tant que registre en amont",[12,401,402],{},"Pour les images officielles comme Alpine, Python, etc. :",[133,404,406],{"className":239,"code":405,"language":241,"meta":139,"style":139},"docker_upstream = client.create_upstream(\n    registry_id=registry['id'],\n    url=\"https://registry-1.docker.io\",\n    name=\"Docker Hub\",\n    cache_validity_hours=24\n)\n",[141,407,408,418,432,444,455,465],{"__ignoreMap":139},[245,409,410,413,415],{"class":247,"line":248},[245,411,412],{"class":255},"docker_upstream ",[245,414,278],{"class":251},[245,416,417],{"class":255}," client.create_upstream(\n",[245,419,420,423,425,427,429],{"class":247,"line":265},[245,421,422],{"class":303},"    registry_id",[245,424,278],{"class":251},[245,426,375],{"class":255},[245,428,378],{"class":309},[245,430,431],{"class":255},"],\n",[245,433,434,437,439,442],{"class":247,"line":272},[245,435,436],{"class":303},"    url",[245,438,278],{"class":251},[245,440,441],{"class":309},"\"https://registry-1.docker.io\"",[245,443,331],{"class":255},[245,445,446,448,450,453],{"class":247,"line":284},[245,447,323],{"class":303},[245,449,278],{"class":251},[245,451,452],{"class":309},"\"Docker Hub\"",[245,454,331],{"class":255},[245,456,457,460,462],{"class":247,"line":289},[245,458,459],{"class":303},"    cache_validity_hours",[245,461,278],{"class":251},[245,463,464],{"class":359},"24\n",[245,466,467],{"class":247,"line":300},[245,468,348],{"class":255},[233,470,472],{"id":471},"ajouter-les-images-durcies-docker-dhiio","Ajouter les images durcies Docker (dhi.io)",[12,474,475,476,478],{},"Les images durcies Docker sont hébergées sur ",[141,477,85],{},", un registre distinct qui nécessite une authentification :",[133,480,482],{"className":239,"code":481,"language":241,"meta":139,"style":139},"dhi_upstream = client.create_upstream(\n    registry_id=registry['id'],\n    url=\"https://dhi.io\",\n    name=\"Docker Hardened Images\",\n    username=\"your-docker-username\",\n    password=\"your-docker-access-token\",\n    cache_validity_hours=24\n)\n",[141,483,484,493,505,516,527,539,551,559],{"__ignoreMap":139},[245,485,486,489,491],{"class":247,"line":248},[245,487,488],{"class":255},"dhi_upstream ",[245,490,278],{"class":251},[245,492,417],{"class":255},[245,494,495,497,499,501,503],{"class":247,"line":265},[245,496,422],{"class":303},[245,498,278],{"class":251},[245,500,375],{"class":255},[245,502,378],{"class":309},[245,504,431],{"class":255},[245,506,507,509,511,514],{"class":247,"line":272},[245,508,436],{"class":303},[245,510,278],{"class":251},[245,512,513],{"class":309},"\"https://dhi.io\"",[245,515,331],{"class":255},[245,517,518,520,522,525],{"class":247,"line":284},[245,519,323],{"class":303},[245,521,278],{"class":251},[245,523,524],{"class":309},"\"Docker Hardened Images\"",[245,526,331],{"class":255},[245,528,529,532,534,537],{"class":247,"line":289},[245,530,531],{"class":303},"    username",[245,533,278],{"class":251},[245,535,536],{"class":309},"\"your-docker-username\"",[245,538,331],{"class":255},[245,540,541,544,546,549],{"class":247,"line":300},[245,542,543],{"class":303},"    password",[245,545,278],{"class":251},[245,547,548],{"class":309},"\"your-docker-access-token\"",[245,550,331],{"class":255},[245,552,553,555,557],{"class":247,"line":320},[245,554,459],{"class":303},[245,556,278],{"class":251},[245,558,464],{"class":359},[245,560,561],{"class":247,"line":334},[245,562,348],{"class":255},[233,564,566],{"id":565},"ajouter-dautres-registres-en-amont","Ajouter d'autres registres en amont",[133,568,570],{"className":239,"code":569,"language":241,"meta":139,"style":139},"# MCR for .NET teams\nclient.create_upstream(\n    registry_id=registry['id'],\n    url=\"https://mcr.microsoft.com\",\n    name=\"Microsoft Container Registry\",\n    cache_validity_hours=48\n)\n\n# Quay for Red Hat stuff\nclient.create_upstream(\n    registry_id=registry['id'],\n    url=\"https://quay.io\",\n    name=\"Quay.io\",\n    cache_validity_hours=24\n)\n",[141,571,572,577,582,594,605,616,625,629,633,638,642,654,665,677,686],{"__ignoreMap":139},[245,573,574],{"class":247,"line":248},[245,575,576],{"class":316},"# MCR for .NET teams\n",[245,578,579],{"class":247,"line":265},[245,580,581],{"class":255},"client.create_upstream(\n",[245,583,584,586,588,590,592],{"class":247,"line":272},[245,585,422],{"class":303},[245,587,278],{"class":251},[245,589,375],{"class":255},[245,591,378],{"class":309},[245,593,431],{"class":255},[245,595,596,598,600,603],{"class":247,"line":284},[245,597,436],{"class":303},[245,599,278],{"class":251},[245,601,602],{"class":309},"\"https://mcr.microsoft.com\"",[245,604,331],{"class":255},[245,606,607,609,611,614],{"class":247,"line":289},[245,608,323],{"class":303},[245,610,278],{"class":251},[245,612,613],{"class":309},"\"Microsoft Container Registry\"",[245,615,331],{"class":255},[245,617,618,620,622],{"class":247,"line":300},[245,619,459],{"class":303},[245,621,278],{"class":251},[245,623,624],{"class":359},"48\n",[245,626,627],{"class":247,"line":320},[245,628,348],{"class":255},[245,630,631],{"class":247,"line":334},[245,632,269],{"emptyLinePlaceholder":268},[245,634,635],{"class":247,"line":345},[245,636,637],{"class":316},"# Quay for Red Hat stuff\n",[245,639,640],{"class":247,"line":351},[245,641,581],{"class":255},[245,643,644,646,648,650,652],{"class":247,"line":356},[245,645,422],{"class":303},[245,647,278],{"class":251},[245,649,375],{"class":255},[245,651,378],{"class":309},[245,653,431],{"class":255},[245,655,656,658,660,663],{"class":247,"line":392},[245,657,436],{"class":303},[245,659,278],{"class":251},[245,661,662],{"class":309},"\"https://quay.io\"",[245,664,331],{"class":255},[245,666,668,670,672,675],{"class":247,"line":667},13,[245,669,323],{"class":303},[245,671,278],{"class":251},[245,673,674],{"class":309},"\"Quay.io\"",[245,676,331],{"class":255},[245,678,680,682,684],{"class":247,"line":679},14,[245,681,459],{"class":303},[245,683,278],{"class":251},[245,685,464],{"class":359},[245,687,689],{"class":247,"line":688},15,[245,690,348],{"class":255},[233,692,694],{"id":693},"mettre-à-jour-votre-cicd","Mettre à jour votre CI/CD",[12,696,697,698,701],{},"Voici un fichier ",[141,699,700],{},".gitlab-ci.yml"," qui effectue un pull des images via le registre virtuel :",[133,703,707],{"className":704,"code":705,"language":706,"meta":139,"style":139},"language-yaml shiki shiki-themes github-light","variables:\n  VIRTUAL_REGISTRY_ID: \u003Cyour_virtual_registry_ID>\n\n  \nbuild:\n  image: docker:24\n  services:\n    - docker:24-dind\n  before_script:\n    # Authenticate to GitLab (which handles upstream auth for you)\n    - echo \"${CI_JOB_TOKEN}\" | docker login -u gitlab-ci-token --password-stdin gitlab.com\n  script:\n    # All of these go through your single virtual registry\n    \n    # Official Docker Hub images (use library/ prefix)\n    - docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/library/alpine:latest\n    \n    # Docker Hardened Images from dhi.io (no prefix needed)\n    - docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/python:3.13\n    \n    # .NET from MCR\n    - docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/dotnet/sdk:8.0\n\n","yaml",[141,708,709,718,729,733,738,745,755,762,770,777,782,789,796,801,806,811,819,824,830,838,843,849],{"__ignoreMap":139},[245,710,711,715],{"class":247,"line":248},[245,712,714],{"class":713},"shJU0","variables",[245,716,717],{"class":255},":\n",[245,719,720,723,726],{"class":247,"line":265},[245,721,722],{"class":713},"  VIRTUAL_REGISTRY_ID",[245,724,725],{"class":255},": ",[245,727,728],{"class":309},"\u003Cyour_virtual_registry_ID>\n",[245,730,731],{"class":247,"line":272},[245,732,269],{"emptyLinePlaceholder":268},[245,734,735],{"class":247,"line":284},[245,736,737],{"class":255},"  \n",[245,739,740,743],{"class":247,"line":289},[245,741,742],{"class":713},"build",[245,744,717],{"class":255},[245,746,747,750,752],{"class":247,"line":300},[245,748,749],{"class":713},"  image",[245,751,725],{"class":255},[245,753,754],{"class":309},"docker:24\n",[245,756,757,760],{"class":247,"line":320},[245,758,759],{"class":713},"  services",[245,761,717],{"class":255},[245,763,764,767],{"class":247,"line":334},[245,765,766],{"class":255},"    - ",[245,768,769],{"class":309},"docker:24-dind\n",[245,771,772,775],{"class":247,"line":345},[245,773,774],{"class":713},"  before_script",[245,776,717],{"class":255},[245,778,779],{"class":247,"line":351},[245,780,781],{"class":316},"    # Authenticate to GitLab (which handles upstream auth for you)\n",[245,783,784,786],{"class":247,"line":356},[245,785,766],{"class":255},[245,787,788],{"class":309},"echo \"${CI_JOB_TOKEN}\" | docker login -u gitlab-ci-token --password-stdin gitlab.com\n",[245,790,791,794],{"class":247,"line":392},[245,792,793],{"class":713},"  script",[245,795,717],{"class":255},[245,797,798],{"class":247,"line":667},[245,799,800],{"class":316},"    # All of these go through your single virtual registry\n",[245,802,803],{"class":247,"line":679},[245,804,805],{"class":255},"    \n",[245,807,808],{"class":247,"line":688},[245,809,810],{"class":316},"    # Official Docker Hub images (use library/ prefix)\n",[245,812,814,816],{"class":247,"line":813},16,[245,815,766],{"class":255},[245,817,818],{"class":309},"docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/library/alpine:latest\n",[245,820,822],{"class":247,"line":821},17,[245,823,805],{"class":255},[245,825,827],{"class":247,"line":826},18,[245,828,829],{"class":316},"    # Docker Hardened Images from dhi.io (no prefix needed)\n",[245,831,833,835],{"class":247,"line":832},19,[245,834,766],{"class":255},[245,836,837],{"class":309},"docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/python:3.13\n",[245,839,841],{"class":247,"line":840},20,[245,842,805],{"class":255},[245,844,846],{"class":247,"line":845},21,[245,847,848],{"class":316},"    # .NET from MCR\n",[245,850,852,854],{"class":247,"line":851},22,[245,853,766],{"class":255},[245,855,856],{"class":309},"docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/dotnet/sdk:8.0\n",[233,858,860],{"id":859},"formats-de-chemin-daccès-des-images","Formats de chemin d'accès des images",[12,862,863],{},"Les différents registres utilisent des conventions de chemin d'accès distinctes :",[865,866,867,880],"table",{},[868,869,870],"thead",{},[871,872,873,877],"tr",{},[874,875,876],"th",{},"Registre",[874,878,879],{},"Exemple d'URL de pull",[881,882,883,894,904,913],"tbody",{},[871,884,885,889],{},[886,887,888],"td",{},"Docker Hub (officiel)",[886,890,891],{},[141,892,893],{},".../library/python:3.11-slim",[871,895,896,899],{},[886,897,898],{},"Images durcies Docker (dhi.io)",[886,900,901],{},[141,902,903],{},".../python:3.13",[871,905,906,908],{},[886,907,91],{},[886,909,910],{},[141,911,912],{},".../dotnet/sdk:8.0",[871,914,915,917],{},[886,916,97],{},[886,918,919],{},[141,920,921],{},".../prometheus/prometheus:latest",[233,923,925],{"id":924},"vérifier-le-fonctionnement","Vérifier le fonctionnement",[12,927,928],{},"Après quelques pulls, vérifiez votre cache :",[133,930,932],{"className":239,"code":931,"language":241,"meta":139,"style":139},"upstreams = client.list_registry_upstreams(registry['id'])\nfor upstream in upstreams:\n    entries = client.list_cache_entries(upstream['id'])\n    print(f\"{upstream['name']}: {len(entries)} cached entries\")\n",[141,933,934,949,963,977],{"__ignoreMap":139},[245,935,936,939,941,944,946],{"class":247,"line":248},[245,937,938],{"class":255},"upstreams ",[245,940,278],{"class":251},[245,942,943],{"class":255}," client.list_registry_upstreams(registry[",[245,945,378],{"class":309},[245,947,948],{"class":255},"])\n",[245,950,951,954,957,960],{"class":247,"line":265},[245,952,953],{"class":251},"for",[245,955,956],{"class":255}," upstream ",[245,958,959],{"class":251},"in",[245,961,962],{"class":255}," upstreams:\n",[245,964,965,968,970,973,975],{"class":247,"line":272},[245,966,967],{"class":255},"    entries ",[245,969,278],{"class":251},[245,971,972],{"class":255}," client.list_cache_entries(upstream[",[245,974,378],{"class":309},[245,976,948],{"class":255},[245,978,979,982,984,986,988,990,993,996,998,1000,1002,1005,1008,1010,1013],{"class":247,"line":284},[245,980,981],{"class":359},"    print",[245,983,363],{"class":255},[245,985,366],{"class":251},[245,987,387],{"class":309},[245,989,372],{"class":359},[245,991,992],{"class":255},"upstream[",[245,994,995],{"class":309},"'name'",[245,997,381],{"class":255},[245,999,384],{"class":359},[245,1001,725],{"class":309},[245,1003,1004],{"class":359},"{len",[245,1006,1007],{"class":255},"(entries)",[245,1009,384],{"class":359},[245,1011,1012],{"class":309}," cached entries\"",[245,1014,348],{"class":255},[63,1016,1018],{"id":1017},"chiffres","Chiffres",[12,1020,1021],{},"Nous avons effectué des tests de pulls d'images via le registre virtuel :",[865,1023,1024,1037],{},[868,1025,1026],{},[871,1027,1028,1031,1034],{},[874,1029,1030],{},"Indicateur",[874,1032,1033],{},"Sans cache",[874,1035,1036],{},"Avec cache chaud",[881,1038,1039,1050,1061],{},[871,1040,1041,1044,1047],{},[886,1042,1043],{},"Temps de pull (Alpine)",[886,1045,1046],{},"10,3 s",[886,1048,1049],{},"4,2 s",[871,1051,1052,1055,1058],{},[886,1053,1054],{},"Temps de pull (Python 3.13 DHI)",[886,1056,1057],{},"11,6 s",[886,1059,1060],{},"~4 s",[871,1062,1063,1066,1069],{},[886,1064,1065],{},"Allers-retours réseau vers le registre en amont",[886,1067,1068],{},"À chaque pull",[886,1070,1071],{},"Uniquement en cas de défaut de cache",[12,1073,1074],{},"Le premier pull conserve la même vitesse (il doit récupérer l'image en amont). Tous les pulls suivants, pendant la durée de validité du cache, proviennent directement du stockage GitLab. Plus d'aller-retour réseau vers Docker Hub, dhi.io, MCR ou tout autre registre.",[12,1076,1077],{},"Pour les équipes qui exécutent des centaines de jobs de pipeline par jour, cela représente des heures cumulées de temps de build économisé.",[63,1079,1081],{"id":1080},"considérations-pratiques","Considérations pratiques",[12,1083,1084],{},"Voici quelques points à garder à l'esprit :",[233,1086,1088],{"id":1087},"durée-de-validité-du-cache","Durée de validité du cache",[12,1090,1091],{},"La valeur par défaut est de 24 heures. Pour les images sensibles en matière de sécurité où vous souhaitez obtenir les correctifs rapidement, envisagez 12 heures ou moins :",[133,1093,1095],{"className":239,"code":1094,"language":241,"meta":139,"style":139},"client.create_upstream(\n    registry_id=registry['id'],\n    url=\"https://dhi.io\",\n    name=\"Docker Hardened Images\",\n    username=\"your-username\",\n    password=\"your-token\",\n    cache_validity_hours=12\n)\n",[141,1096,1097,1101,1113,1123,1133,1144,1155,1164],{"__ignoreMap":139},[245,1098,1099],{"class":247,"line":248},[245,1100,581],{"class":255},[245,1102,1103,1105,1107,1109,1111],{"class":247,"line":265},[245,1104,422],{"class":303},[245,1106,278],{"class":251},[245,1108,375],{"class":255},[245,1110,378],{"class":309},[245,1112,431],{"class":255},[245,1114,1115,1117,1119,1121],{"class":247,"line":272},[245,1116,436],{"class":303},[245,1118,278],{"class":251},[245,1120,513],{"class":309},[245,1122,331],{"class":255},[245,1124,1125,1127,1129,1131],{"class":247,"line":284},[245,1126,323],{"class":303},[245,1128,278],{"class":251},[245,1130,524],{"class":309},[245,1132,331],{"class":255},[245,1134,1135,1137,1139,1142],{"class":247,"line":289},[245,1136,531],{"class":303},[245,1138,278],{"class":251},[245,1140,1141],{"class":309},"\"your-username\"",[245,1143,331],{"class":255},[245,1145,1146,1148,1150,1153],{"class":247,"line":300},[245,1147,543],{"class":303},[245,1149,278],{"class":251},[245,1151,1152],{"class":309},"\"your-token\"",[245,1154,331],{"class":255},[245,1156,1157,1159,1161],{"class":247,"line":320},[245,1158,459],{"class":303},[245,1160,278],{"class":251},[245,1162,1163],{"class":359},"12\n",[245,1165,1166],{"class":247,"line":334},[245,1167,348],{"class":255},[12,1169,1170],{},"Pour les images stables et rarement mises à jour (comme les tags de version spécifiques), une durée de validité plus longue est possible.",[233,1172,1174],{"id":1173},"priorité-des-registres-en-amont","Priorité des registres en amont",[12,1176,1177],{},"Les registres en amont sont interrogés dans l'ordre. Si vous avez des images portant le même nom sur différents registres, le premier registre en amont correspondant l'emporte.",[233,1179,1181],{"id":1180},"limites","Limites",[71,1183,1184,1187],{},[74,1185,1186],{},"20 registres virtuels maximum par groupe",[74,1188,1189],{},"20 registres en amont maximum par registre virtuel",[63,1191,1193],{"id":1192},"configuration-via-linterface-utilisateur","Configuration via l'interface utilisateur",[12,1195,1196,1197,1200],{},"Vous pouvez également configurer les registres virtuels et les registres en amont directement depuis l'interface GitLab, sans appels d'API. Accédez à ",[77,1198,1199],{},"Paramètres > Paquets et registres > Registre virtuel"," de votre groupe pour :",[71,1202,1203,1206,1209,1212],{},[74,1204,1205],{},"Créer et gérer des registres virtuels",[74,1207,1208],{},"Ajouter, modifier et réorganiser les registres en amont",[74,1210,1211],{},"Consulter et gérer le cache",[74,1213,1214],{},"Surveiller les images dont un pull a été effectué",[63,1216,1218],{"id":1217},"perspectives","Perspectives",[12,1220,1221],{},"Nous développons actuellement les éléments suivants :",[71,1223,1224],{},[74,1225,1226,1229],{},[77,1227,1228],{},"Listes d'autorisation/d'exclusion :"," utilisez des regex pour contrôler quelles images font l'objet d'un pull depuis des registres en amont spécifiques.",[12,1231,1232],{},"Il s'agit d'un logiciel en version bêta qui fonctionne. Des équipes l'utilisent déjà en production, mais nous continuons à itérer en fonction des retours.",[63,1234,1236],{"id":1235},"donnez-nous-votre-avis","Donnez-nous votre avis",[12,1238,1239],{},"Si vous êtes ingénieur de plateforme et êtes confronté à la multiplication des registres de conteneurs, nous aimerions comprendre comment vous travaillez :",[71,1241,1242,1245,1248],{},[74,1243,1244],{},"Combien de registres en amont gérez-vous ?",[74,1246,1247],{},"Quel est votre principal point de friction actuel ?",[74,1249,1250],{},"Un outil comme celui-ci vous serait-il utile ? Si non, que manque-t-il ?",[12,1252,1253,1254,1259],{},"Partagez vos retours d'expérience dans le ",[53,1255,1258],{"href":1256,"rel":1257},"https://gitlab.com/gitlab-org/gitlab/-/work_items/589630",[],"ticket dédié au registre virtuel de conteneurs",".",[63,1261,1263],{"id":1262},"ressources-complémentaires","Ressources complémentaires",[71,1265,1266,1273,1279],{},[74,1267,1268],{},[53,1269,1272],{"href":1270,"rel":1271},"https://about.gitlab.com/fr-fr/blog/new-gitlab-metrics-and-registry-features-help-reduce-ci-cd-bottlenecks/#container-virtual-registry",[],"Réduction des goulots d'étranglement CI/CD avec GitLab",[74,1274,1275],{},[53,1276,1278],{"href":55,"rel":1277},[],"Documentation consacrée au registre virtuel de conteneurs",[74,1280,1281],{},[53,1282,1285],{"href":1283,"rel":1284},"https://docs.gitlab.com/api/container_virtual_registries/",[],"API du registre virtuel de conteneurs",[1287,1288,1289],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}",{"title":139,"searchDepth":265,"depth":265,"links":1291},[1292,1293,1294,1295,1304,1305,1310,1311,1312,1313],{"id":65,"depth":265,"text":66},{"id":127,"depth":265,"text":128},{"id":154,"depth":265,"text":155},{"id":227,"depth":265,"text":228,"children":1296},[1297,1298,1299,1300,1301,1302,1303],{"id":235,"depth":272,"text":236},{"id":398,"depth":272,"text":399},{"id":471,"depth":272,"text":472},{"id":565,"depth":272,"text":566},{"id":693,"depth":272,"text":694},{"id":859,"depth":272,"text":860},{"id":924,"depth":272,"text":925},{"id":1017,"depth":265,"text":1018},{"id":1080,"depth":265,"text":1081,"children":1306},[1307,1308,1309],{"id":1087,"depth":272,"text":1088},{"id":1173,"depth":272,"text":1174},{"id":1180,"depth":272,"text":1181},{"id":1192,"depth":265,"text":1193},{"id":1217,"depth":265,"text":1218},{"id":1235,"depth":265,"text":1236},{"id":1262,"depth":265,"text":1263},"engineering","2026-04-01","Simplifiez la gestion des images de conteneurs grâce à ce guide pas à pas.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1772111172/mwhgbjawn62kymfwrhle.png",{},"/fr-fr/blog/using-gitlab-container-virtual-registry-with-docker-hardened-images",{"config":1324,"title":1325,"description":1316},{"noIndex":1319},"Registre de conteneurs GitLab et images durcies Docker","using-gitlab-container-virtual-registry-with-docker-hardened-images","fr-fr/blog/using-gitlab-container-virtual-registry-with-docker-hardened-images",[1329,1330,1331],"tutorial","product","features","BlogPost","w_RDrDiKwGElm3KcQzKYTFrHGKYyFiDt0tsdBvtoBwM",{"logo":1335,"freeTrial":1340,"sales":1345,"login":1350,"items":1355,"search":1672,"minimal":1708,"duo":1727,"switchNav":1736,"pricingDeployment":1747},{"config":1336},{"href":1337,"dataGaName":1338,"dataGaLocation":1339},"/fr-fr/","gitlab logo","header",{"text":1341,"config":1342},"Commencer un essai gratuit",{"href":1343,"dataGaName":1344,"dataGaLocation":1339},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":1346,"config":1347},"Contacter l’équipe commerciale",{"href":1348,"dataGaName":1349,"dataGaLocation":1339},"/fr-fr/sales/","sales",{"text":1351,"config":1352},"Connexion",{"href":1353,"dataGaName":1354,"dataGaLocation":1339},"https://gitlab.com/users/sign_in/","sign in",[1356,1385,1487,1492,1596,1652],{"text":1357,"config":1358,"menu":1360},"Plateforme",{"dataNavLevelOne":1359},"platform",{"type":1361,"columns":1362},"cards",[1363,1369,1377],{"title":1357,"description":1364,"link":1365},"La plateforme d’orchestration intelligente pour le DevSecOps",{"text":1366,"config":1367},"Explorer notre plateforme",{"href":1368,"dataGaName":1359,"dataGaLocation":1339},"/fr-fr/platform/",{"title":1370,"description":1371,"link":1372},"GitLab Duo Agent Platform","L’IA agentique pour l’ensemble du cycle de développement logiciel",{"text":1373,"config":1374},"Découvrir GitLab Duo",{"href":1375,"dataGaName":1376,"dataGaLocation":1339},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1378,"description":1379,"link":1380},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":1381,"config":1382},"En savoir plus",{"href":1383,"dataGaName":1384,"dataGaLocation":1339},"/fr-fr/why-gitlab/","why gitlab",{"text":1386,"left":268,"config":1387,"menu":1389},"Produit",{"dataNavLevelOne":1388},"solutions",{"type":1390,"link":1391,"columns":1395,"feature":1466},"lists",{"text":1392,"config":1393},"Voir toutes les solutions",{"href":1394,"dataGaName":1388,"dataGaLocation":1339},"/fr-fr/solutions/",[1396,1421,1444],{"title":1397,"description":1398,"link":1399,"items":1404},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":1400},{"icon":1401,"href":1402,"dataGaName":1403,"dataGaLocation":1339},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[1405,1409,1412,1417],{"text":1406,"config":1407},"CI/CD",{"href":1408,"dataGaLocation":1339,"dataGaName":1406},"/fr-fr/solutions/continuous-integration/",{"text":1370,"config":1410},{"href":1375,"dataGaLocation":1339,"dataGaName":1411},"gitlab duo agent platform - product menu",{"text":1413,"config":1414},"Gestion du code source",{"href":1415,"dataGaLocation":1339,"dataGaName":1416},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":1418,"config":1419},"Livraison de logiciels automatisée",{"href":1402,"dataGaLocation":1339,"dataGaName":1420},"Automated software delivery",{"title":1422,"description":1423,"link":1424,"items":1429},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":1425},{"href":1426,"dataGaName":1427,"dataGaLocation":1339,"icon":1428},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1430,1434,1439],{"text":1431,"config":1432},"Tests de sécurité des applications",{"href":1426,"dataGaName":1433,"dataGaLocation":1339},"Application security testing",{"text":1435,"config":1436},"Sécurité de la chaîne d’approvisionnement logicielle",{"href":1437,"dataGaLocation":1339,"dataGaName":1438},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":1440,"config":1441},"Conformité logicielle",{"href":1442,"dataGaName":1443,"dataGaLocation":1339},"/fr-fr/solutions/software-compliance/","software compliance",{"title":1445,"link":1446,"items":1451},"Mesures",{"config":1447},{"icon":1448,"href":1449,"dataGaName":1450,"dataGaLocation":1339},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[1452,1456,1461],{"text":1453,"config":1454},"Visibilité et mesures",{"href":1449,"dataGaLocation":1339,"dataGaName":1455},"Visibility and Measurement",{"text":1457,"config":1458},"Gestion de la chaîne de valeur",{"href":1459,"dataGaLocation":1339,"dataGaName":1460},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":1462,"config":1463},"Analyses et informations",{"href":1464,"dataGaLocation":1339,"dataGaName":1465},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":1467,"type":1390,"items":1468},"GitLab",[1469,1475,1481],{"text":1470,"config":1471},"Pour les entreprises",{"icon":1472,"href":1473,"dataGaLocation":1339,"dataGaName":1474},"Building","/fr-fr/enterprise/","enterprise",{"text":1476,"config":1477},"Pour les PME",{"icon":1478,"href":1479,"dataGaLocation":1339,"dataGaName":1480},"Work","/fr-fr/small-business/","small business",{"text":1482,"config":1483},"Pour le secteur public",{"icon":1484,"href":1485,"dataGaLocation":1339,"dataGaName":1486},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":1488,"config":1489},"Tarifs",{"href":1490,"dataGaName":1491,"dataGaLocation":1339,"dataNavLevelOne":1491},"/fr-fr/pricing/","pricing",{"text":1493,"config":1494,"menu":1496},"Ressources",{"dataNavLevelOne":1495},"resources",{"type":1390,"link":1497,"columns":1501,"feature":1585},{"text":1498,"config":1499},"Afficher toutes les ressources",{"href":1500,"dataGaName":1495,"dataGaLocation":1339},"/fr-fr/resources/",[1502,1535,1557],{"title":1503,"items":1504},"Premiers pas",[1505,1510,1515,1520,1525,1530],{"text":1506,"config":1507},"Installation",{"href":1508,"dataGaName":1509,"dataGaLocation":1339},"/fr-fr/install/","install",{"text":1511,"config":1512},"Guides de démarrage",{"href":1513,"dataGaName":1514,"dataGaLocation":1339},"/fr-fr/get-started/","quick setup checklists",{"text":1516,"config":1517},"Apprentissage",{"href":1518,"dataGaLocation":1339,"dataGaName":1519},"https://university.gitlab.com/","learn",{"text":1521,"config":1522},"Documentation",{"href":1523,"dataGaName":1524,"dataGaLocation":1339},"https://docs.gitlab.com/","product documentation",{"text":1526,"config":1527},"Vidéos sur les bonnes pratiques",{"href":1528,"dataGaName":1529,"dataGaLocation":1339},"/fr-fr/getting-started-videos/","best practice videos",{"text":1531,"config":1532},"Intégrations",{"href":1533,"dataGaName":1534,"dataGaLocation":1339},"/fr-fr/integrations/","integrations",{"title":1536,"items":1537},"Découvrir",[1538,1543,1548,1552],{"text":1539,"config":1540},"Témoignages clients",{"href":1541,"dataGaName":1542,"dataGaLocation":1339},"/fr-fr/customers/","customer success stories",{"text":1544,"config":1545},"Blog",{"href":1546,"dataGaName":1547,"dataGaLocation":1339},"/fr-fr/blog/","blog",{"text":1549,"config":1550},"The Source",{"href":1551,"dataGaName":1547,"dataGaLocation":1339},"/fr-fr/the-source/",{"text":1553,"config":1554},"Travail à distance",{"href":1555,"dataGaName":1556,"dataGaLocation":1339},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1558,"items":1559},"Connecter",[1560,1565,1570,1575,1580],{"text":1561,"config":1562},"Services GitLab",{"href":1563,"dataGaName":1564,"dataGaLocation":1339},"/fr-fr/services/","services",{"text":1566,"config":1567},"Communauté",{"href":1568,"dataGaName":1569,"dataGaLocation":1339},"/community/","community",{"text":1571,"config":1572},"Forum",{"href":1573,"dataGaName":1574,"dataGaLocation":1339},"https://forum.gitlab.com/","forum",{"text":1576,"config":1577},"Événements",{"href":1578,"dataGaName":1579,"dataGaLocation":1339},"/events/","events",{"text":1581,"config":1582},"Partenaires",{"href":1583,"dataGaName":1584,"dataGaLocation":1339},"/fr-fr/partners/","partners",{"config":1586,"title":1589,"text":1590,"link":1591},{"background":1587,"textColor":1588},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Nouveautés de GitLab","Restez informé des dernières fonctionnalités et améliorations.",{"text":1592,"config":1593},"Lire les articles les plus récents",{"href":1594,"dataGaName":1595,"dataGaLocation":1339},"/fr-fr/whats-new/","whats new",{"text":1597,"config":1598,"menu":1600},"Société",{"dataNavLevelOne":1599},"company",{"type":1390,"columns":1601},[1602],{"items":1603},[1604,1609,1615,1617,1622,1627,1632,1637,1642,1647],{"text":1605,"config":1606},"À propos",{"href":1607,"dataGaName":1608,"dataGaLocation":1339},"/fr-fr/company/","about",{"text":1610,"config":1611,"footerGa":1614},"Carrières",{"href":1612,"dataGaName":1613,"dataGaLocation":1339},"/jobs/","jobs",{"dataGaName":1613},{"text":1576,"config":1616},{"href":1578,"dataGaName":1579,"dataGaLocation":1339},{"text":1618,"config":1619},"Leadership",{"href":1620,"dataGaName":1621,"dataGaLocation":1339},"/company/team/e-group/","leadership",{"text":1623,"config":1624},"Manuel",{"href":1625,"dataGaName":1626,"dataGaLocation":1339},"https://handbook.gitlab.com/","handbook",{"text":1628,"config":1629},"Relations avec les investisseurs",{"href":1630,"dataGaName":1631,"dataGaLocation":1339},"https://ir.gitlab.com/","investor relations",{"text":1633,"config":1634},"Trust Center",{"href":1635,"dataGaName":1636,"dataGaLocation":1339},"/fr-fr/security/","trust center",{"text":1638,"config":1639},"Centre pour la transparence de l’IA",{"href":1640,"dataGaName":1641,"dataGaLocation":1339},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":1643,"config":1644},"Newsletter",{"href":1645,"dataGaName":1646,"dataGaLocation":1339},"/company/contact/#contact-forms","newsletter",{"text":1648,"config":1649},"Presse",{"href":1650,"dataGaName":1651,"dataGaLocation":1339},"/press/","press",{"text":1653,"config":1654,"menu":1655},"Nous contacter",{"dataNavLevelOne":1599},{"type":1390,"columns":1656},[1657],{"items":1658},[1659,1662,1667],{"text":1346,"config":1660},{"href":1348,"dataGaName":1661,"dataGaLocation":1339},"talk to sales",{"text":1663,"config":1664},"Portail d'assistance",{"href":1665,"dataGaName":1666,"dataGaLocation":1339},"https://support.gitlab.com","support portal",{"text":1668,"config":1669},"Portail clients GitLab",{"href":1670,"dataGaName":1671,"dataGaLocation":1339},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1673,"login":1674,"suggestions":1681},"Fermer",{"text":1675,"link":1676},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1677,"config":1678},"GitLab.com",{"href":1353,"dataGaName":1679,"dataGaLocation":1680},"search login","search",{"text":1682,"default":1683},"Suggestions",[1684,1687,1692,1694,1699,1704],{"text":1370,"config":1685},{"href":1375,"dataGaName":1686,"dataGaLocation":1680},"GitLab Duo Agent Platform",{"text":1688,"config":1689},"Suggestions de code (IA)",{"href":1690,"dataGaName":1691,"dataGaLocation":1680},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1406,"config":1693},{"href":1408,"dataGaName":1406,"dataGaLocation":1680},{"text":1695,"config":1696},"GitLab sur AWS",{"href":1697,"dataGaName":1698,"dataGaLocation":1680},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1700,"config":1701},"GitLab sur Google Cloud",{"href":1702,"dataGaName":1703,"dataGaLocation":1680},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1705,"config":1706},"Pourquoi utiliser GitLab ?",{"href":1383,"dataGaName":1707,"dataGaLocation":1680},"Why GitLab?",{"freeTrial":1709,"mobileIcon":1714,"desktopIcon":1719,"secondaryButton":1722},{"text":1710,"config":1711},"Commencer votre essai gratuit",{"href":1712,"dataGaName":1344,"dataGaLocation":1713},"https://gitlab.com/-/trials/new/","nav",{"altText":1715,"config":1716},"Icône GitLab",{"src":1717,"dataGaName":1718,"dataGaLocation":1713},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1715,"config":1720},{"src":1721,"dataGaName":1718,"dataGaLocation":1713},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1723,"config":1724},"Commencer",{"href":1725,"dataGaName":1726,"dataGaLocation":1713},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1728,"mobileIcon":1732,"desktopIcon":1734},{"text":1729,"config":1730},"En savoir plus sur GitLab Duo",{"href":1375,"dataGaName":1731,"dataGaLocation":1713},"gitlab duo",{"altText":1715,"config":1733},{"src":1717,"dataGaName":1718,"dataGaLocation":1713},{"altText":1715,"config":1735},{"src":1721,"dataGaName":1718,"dataGaLocation":1713},{"button":1737,"mobileIcon":1742,"desktopIcon":1744},{"text":1738,"config":1739},"/switch",{"href":1740,"dataGaName":1741,"dataGaLocation":1713},"#contact","switch",{"altText":1715,"config":1743},{"src":1717,"dataGaName":1718,"dataGaLocation":1713},{"altText":1715,"config":1745},{"src":1746,"dataGaName":1718,"dataGaLocation":1713},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1748,"mobileIcon":1753,"desktopIcon":1755},{"text":1749,"config":1750},"Retour aux tarifs",{"href":1490,"dataGaName":1751,"dataGaLocation":1713,"icon":1752},"back to pricing","GoBack",{"altText":1715,"config":1754},{"src":1717,"dataGaName":1718,"dataGaLocation":1713},{"altText":1715,"config":1756},{"src":1721,"dataGaName":1718,"dataGaLocation":1713},{"title":1758,"button":1759,"config":1764},"Découvrez comment l'IA agentique transforme la livraison logicielle",{"text":1760,"config":1761},"Rejoindre GitLab Transcend en direct le 10 juin",{"href":1762,"dataGaName":1763,"dataGaLocation":1339},"/fr-fr/events/transcend/virtual/","transcend event",{"layout":1765,"disabled":1319},"release",{"data":1767},{"text":1768,"source":1769,"edit":1775,"contribute":1780,"config":1785,"items":1790,"minimal":1998},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1770,"config":1771},"Afficher le code source de la page",{"href":1772,"dataGaName":1773,"dataGaLocation":1774},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1776,"config":1777},"Modifier cette page",{"href":1778,"dataGaName":1779,"dataGaLocation":1774},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1781,"config":1782},"Veuillez contribuer",{"href":1783,"dataGaName":1784,"dataGaLocation":1774},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1786,"facebook":1787,"youtube":1788,"linkedin":1789},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1791,1838,1891,1935,1965],{"title":1488,"links":1792,"subMenu":1807},[1793,1797,1802],{"text":1794,"config":1795},"Voir les forfaits",{"href":1490,"dataGaName":1796,"dataGaLocation":1774},"view plans",{"text":1798,"config":1799},"GitLab Premium",{"href":1800,"dataGaName":1801,"dataGaLocation":1774},"/fr-fr/pricing/premium/","why premium",{"text":1803,"config":1804},"GitLab Ultimate",{"href":1805,"dataGaName":1806,"dataGaLocation":1774},"/fr-fr/pricing/ultimate/","why ultimate",[1808],{"title":1653,"links":1809},[1810,1813,1816,1818,1823,1828,1833],{"text":1811,"config":1812},"Contacter l'équipe commerciale",{"href":1348,"dataGaName":1349,"dataGaLocation":1774},{"text":1814,"config":1815},"Assistance GitLab",{"href":1665,"dataGaName":1666,"dataGaLocation":1774},{"text":1668,"config":1817},{"href":1670,"dataGaName":1671,"dataGaLocation":1774},{"text":1819,"config":1820},"Statut",{"href":1821,"dataGaName":1822,"dataGaLocation":1774},"https://status.gitlab.com/","status",{"text":1824,"config":1825},"Conditions d'utilisation",{"href":1826,"dataGaName":1827,"dataGaLocation":1774},"/terms/","terms of use",{"text":1829,"config":1830},"Politique de confidentialité",{"href":1831,"dataGaName":1832,"dataGaLocation":1774},"/fr-fr/privacy/","privacy statement",{"text":1834,"config":1835},"Gérer vos cookies",{"dataGaName":1836,"dataGaLocation":1774,"id":1837,"isOneTrustButton":268},"cookie preferences","ot-sdk-btn",{"title":1386,"links":1839,"subMenu":1848},[1840,1844],{"text":1841,"config":1842},"Plateforme DevSecOps",{"href":1368,"dataGaName":1843,"dataGaLocation":1774},"devsecops platform",{"text":1845,"config":1846},"Développement assisté par l'IA",{"href":1375,"dataGaName":1847,"dataGaLocation":1774},"ai-assisted development",[1849],{"title":1850,"links":1851},"Thèmes",[1852,1856,1861,1866,1871,1876,1881,1886],{"text":1406,"config":1853},{"href":1854,"dataGaName":1855,"dataGaLocation":1774},"/fr-fr/topics/ci-cd/","cicd",{"text":1857,"config":1858},"GitOps",{"href":1859,"dataGaName":1860,"dataGaLocation":1774},"/fr-fr/topics/gitops/","gitops",{"text":1862,"config":1863},"DevOps",{"href":1864,"dataGaName":1865,"dataGaLocation":1774},"/fr-fr/topics/devops/","devops",{"text":1867,"config":1868},"Contrôle de version",{"href":1869,"dataGaName":1870,"dataGaLocation":1774},"/fr-fr/topics/version-control/","version control",{"text":1872,"config":1873},"DevSecOps",{"href":1874,"dataGaName":1875,"dataGaLocation":1774},"/fr-fr/topics/devsecops/","devsecops",{"text":1877,"config":1878},"Cloud-native",{"href":1879,"dataGaName":1880,"dataGaLocation":1774},"/fr-fr/topics/cloud-native/","cloud native",{"text":1882,"config":1883},"IA pour la programmation",{"href":1884,"dataGaName":1885,"dataGaLocation":1774},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":1887,"config":1888},"IA agentique",{"href":1889,"dataGaName":1890,"dataGaLocation":1774},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":1892,"links":1893},"Solutions",[1894,1897,1899,1904,1907,1910,1913,1916,1919,1922,1925,1930],{"text":1431,"config":1895},{"href":1426,"dataGaName":1896,"dataGaLocation":1774},"Application Security Testing",{"text":1418,"config":1898},{"href":1402,"dataGaName":1403,"dataGaLocation":1774},{"text":1900,"config":1901},"Développement Agile",{"href":1902,"dataGaName":1903,"dataGaLocation":1774},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":1413,"config":1905},{"href":1415,"dataGaName":1906,"dataGaLocation":1774},"source code management",{"text":1406,"config":1908},{"href":1408,"dataGaName":1909,"dataGaLocation":1774},"continuous integration & delivery",{"text":1457,"config":1911},{"href":1459,"dataGaName":1912,"dataGaLocation":1774},"value stream management",{"text":1857,"config":1914},{"href":1915,"dataGaName":1860,"dataGaLocation":1774},"/fr-fr/solutions/gitops/",{"text":1917,"config":1918},"Entreprises",{"href":1473,"dataGaName":1474,"dataGaLocation":1774},{"text":1920,"config":1921},"PME",{"href":1479,"dataGaName":1480,"dataGaLocation":1774},{"text":1923,"config":1924},"Secteur public",{"href":1485,"dataGaName":1486,"dataGaLocation":1774},{"text":1926,"config":1927},"Éducation",{"href":1928,"dataGaName":1929,"dataGaLocation":1774},"/fr-fr/solutions/education/","education",{"text":1931,"config":1932},"Services financiers",{"href":1933,"dataGaName":1934,"dataGaLocation":1774},"/fr-fr/solutions/finance/","financial services",{"title":1493,"links":1936},[1937,1939,1941,1943,1946,1948,1951,1953,1955,1957,1959,1961,1963],{"text":1506,"config":1938},{"href":1508,"dataGaName":1509,"dataGaLocation":1774},{"text":1511,"config":1940},{"href":1513,"dataGaName":1514,"dataGaLocation":1774},{"text":1516,"config":1942},{"href":1518,"dataGaName":1519,"dataGaLocation":1774},{"text":1521,"config":1944},{"href":1523,"dataGaName":1945,"dataGaLocation":1774},"docs",{"text":1544,"config":1947},{"href":1546,"dataGaName":1547,"dataGaLocation":1774},{"text":1949,"config":1950},"Quoi de neuf",{"href":1594,"dataGaName":1595,"dataGaLocation":1774},{"text":1539,"config":1952},{"href":1541,"dataGaName":1542,"dataGaLocation":1774},{"text":1553,"config":1954},{"href":1555,"dataGaName":1556,"dataGaLocation":1774},{"text":1561,"config":1956},{"href":1563,"dataGaName":1564,"dataGaLocation":1774},{"text":1566,"config":1958},{"href":1568,"dataGaName":1569,"dataGaLocation":1774},{"text":1571,"config":1960},{"href":1573,"dataGaName":1574,"dataGaLocation":1774},{"text":1576,"config":1962},{"href":1578,"dataGaName":1579,"dataGaLocation":1774},{"text":1581,"config":1964},{"href":1583,"dataGaName":1584,"dataGaLocation":1774},{"title":1597,"links":1966},[1967,1969,1971,1973,1975,1977,1982,1987,1989,1991,1993],{"text":1605,"config":1968},{"href":1607,"dataGaName":1599,"dataGaLocation":1774},{"text":1610,"config":1970},{"href":1612,"dataGaName":1613,"dataGaLocation":1774},{"text":1618,"config":1972},{"href":1620,"dataGaName":1621,"dataGaLocation":1774},{"text":1623,"config":1974},{"href":1625,"dataGaName":1626,"dataGaLocation":1774},{"text":1628,"config":1976},{"href":1630,"dataGaName":1631,"dataGaLocation":1774},{"text":1978,"config":1979},"Développement durable",{"href":1980,"dataGaName":1981,"dataGaLocation":1774},"/sustainability/","Sustainability",{"text":1983,"config":1984},"Diversité, inclusion et appartenance (DIB)",{"href":1985,"dataGaName":1986,"dataGaLocation":1774},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1633,"config":1988},{"href":1635,"dataGaName":1636,"dataGaLocation":1774},{"text":1643,"config":1990},{"href":1645,"dataGaName":1646,"dataGaLocation":1774},{"text":1648,"config":1992},{"href":1650,"dataGaName":1651,"dataGaLocation":1774},{"text":1994,"config":1995},"Déclaration de transparence sur l'esclavage moderne",{"href":1996,"dataGaName":1997,"dataGaLocation":1774},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1999},[2000,2002,2005],{"text":1824,"config":2001},{"href":1826,"dataGaName":1827,"dataGaLocation":1774},{"text":2003,"config":2004},"Gestion des cookies",{"dataGaName":1836,"dataGaLocation":1774,"id":1837,"isOneTrustButton":268},{"text":1829,"config":2006},{"href":1831,"dataGaName":1832,"dataGaLocation":1774},[2008],{"id":2009,"title":7,"body":1318,"config":2010,"content":2012,"description":1318,"extension":2016,"meta":2017,"navigation":268,"path":2018,"seo":2019,"stem":2020,"__hash__":2021},"blogAuthors/en-us/blog/authors/tim-rizzi.yml",{"template":2011},"BlogAuthor",{"name":7,"config":2013},{"headshot":2014,"ctfId":2015},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749661866/Blog/Author%20Headshots/trizzi-headshot.jpg","trizzi","yml",{},"/en-us/blog/authors/tim-rizzi",{},"en-us/blog/authors/tim-rizzi","ADPqrpcnKveFJS0m_zFV0VLtb_h_txu59QVgz_YwKMc",[2023,2031,2039],{"title":2024,"description":2025,"heroImage":2026,"category":1314,"date":2027,"authors":2028,"slug":2030,"externalUrl":1318},"Comment mettre en place l'observabilité CI/CD à grande échelle","Ce guide pratique consacré à l'analyse des pipelines GitLab aide les utilisateurs de GitLab Self-Managed à obtenir des indicateurs opérationnels exploitables grâce à Prometheus et Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-05-18",[2029],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"title":2032,"description":2033,"heroImage":2034,"category":1314,"date":2035,"authors":2036,"slug":2038,"externalUrl":1318},"5 modèles de pipeline GitLab pour résoudre vos enjeux d'ingénierie","Découvrez comment faire évoluer votre approche CI/CD avec des modèles composables pour les monorepos, les microservices, les environnements et la gouvernance.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1772721753/frfsm1qfscwrmsyzj1qn.png","2026-05-06",[2037],"Omid Khan","5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"title":2040,"description":2041,"heroImage":2042,"category":1314,"date":2043,"authors":2044,"slug":2046,"externalUrl":1318},"GitLab Duo Agentic Chat : renforcez votre code avec les règles personnalisées","Découvrez comment l'IA peut comprendre votre code source, suivre vos conventions et générer du code prêt pour la production avec un minimum de cycles de revue.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-02-10",[2045],"Michael Friedrich","custom-rules-duo-agentic-chat-deep-dive",{"promotions":2048},[2049,2063,2074,2086],{"id":2050,"categories":2051,"header":2053,"text":2054,"button":2055,"image":2060},"ai-modernization",[2052],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":2056,"config":2057},"Obtenez votre score de maturité IA",{"href":2058,"dataGaName":2059,"dataGaLocation":1547},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":2061},{"src":2062},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2064,"categories":2065,"header":2066,"text":2054,"button":2067,"image":2071},"devops-modernization",[1330,1875],"Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":2068,"config":2069},"Obtenez votre score de maturité DevOps",{"href":2070,"dataGaName":2059,"dataGaLocation":1547},"/fr-fr/assessments/devops-modernization-assessment/",{"config":2072},{"src":2073},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2075,"categories":2076,"header":2078,"text":2054,"button":2079,"image":2083},"security-modernization",[2077],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":2080,"config":2081},"Obtenez votre score de maturité en matière de sécurité",{"href":2082,"dataGaName":2059,"dataGaLocation":1547},"/fr-fr/assessments/security-modernization-assessment/",{"config":2084},{"src":2085},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2087,"paths":2088,"header":2091,"text":2092,"button":2093,"image":2098},"github-azure-migration",[2089,2090],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Votre équipe est-elle prête pour la migration de GitHub vers Azure ?","GitHub a déjà commencé sa migration vers Azure. Découvrez ce que cela signifie pour vous.",{"text":2094,"config":2095},"Découvrez les différences entre GitLab et GitHub",{"href":2096,"dataGaName":2097,"dataGaLocation":1547},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2099},{"src":2073},{"header":2101,"blurb":2102,"button":2103,"secondaryButton":2107},"Commencez à développer plus rapidement dès aujourd'hui","Découvrez ce que votre équipe peut accomplir avec la plateforme d'orchestration intelligente pour le DevSecOps.\n",{"text":1341,"config":2104},{"href":2105,"dataGaName":1344,"dataGaLocation":2106},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":1811,"config":2108},{"href":1348,"dataGaName":1349,"dataGaLocation":2106},1781392681494]