[{"data":1,"prerenderedAt":2118},["ShallowReactive",2],{"/de-de/blog/using-gitlab-container-virtual-registry-with-docker-hardened-images":3,"navigation-de-de":1333,"banner-de-de":1765,"footer-de-de":1773,"blog-post-authors-de-de-Tim Rizzi":2014,"blog-related-posts-de-de-using-gitlab-container-virtual-registry-with-docker-hardened-images":2029,"blog-promotions-de-de":2055,"next-steps-de-de":2108},{"id":4,"title":5,"authors":6,"body":8,"category":1312,"date":1313,"description":1314,"extension":1315,"externalUrl":1316,"faq":1316,"featured":1317,"heroImage":1318,"meta":1319,"navigation":384,"path":1320,"seo":1321,"slug":1325,"stem":1326,"tags":1327,"template":1331,"updatedDate":1316,"__hash__":1332},"blogPosts/de-de/blog/using-gitlab-container-virtual-registry-with-docker-hardened-images.md","GitLab Container Virtual Registry mit Docker Hardened Images einrichten",[7],"Tim Rizzi",{"type":9,"value":10,"toc":1287},"minimark",[11,15,21,26,31,34,39,44,49,59,62,67,70,105,108,111,114,118,121,132,135,141,145,153,156,182,185,191,197,207,213,216,220,223,228,368,372,375,447,451,457,546,550,666,670,677,839,843,846,904,908,911,1000,1004,1007,1057,1060,1063,1067,1071,1074,1155,1158,1162,1165,1169,1177,1181,1188,1202,1206,1209,1217,1220,1224,1227,1238,1247,1251,1273,1277,1280,1283],[12,13,14],"p",{},"Wer im Plattformteam arbeitet, kennt solche Gespräche:",[12,16,17],{},[18,19,20],"em",{},"„Security sagt: Wir müssen gehärtete Base-Images verwenden.\"",[12,22,23],{},[18,24,25],{},"„Prima – wo trage ich jetzt die Credentials für noch eine weitere Registry ein?\"",[12,27,28],{},[18,29,30],{},"„Und wie stellen wir sicher, dass alle sie auch wirklich nutzen?\"",[12,32,33],{},"Oder diese hier:",[12,35,36],{},[18,37,38],{},"„Warum sind unsere Builds so langsam?\"",[12,40,41],{},[18,42,43],{},"„Wir pullen dasselbe 500-MB-Image in jedem einzelnen Job neu von Docker Hub.\"",[12,45,46],{},[18,47,48],{},"„Kann man die nicht irgendwo cachen?\"",[12,50,51,52,58],{},"Ich arbeite bei GitLab an der ",[53,54,57],"a",{"href":55,"rel":56},"https://docs.gitlab.com/user/packages/virtual_registry/container/",[],"Container Virtual Registry"," – einem Pull-Through-Cache, der vor den vorgelagerten Registries sitzt: Docker Hub, dhi.io (Docker Hardened Images), MCR und Quay. Teams erhalten einen einzigen Endpunkt zum Pullen. Images werden beim ersten Abruf gecacht; alle nachfolgenden Pulls kommen aus dem Cache. Das Entwicklungsteam muss nicht wissen, aus welchem Upstream ein bestimmtes Image stammt.",[12,60,61],{},"Dieser Artikel zeigt die Einrichtung der Container Virtual Registry – mit Docker Hardened Images als konkretem Anwendungsfall, da diese Kombination für Teams mit Sicherheitsanforderungen besonders naheliegt.",[63,64,66],"h2",{"id":65},"das-problem-registry-wildwuchs-im-plattformteam","Das Problem: Registry-Wildwuchs im Plattformteam",[12,68,69],{},"Die Plattformteams, mit denen ich spreche, verwalten Container-Images über drei bis fünf Registries:",[71,72,73,81,87,93,99],"ul",{},[74,75,76,80],"li",{},[77,78,79],"strong",{},"Docker Hub"," für die meisten Base-Images",[74,82,83,86],{},[77,84,85],{},"dhi.io"," für Docker Hardened Images (sicherheitskritische Workloads)",[74,88,89,92],{},[77,90,91],{},"MCR"," für .NET- und Azure-Tooling",[74,94,95,98],{},[77,96,97],{},"Quay.io"," für das Red-Hat-Ökosystem",[74,100,101,104],{},[77,102,103],{},"Interne Registries"," für proprietäre Images",[12,106,107],{},"Jede davon hat eigene Authentifizierungsmechanismen, unterschiedliche Netzwerklatenz und eine eigene Pfadstruktur für Images.",[12,109,110],{},"CI/CD-Konfigurationen füllen sich mit registry-spezifischer Logik. Credential-Management wird zum eigenständigen Projekt. Und jeder Pipeline-Job lädt dieselben Base-Images erneut über das Netz – obwohl sie sich seit Wochen nicht geändert haben.",[12,112,113],{},"Container Virtual Registry konsolidiert das: eine Registry-URL, ein Authentifizierungsfluss über GitLab, gecachte Images aus GitLab-Infrastruktur statt wiederholter Internet-Traversierung.",[63,115,117],{"id":116},"funktionsweise","Funktionsweise",[12,119,120],{},"Das Modell ist geradlinig:",[122,123,129],"pre",{"className":124,"code":126,"language":127,"meta":128},[125],"language-text","\nPipeline ruft ab:\n  gitlab.com/virtual_registries/container/1000016/python:3.13\n\nVirtual Registry prüft:\n  1. Im Cache vorhanden? → Direkt zurückgeben\n  2. Nein? → Vom Upstream laden, cachen, zurückgeben\n\n\n","text","",[130,131,126],"code",{"__ignoreMap":128},[12,133,134],{},"Upstreams werden in Prioritätsreihenfolge konfiguriert. Bei einem eingehenden Pull-Request durchsucht die Virtual Registry die Upstreams der Reihe nach, bis das Image gefunden wird. Das Ergebnis wird für einen konfigurierbaren Zeitraum gecacht – standardmäßig 24 Stunden.",[122,136,139],{"className":137,"code":138,"language":127,"meta":128},[125],"\n┌─────────────────────────────────────────────────────────┐ │                    CI/CD Pipeline                       │ │                          │                              │ │                          ▼                              │ │   gitlab.com/virtual_registries/container/\u003Cid>/image   │ └─────────────────────────────────────────────────────────┘\n                           │\n                           ▼\n┌─────────────────────────────────────────────────────────┐ │            Container Virtual Registry                   │ │                                                         │ │  Upstream 1: Docker Hub ────────────────┐               │ │  Upstream 2: dhi.io (Hardened) ────────┐│               │ │  Upstream 3: MCR ─────────────────────┐││               │ │  Upstream 4: Quay.io ────────────────┐│││               │ │                                      ││││               │ │                    ┌─────────────────┴┴┴┴──┐            │ │                    │        Cache          │            │ │                    │  (manifests + layers) │            │ │                    └───────────────────────┘            │ └─────────────────────────────────────────────────────────┘\n\n",[130,140,138],{"__ignoreMap":128},[63,142,144],{"id":143},"was-das-konkret-bringt-besonders-mit-docker-hardened-images","Was das konkret bringt – besonders mit Docker Hardened Images",[12,146,147,152],{},[53,148,151],{"href":149,"rel":150},"https://docs.docker.com/dhi/",[],"Docker Hardened Images"," zeichnen sich durch minimale Angriffsfläche, nahezu keine bekannten CVEs, vollständige Software Bills of Materials (SBOMs) und SLSA-Provenance aus. Für Teams, die Base-Images für sicherheitskritische Workloads evaluieren, gehören sie auf die Shortlist.",[12,154,155],{},"Der Wechsel zu dhi.io erzeugt jedoch dieselbe operative Reibung wie jede neue Registry:",[71,157,158,164,170,176],{},[74,159,160,163],{},[77,161,162],{},"Credential-Verteilung",": Docker-Credentials müssen auf alle Systeme verteilt werden, die Images von dhi.io abrufen.",[74,165,166,169],{},[77,167,168],{},"CI/CD-Anpassungen",": Jede Pipeline muss für die Authentifizierung mit dhi.io aktualisiert werden.",[74,171,172,175],{},[77,173,174],{},"Akzeptanzproblem",": Ohne zentrale Steuerung greifen Teams weiterhin auf reguläre Images zurück.",[74,177,178,181],{},[77,179,180],{},"Fehlende Transparenz",": Ob Teams tatsächlich die gehärteten Varianten nutzen, ist kaum nachvollziehbar.",[12,183,184],{},"Die Virtual Registry löst jeden dieser Punkte:",[12,186,187,190],{},[77,188,189],{},"Einzelne Credential",": Teams authentifizieren sich bei GitLab. Die Virtual Registry übernimmt die Upstream-Authentifizierung. Docker-Credentials werden einmalig auf Registry-Ebene konfiguriert und gelten für alle Pulls.",[12,192,193,196],{},[77,194,195],{},"Keine per-Team-CI/CD-Änderungen",": Pipelines auf die Virtual Registry zeigen lassen – fertig. Die Upstream-Konfiguration ist zentralisiert.",[12,198,199,202,203,206],{},[77,200,201],{},"Schrittweise Einführung",": Da Images mit ihrem vollständigen Pfad gecacht werden, ist im Cache sichtbar, was tatsächlich abgerufen wird. Wird ",[130,204,205],{},"library/python:3.11"," statt der gehärteten Variante gepullt, ist das erkennbar.",[12,208,209,212],{},[77,210,211],{},"Audit-Trail",": Der Cache zeigt exakt, welche Images aktiv genutzt werden – nachvollziehbar für Compliance-Zwecke und als Grundlage für das Verständnis der tatsächlichen Infrastruktur-Abhängigkeiten.",[12,214,215],{},"Wer das Konzept verstanden hat und die Einrichtung zu einem späteren Zeitpunkt in Angriff nimmt: Die wesentlichen Konzepte sind damit abgedeckt. Die technische Konfiguration folgt im nächsten Abschnitt.",[63,217,219],{"id":218},"einrichtung","Einrichtung",[12,221,222],{},"Die folgende Einrichtung nutzt den Python-Client aus dem Demo-Projekt.",[224,225,227],"h3",{"id":226},"virtual-registry-erstellen","Virtual Registry erstellen",[122,229,233],{"className":230,"code":231,"language":232,"meta":128,"style":128},"language-python shiki shiki-themes github-light","from virtual_registry_client import VirtualRegistryClient\nclient = VirtualRegistryClient()\nregistry = client.create_virtual_registry(\n    group_id=\"785414\",  # ID der obersten Gruppe\n    name=\"platform-images\",\n    description=\"Cached container images for platform teams\"\n)\nprint(f\"Registry ID: {registry['id']}\") # Diese ID wird für die Pull-URL benötigt\n","python",[130,234,235,254,266,277,297,311,322,328],{"__ignoreMap":128},[236,237,240,244,248,251],"span",{"class":238,"line":239},"line",1,[236,241,243],{"class":242},"sD7c4","from",[236,245,247],{"class":246},"sgsFI"," virtual_registry_client ",[236,249,250],{"class":242},"import",[236,252,253],{"class":246}," VirtualRegistryClient\n",[236,255,257,260,263],{"class":238,"line":256},2,[236,258,259],{"class":246},"client ",[236,261,262],{"class":242},"=",[236,264,265],{"class":246}," VirtualRegistryClient()\n",[236,267,269,272,274],{"class":238,"line":268},3,[236,270,271],{"class":246},"registry ",[236,273,262],{"class":242},[236,275,276],{"class":246}," client.create_virtual_registry(\n",[236,278,280,284,286,290,293],{"class":238,"line":279},4,[236,281,283],{"class":282},"sqxcx","    group_id",[236,285,262],{"class":242},[236,287,289],{"class":288},"sYBdl","\"785414\"",[236,291,292],{"class":246},",  ",[236,294,296],{"class":295},"sAwPA","# ID der obersten Gruppe\n",[236,298,300,303,305,308],{"class":238,"line":299},5,[236,301,302],{"class":282},"    name",[236,304,262],{"class":242},[236,306,307],{"class":288},"\"platform-images\"",[236,309,310],{"class":246},",\n",[236,312,314,317,319],{"class":238,"line":313},6,[236,315,316],{"class":282},"    description",[236,318,262],{"class":242},[236,320,321],{"class":288},"\"Cached container images for platform teams\"\n",[236,323,325],{"class":238,"line":324},7,[236,326,327],{"class":246},")\n",[236,329,331,335,338,341,344,347,350,353,356,359,362,365],{"class":238,"line":330},8,[236,332,334],{"class":333},"sYu0t","print",[236,336,337],{"class":246},"(",[236,339,340],{"class":242},"f",[236,342,343],{"class":288},"\"Registry ID: ",[236,345,346],{"class":333},"{",[236,348,349],{"class":246},"registry[",[236,351,352],{"class":288},"'id'",[236,354,355],{"class":246},"]",[236,357,358],{"class":333},"}",[236,360,361],{"class":288},"\"",[236,363,364],{"class":246},") ",[236,366,367],{"class":295},"# Diese ID wird für die Pull-URL benötigt\n",[224,369,371],{"id":370},"docker-hub-als-upstream-hinzufügen","Docker Hub als Upstream hinzufügen",[12,373,374],{},"Für offizielle Images wie Alpine, Python usw.:",[122,376,378],{"className":230,"code":377,"language":232,"meta":128,"style":128},"\ndocker_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\n",[130,379,380,386,396,410,422,433,443],{"__ignoreMap":128},[236,381,382],{"class":238,"line":239},[236,383,385],{"emptyLinePlaceholder":384},true,"\n",[236,387,388,391,393],{"class":238,"line":256},[236,389,390],{"class":246},"docker_upstream ",[236,392,262],{"class":242},[236,394,395],{"class":246}," client.create_upstream(\n",[236,397,398,401,403,405,407],{"class":238,"line":268},[236,399,400],{"class":282},"    registry_id",[236,402,262],{"class":242},[236,404,349],{"class":246},[236,406,352],{"class":288},[236,408,409],{"class":246},"],\n",[236,411,412,415,417,420],{"class":238,"line":279},[236,413,414],{"class":282},"    url",[236,416,262],{"class":242},[236,418,419],{"class":288},"\"https://registry-1.docker.io\"",[236,421,310],{"class":246},[236,423,424,426,428,431],{"class":238,"line":299},[236,425,302],{"class":282},[236,427,262],{"class":242},[236,429,430],{"class":288},"\"Docker Hub\"",[236,432,310],{"class":246},[236,434,435,438,440],{"class":238,"line":313},[236,436,437],{"class":282},"    cache_validity_hours",[236,439,262],{"class":242},[236,441,442],{"class":333},"24\n",[236,444,445],{"class":238,"line":324},[236,446,327],{"class":246},[224,448,450],{"id":449},"docker-hardened-images-dhiio-hinzufügen","Docker Hardened Images (dhi.io) hinzufügen",[12,452,453,454,456],{},"Docker Hardened Images werden auf ",[130,455,85],{}," gehostet – einer separaten Registry mit Authentifizierungspflicht:",[122,458,460],{"className":230,"code":459,"language":232,"meta":128,"style":128},"\ndhi_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\n",[130,461,462,466,475,487,498,509,521,533,541],{"__ignoreMap":128},[236,463,464],{"class":238,"line":239},[236,465,385],{"emptyLinePlaceholder":384},[236,467,468,471,473],{"class":238,"line":256},[236,469,470],{"class":246},"dhi_upstream ",[236,472,262],{"class":242},[236,474,395],{"class":246},[236,476,477,479,481,483,485],{"class":238,"line":268},[236,478,400],{"class":282},[236,480,262],{"class":242},[236,482,349],{"class":246},[236,484,352],{"class":288},[236,486,409],{"class":246},[236,488,489,491,493,496],{"class":238,"line":279},[236,490,414],{"class":282},[236,492,262],{"class":242},[236,494,495],{"class":288},"\"https://dhi.io\"",[236,497,310],{"class":246},[236,499,500,502,504,507],{"class":238,"line":299},[236,501,302],{"class":282},[236,503,262],{"class":242},[236,505,506],{"class":288},"\"Docker Hardened Images\"",[236,508,310],{"class":246},[236,510,511,514,516,519],{"class":238,"line":313},[236,512,513],{"class":282},"    username",[236,515,262],{"class":242},[236,517,518],{"class":288},"\"your-docker-username\"",[236,520,310],{"class":246},[236,522,523,526,528,531],{"class":238,"line":324},[236,524,525],{"class":282},"    password",[236,527,262],{"class":242},[236,529,530],{"class":288},"\"your-docker-access-token\"",[236,532,310],{"class":246},[236,534,535,537,539],{"class":238,"line":330},[236,536,437],{"class":282},[236,538,262],{"class":242},[236,540,442],{"class":333},[236,542,544],{"class":238,"line":543},9,[236,545,327],{"class":246},[224,547,549],{"id":548},"weitere-upstreams-hinzufügen","Weitere Upstreams hinzufügen",[122,551,553],{"className":230,"code":552,"language":232,"meta":128,"style":128},"\n# MCR für .NET-Teams client.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# Quay für das Red-Hat-Ökosystem client.create_upstream(\n    registry_id=registry['id'],\n    url=\"https://quay.io\",\n    name=\"Quay.io\",\n    cache_validity_hours=24\n)\n\n",[130,554,555,559,564,576,587,598,607,611,616,628,640,652,661],{"__ignoreMap":128},[236,556,557],{"class":238,"line":239},[236,558,385],{"emptyLinePlaceholder":384},[236,560,561],{"class":238,"line":256},[236,562,563],{"class":295},"# MCR für .NET-Teams client.create_upstream(\n",[236,565,566,568,570,572,574],{"class":238,"line":268},[236,567,400],{"class":246},[236,569,262],{"class":242},[236,571,349],{"class":246},[236,573,352],{"class":288},[236,575,409],{"class":246},[236,577,578,580,582,585],{"class":238,"line":279},[236,579,414],{"class":246},[236,581,262],{"class":242},[236,583,584],{"class":288},"\"https://mcr.microsoft.com\"",[236,586,310],{"class":246},[236,588,589,591,593,596],{"class":238,"line":299},[236,590,302],{"class":246},[236,592,262],{"class":242},[236,594,595],{"class":288},"\"Microsoft Container Registry\"",[236,597,310],{"class":246},[236,599,600,602,604],{"class":238,"line":313},[236,601,437],{"class":246},[236,603,262],{"class":242},[236,605,606],{"class":333},"48\n",[236,608,609],{"class":238,"line":324},[236,610,327],{"class":246},[236,612,613],{"class":238,"line":330},[236,614,615],{"class":295},"# Quay für das Red-Hat-Ökosystem client.create_upstream(\n",[236,617,618,620,622,624,626],{"class":238,"line":543},[236,619,400],{"class":246},[236,621,262],{"class":242},[236,623,349],{"class":246},[236,625,352],{"class":288},[236,627,409],{"class":246},[236,629,631,633,635,638],{"class":238,"line":630},10,[236,632,414],{"class":246},[236,634,262],{"class":242},[236,636,637],{"class":288},"\"https://quay.io\"",[236,639,310],{"class":246},[236,641,643,645,647,650],{"class":238,"line":642},11,[236,644,302],{"class":246},[236,646,262],{"class":242},[236,648,649],{"class":288},"\"Quay.io\"",[236,651,310],{"class":246},[236,653,655,657,659],{"class":238,"line":654},12,[236,656,437],{"class":246},[236,658,262],{"class":242},[236,660,442],{"class":333},[236,662,664],{"class":238,"line":663},13,[236,665,327],{"class":246},[224,667,669],{"id":668},"cicd-aktualisieren","CI/CD aktualisieren",[12,671,672,673,676],{},"Eine ",[130,674,675],{},".gitlab-ci.yml",", die über die Virtual Registry pullt:",[122,678,682],{"className":679,"code":680,"language":681,"meta":128,"style":128},"language-yaml shiki shiki-themes github-light","\nvariables:\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    # Authentifizierung bei GitLab – Upstream-Auth wird übernommen\n    - echo \"${CI_JOB_TOKEN}\" | docker login -u gitlab-ci-token --password-stdin gitlab.com\n  script:\n    # Alle Pulls laufen über die zentrale Virtual Registry\n    \n    # Offizielle Docker Hub Images (library/-Präfix erforderlich)\n    - docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/library/alpine:latest\n    \n    # Docker Hardened Images von dhi.io (kein Präfix nötig)\n    - docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/python:3.13\n    \n    # .NET von MCR\n    - docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/dotnet/sdk:8.0\n\n\n","yaml",[130,683,684,688,697,708,712,717,724,734,741,749,756,761,768,775,781,787,793,801,806,812,820,825,831],{"__ignoreMap":128},[236,685,686],{"class":238,"line":239},[236,687,385],{"emptyLinePlaceholder":384},[236,689,690,694],{"class":238,"line":256},[236,691,693],{"class":692},"shJU0","variables",[236,695,696],{"class":246},":\n",[236,698,699,702,705],{"class":238,"line":268},[236,700,701],{"class":692},"  VIRTUAL_REGISTRY_ID",[236,703,704],{"class":246},": ",[236,706,707],{"class":288},"\u003Cyour_virtual_registry_ID>\n",[236,709,710],{"class":238,"line":279},[236,711,385],{"emptyLinePlaceholder":384},[236,713,714],{"class":238,"line":299},[236,715,716],{"class":246},"  \n",[236,718,719,722],{"class":238,"line":313},[236,720,721],{"class":692},"build",[236,723,696],{"class":246},[236,725,726,729,731],{"class":238,"line":324},[236,727,728],{"class":692},"  image",[236,730,704],{"class":246},[236,732,733],{"class":288},"docker:24\n",[236,735,736,739],{"class":238,"line":330},[236,737,738],{"class":692},"  services",[236,740,696],{"class":246},[236,742,743,746],{"class":238,"line":543},[236,744,745],{"class":246},"    - ",[236,747,748],{"class":288},"docker:24-dind\n",[236,750,751,754],{"class":238,"line":630},[236,752,753],{"class":692},"  before_script",[236,755,696],{"class":246},[236,757,758],{"class":238,"line":642},[236,759,760],{"class":295},"    # Authentifizierung bei GitLab – Upstream-Auth wird übernommen\n",[236,762,763,765],{"class":238,"line":654},[236,764,745],{"class":246},[236,766,767],{"class":288},"echo \"${CI_JOB_TOKEN}\" | docker login -u gitlab-ci-token --password-stdin gitlab.com\n",[236,769,770,773],{"class":238,"line":663},[236,771,772],{"class":692},"  script",[236,774,696],{"class":246},[236,776,778],{"class":238,"line":777},14,[236,779,780],{"class":295},"    # Alle Pulls laufen über die zentrale Virtual Registry\n",[236,782,784],{"class":238,"line":783},15,[236,785,786],{"class":246},"    \n",[236,788,790],{"class":238,"line":789},16,[236,791,792],{"class":295},"    # Offizielle Docker Hub Images (library/-Präfix erforderlich)\n",[236,794,796,798],{"class":238,"line":795},17,[236,797,745],{"class":246},[236,799,800],{"class":288},"docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/library/alpine:latest\n",[236,802,804],{"class":238,"line":803},18,[236,805,786],{"class":246},[236,807,809],{"class":238,"line":808},19,[236,810,811],{"class":295},"    # Docker Hardened Images von dhi.io (kein Präfix nötig)\n",[236,813,815,817],{"class":238,"line":814},20,[236,816,745],{"class":246},[236,818,819],{"class":288},"docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/python:3.13\n",[236,821,823],{"class":238,"line":822},21,[236,824,786],{"class":246},[236,826,828],{"class":238,"line":827},22,[236,829,830],{"class":295},"    # .NET von MCR\n",[236,832,834,836],{"class":238,"line":833},23,[236,835,745],{"class":246},[236,837,838],{"class":288},"docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/dotnet/sdk:8.0\n",[224,840,842],{"id":841},"image-pfadformate","Image-Pfadformate",[12,844,845],{},"Verschiedene Registries verwenden unterschiedliche Pfadkonventionen:",[847,848,849,862],"table",{},[850,851,852],"thead",{},[853,854,855,859],"tr",{},[856,857,858],"th",{},"Registry",[856,860,861],{},"Beispiel-Pull-URL",[863,864,865,876,886,895],"tbody",{},[853,866,867,871],{},[868,869,870],"td",{},"Docker Hub (offiziell)",[868,872,873],{},[130,874,875],{},".../library/python:3.11-slim",[853,877,878,881],{},[868,879,880],{},"Docker Hardened Images (dhi.io)",[868,882,883],{},[130,884,885],{},".../python:3.13",[853,887,888,890],{},[868,889,91],{},[868,891,892],{},[130,893,894],{},".../dotnet/sdk:8.0",[853,896,897,899],{},[868,898,97],{},[868,900,901],{},[130,902,903],{},".../prometheus/prometheus:latest",[224,905,907],{"id":906},"funktionsprüfung","Funktionsprüfung",[12,909,910],{},"Nach einigen Pulls lässt sich der Cache überprüfen:",[122,912,914],{"className":230,"code":913,"language":232,"meta":128,"style":128},"\nupstreams = client.list_registry_upstreams(registry['id']) for upstream in upstreams:\n    entries = client.list_cache_entries(upstream['id'])\n    print(f\"{upstream['name']}: {len(entries)} cached entries\")\n\n\n",[130,915,916,920,947,962],{"__ignoreMap":128},[236,917,918],{"class":238,"line":239},[236,919,385],{"emptyLinePlaceholder":384},[236,921,922,925,927,930,932,935,938,941,944],{"class":238,"line":256},[236,923,924],{"class":246},"upstreams ",[236,926,262],{"class":242},[236,928,929],{"class":246}," client.list_registry_upstreams(registry[",[236,931,352],{"class":288},[236,933,934],{"class":246},"]) ",[236,936,937],{"class":242},"for",[236,939,940],{"class":246}," upstream ",[236,942,943],{"class":242},"in",[236,945,946],{"class":246}," upstreams:\n",[236,948,949,952,954,957,959],{"class":238,"line":268},[236,950,951],{"class":246},"    entries ",[236,953,262],{"class":242},[236,955,956],{"class":246}," client.list_cache_entries(upstream[",[236,958,352],{"class":288},[236,960,961],{"class":246},"])\n",[236,963,964,967,969,971,973,975,978,981,983,985,987,990,993,995,998],{"class":238,"line":279},[236,965,966],{"class":333},"    print",[236,968,337],{"class":246},[236,970,340],{"class":242},[236,972,361],{"class":288},[236,974,346],{"class":333},[236,976,977],{"class":246},"upstream[",[236,979,980],{"class":288},"'name'",[236,982,355],{"class":246},[236,984,358],{"class":333},[236,986,704],{"class":288},[236,988,989],{"class":333},"{len",[236,991,992],{"class":246},"(entries)",[236,994,358],{"class":333},[236,996,997],{"class":288}," cached entries\"",[236,999,327],{"class":246},[63,1001,1003],{"id":1002},"messergebnisse","Messergebnisse",[12,1005,1006],{},"Testergebnisse beim Pullen über die Virtual Registry:",[847,1008,1009,1022],{},[850,1010,1011],{},[853,1012,1013,1016,1019],{},[856,1014,1015],{},"Messgröße",[856,1017,1018],{},"Ohne Cache",[856,1020,1021],{},"Mit warmem Cache",[863,1023,1024,1035,1046],{},[853,1025,1026,1029,1032],{},[868,1027,1028],{},"Pull-Zeit (Alpine)",[868,1030,1031],{},"10,3 s",[868,1033,1034],{},"4,2 s",[853,1036,1037,1040,1043],{},[868,1038,1039],{},"Pull-Zeit (Python 3.13 DHI)",[868,1041,1042],{},"11,6 s",[868,1044,1045],{},"~4 s",[853,1047,1048,1051,1054],{},[868,1049,1050],{},"Netzwerk-Roundtrips zum Upstream",[868,1052,1053],{},"Jeder Pull",[868,1055,1056],{},"Nur Cache-Misses",[12,1058,1059],{},"Der erste Pull hat dieselbe Dauer – das Image muss vom Upstream geladen werden. Jeder weitere Pull innerhalb der Cache-Gültigkeitsdauer kommt direkt aus GitLab-Storage: kein Netzwerk-Hop zu Docker Hub, dhi.io, MCR oder einer anderen Registry.",[12,1061,1062],{},"Bei Teams mit vielen Pipeline-Jobs pro Tag summiert sich das zu einem messbaren Gewinn bei den Build-Laufzeiten.",[63,1064,1066],{"id":1065},"praktische-hinweise","Praktische Hinweise",[224,1068,1070],{"id":1069},"cache-gültigkeit","Cache-Gültigkeit",[12,1072,1073],{},"Der Standard sind 24 Stunden. Für sicherheitskritische Images, bei denen Patches schnell verfügbar sein sollen, empfiehlt sich ein kürzeres Intervall:",[122,1075,1077],{"className":230,"code":1076,"language":232,"meta":128,"style":128},"\nclient.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\n",[130,1078,1079,1083,1088,1100,1110,1120,1131,1142,1151],{"__ignoreMap":128},[236,1080,1081],{"class":238,"line":239},[236,1082,385],{"emptyLinePlaceholder":384},[236,1084,1085],{"class":238,"line":256},[236,1086,1087],{"class":246},"client.create_upstream(\n",[236,1089,1090,1092,1094,1096,1098],{"class":238,"line":268},[236,1091,400],{"class":282},[236,1093,262],{"class":242},[236,1095,349],{"class":246},[236,1097,352],{"class":288},[236,1099,409],{"class":246},[236,1101,1102,1104,1106,1108],{"class":238,"line":279},[236,1103,414],{"class":282},[236,1105,262],{"class":242},[236,1107,495],{"class":288},[236,1109,310],{"class":246},[236,1111,1112,1114,1116,1118],{"class":238,"line":299},[236,1113,302],{"class":282},[236,1115,262],{"class":242},[236,1117,506],{"class":288},[236,1119,310],{"class":246},[236,1121,1122,1124,1126,1129],{"class":238,"line":313},[236,1123,513],{"class":282},[236,1125,262],{"class":242},[236,1127,1128],{"class":288},"\"your-username\"",[236,1130,310],{"class":246},[236,1132,1133,1135,1137,1140],{"class":238,"line":324},[236,1134,525],{"class":282},[236,1136,262],{"class":242},[236,1138,1139],{"class":288},"\"your-token\"",[236,1141,310],{"class":246},[236,1143,1144,1146,1148],{"class":238,"line":330},[236,1145,437],{"class":282},[236,1147,262],{"class":242},[236,1149,1150],{"class":333},"12\n",[236,1152,1153],{"class":238,"line":543},[236,1154,327],{"class":246},[12,1156,1157],{},"Für stabile Images mit fixen Versions-Tags ist ein längeres Intervall problemlos.",[224,1159,1161],{"id":1160},"upstream-priorität","Upstream-Priorität",[12,1163,1164],{},"Upstreams werden der Reihe nach geprüft. Bei gleichnamigen Images in verschiedenen Registries gewinnt der erste passende Upstream.",[224,1166,1168],{"id":1167},"limits","Limits",[71,1170,1171,1174],{},[74,1172,1173],{},"Maximal 20 Virtual Registries pro Gruppe",[74,1175,1176],{},"Maximal 20 Upstreams pro Virtual Registry",[63,1178,1180],{"id":1179},"konfiguration-über-die-oberfläche","Konfiguration über die Oberfläche",[12,1182,1183,1184,1187],{},"Virtual Registries und Upstreams lassen sich auch direkt in der GitLab-Oberfläche einrichten – ohne API-Aufrufe. Unter ",[77,1185,1186],{},"Einstellungen > Pakete und Registries > Virtual Registry"," der jeweiligen Gruppe stehen folgende Optionen zur Verfügung:",[71,1189,1190,1193,1196,1199],{},[74,1191,1192],{},"Virtual Registries erstellen und verwalten",[74,1194,1195],{},"Upstreams hinzufügen, bearbeiten und neu anordnen",[74,1197,1198],{},"Cache anzeigen und verwalten",[74,1200,1201],{},"Überblick, welche Images abgerufen werden",[63,1203,1205],{"id":1204},"ausblick","Ausblick",[12,1207,1208],{},"In Entwicklung:",[71,1210,1211],{},[74,1212,1213,1216],{},[77,1214,1215],{},"Allow/Deny-Listen",": Regex-basierte Steuerung, welche Images aus welchen Upstreams abgerufen werden dürfen.",[12,1218,1219],{},"Container Virtual Registry befindet sich in der Beta-Phase. Die Funktion wird produktiv eingesetzt und wird weiterentwickelt – Feedback fließt direkt in die Priorisierung ein.",[63,1221,1223],{"id":1222},"feedback","Feedback",[12,1225,1226],{},"Wer als Plattformteam mit Registry-Wildwuchs zu kämpfen hat: Ich möchte verstehen, wie die aktuelle Situation aussieht.",[71,1228,1229,1232,1235],{},[74,1230,1231],{},"Wie viele Upstream-Registries werden verwaltet?",[74,1233,1234],{},"Wo liegt der größte Schmerzpunkt?",[74,1236,1237],{},"Würde ein solcher Ansatz helfen – und falls nicht: Was fehlt?",[12,1239,1240,1241,1246],{},"Erfahrungen und Rückmeldungen gerne im ",[53,1242,1245],{"href":1243,"rel":1244},"https://gitlab.com/gitlab-org/gitlab/-/work_items/589630",[],"Container Virtual Registry Feedback-Issue"," teilen.",[63,1248,1250],{"id":1249},"weiterführende-ressourcen","Weiterführende Ressourcen",[71,1252,1253,1260,1266],{},[74,1254,1255],{},[53,1256,1259],{"href":1257,"rel":1258},"https://about.gitlab.com/de-de/blog/new-gitlab-metrics-and-registry-features-help-reduce-ci-cd-bottlenecks/",[],"Neue GitLab-Metriken und Registry-Funktionen zur Optimierung von CI/CD-Pipelines",[74,1261,1262],{},[53,1263,1265],{"href":55,"rel":1264},[],"Container Virtual Registry – Dokumentation",[74,1267,1268],{},[53,1269,1272],{"href":1270,"rel":1271},"https://docs.gitlab.com/api/container_virtual_registries/",[],"Container Virtual Registry – API",[63,1274,1276],{"id":1275},"für-deutsche-unternehmen-könnte-dies-folgende-themen-betreffen","Für deutsche Unternehmen könnte dies folgende Themen betreffen",[12,1278,1279],{},"Teams, die sicherheitsgehärtete Base-Images mit vollständigen SBOMs und SLSA-Provenance einsetzen, haben möglicherweise auch Compliance-Überlegungen – beispielsweise in Bereichen wie Sicherheit der Software-Lieferkette, Nachvollziehbarkeit von Image-Abhängigkeiten und zentralem Audit-Trail.",[12,1281,1282],{},"Regulatorische Frameworks wie NIS2 und der Cyber Resilience Act adressieren ähnliche Themen rund um Software-Lieferketten und SBOM-Transparenz. Für konkrete Compliance-Anforderungen empfiehlt sich Rücksprache mit entsprechender Fachberatung.",[1284,1285,1286],"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":128,"searchDepth":256,"depth":256,"links":1288},[1289,1290,1291,1292,1301,1302,1307,1308,1309,1310,1311],{"id":65,"depth":256,"text":66},{"id":116,"depth":256,"text":117},{"id":143,"depth":256,"text":144},{"id":218,"depth":256,"text":219,"children":1293},[1294,1295,1296,1297,1298,1299,1300],{"id":226,"depth":268,"text":227},{"id":370,"depth":268,"text":371},{"id":449,"depth":268,"text":450},{"id":548,"depth":268,"text":549},{"id":668,"depth":268,"text":669},{"id":841,"depth":268,"text":842},{"id":906,"depth":268,"text":907},{"id":1002,"depth":256,"text":1003},{"id":1065,"depth":256,"text":1066,"children":1303},[1304,1305,1306],{"id":1069,"depth":268,"text":1070},{"id":1160,"depth":268,"text":1161},{"id":1167,"depth":268,"text":1168},{"id":1179,"depth":256,"text":1180},{"id":1204,"depth":256,"text":1205},{"id":1222,"depth":256,"text":1223},{"id":1249,"depth":256,"text":1250},{"id":1275,"depth":256,"text":1276},"engineering","2026-03-12","Mehrere Registries hinter einem Endpunkt – GitLab Container Virtual Registry mit Docker Hardened Images, Caching und Audit-Trail.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772111172/mwhgbjawn62kymfwrhle.png",{},"/de-de/blog/using-gitlab-container-virtual-registry-with-docker-hardened-images",{"config":1322,"title":1323,"description":1324},{"noIndex":1317},"Container Virtual Registry mit Docker Hardened Images","Mehrere Container-Registries zu einem Endpunkt konsolidieren: GitLab Container Virtual Registry mit Docker Hardened Images, Caching und Audit-Trail.","using-gitlab-container-virtual-registry-with-docker-hardened-images","de-de/blog/using-gitlab-container-virtual-registry-with-docker-hardened-images",[1328,1329,1330],"tutorial","product","features","BlogPost","Nhdkgg-DUFrGQeQo2KrbDw_yYTGFvZblJaDOEk2Phb8",{"logo":1334,"freeTrial":1339,"sales":1344,"login":1349,"items":1354,"search":1683,"minimal":1717,"duo":1735,"switchNav":1744,"pricingDeployment":1755},{"config":1335},{"href":1336,"dataGaName":1337,"dataGaLocation":1338},"/de-de/","gitlab logo","header",{"text":1340,"config":1341},"Kostenlose Testversion anfordern",{"href":1342,"dataGaName":1343,"dataGaLocation":1338},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":1345,"config":1346},"Demo anfordern",{"href":1347,"dataGaName":1348,"dataGaLocation":1338},"/de-de/sales/?contact-topic=request-demo","sales",{"text":1350,"config":1351},"Anmelden",{"href":1352,"dataGaName":1353,"dataGaLocation":1338},"https://gitlab.com/users/sign_in/","sign in",[1355,1384,1486,1491,1605,1661],{"text":1356,"config":1357,"menu":1359},"Plattform",{"dataNavLevelOne":1358},"platform",{"type":1360,"columns":1361},"cards",[1362,1368,1376],{"title":1356,"description":1363,"link":1364},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":1365,"config":1366},"Die Plattform erkunden",{"href":1367,"dataGaName":1358,"dataGaLocation":1338},"/de-de/platform/",{"title":1369,"description":1370,"link":1371},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":1372,"config":1373},"Lerne GitLab Duo kennen",{"href":1374,"dataGaName":1375,"dataGaLocation":1338},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1377,"description":1378,"link":1379},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":1380,"config":1381},"Mehr erfahren",{"href":1382,"dataGaName":1383,"dataGaLocation":1338},"/de-de/why-gitlab/","why gitlab",{"text":1385,"left":384,"config":1386,"menu":1388},"Produkt",{"dataNavLevelOne":1387},"solutions",{"type":1389,"link":1390,"columns":1394,"feature":1465},"lists",{"text":1391,"config":1392},"Alle Lösungen anzeigen",{"href":1393,"dataGaName":1387,"dataGaLocation":1338},"/de-de/solutions/",[1395,1420,1443],{"title":1396,"description":1397,"link":1398,"items":1403},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":1399},{"icon":1400,"href":1401,"dataGaName":1402,"dataGaLocation":1338},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[1404,1408,1411,1416],{"text":1405,"config":1406},"CI/CD",{"href":1407,"dataGaLocation":1338,"dataGaName":1405},"/de-de/solutions/continuous-integration/",{"text":1369,"config":1409},{"href":1374,"dataGaLocation":1338,"dataGaName":1410},"gitlab duo agent platform - product menu",{"text":1412,"config":1413},"Quellcodeverwaltung",{"href":1414,"dataGaLocation":1338,"dataGaName":1415},"/de-de/solutions/source-code-management/","Source Code Management",{"text":1417,"config":1418},"Automatische Softwarebereitstellung",{"href":1401,"dataGaLocation":1338,"dataGaName":1419},"Automated software delivery",{"title":1421,"description":1422,"link":1423,"items":1428},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":1424},{"href":1425,"dataGaName":1426,"dataGaLocation":1338,"icon":1427},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1429,1433,1438],{"text":1430,"config":1431},"Anwendungssicherheitstests",{"href":1425,"dataGaName":1432,"dataGaLocation":1338},"Application security testing",{"text":1434,"config":1435},"Schutz der Software-Lieferkette",{"href":1436,"dataGaLocation":1338,"dataGaName":1437},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":1439,"config":1440},"Software-Compliance",{"href":1441,"dataGaName":1442,"dataGaLocation":1338},"/de-de/solutions/software-compliance/","software compliance",{"title":1444,"link":1445,"items":1450},"Messung",{"config":1446},{"icon":1447,"href":1448,"dataGaName":1449,"dataGaLocation":1338},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[1451,1455,1460],{"text":1452,"config":1453},"Sichtbarkeit und Messung",{"href":1448,"dataGaLocation":1338,"dataGaName":1454},"Visibility and Measurement",{"text":1456,"config":1457},"Wertstrommanagement",{"href":1458,"dataGaLocation":1338,"dataGaName":1459},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":1461,"config":1462},"Analysen und Einblicke",{"href":1463,"dataGaLocation":1338,"dataGaName":1464},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":1466,"type":1389,"items":1467},"GitLab für",[1468,1474,1480],{"text":1469,"config":1470},"Enterprise",{"icon":1471,"href":1472,"dataGaLocation":1338,"dataGaName":1473},"Building","/de-de/enterprise/","enterprise",{"text":1475,"config":1476},"Kleinunternehmen",{"icon":1477,"href":1478,"dataGaLocation":1338,"dataGaName":1479},"Work","/de-de/small-business/","small business",{"text":1481,"config":1482},"Öffentlicher Sektor",{"icon":1483,"href":1484,"dataGaLocation":1338,"dataGaName":1485},"Organization","/de-de/solutions/public-sector/","public sector",{"text":1487,"config":1488},"Preise",{"href":1489,"dataGaName":1490,"dataGaLocation":1338,"dataNavLevelOne":1490},"/de-de/pricing/","pricing",{"text":1492,"config":1493,"menu":1495},"Ressourcen",{"dataNavLevelOne":1494},"resources",{"type":1389,"link":1496,"columns":1500,"feature":1594},{"text":1497,"config":1498},"Alle Ressourcen anzeigen",{"href":1499,"dataGaName":1494,"dataGaLocation":1338},"/de-de/resources/",[1501,1534,1561],{"title":1502,"items":1503},"Erste Schritte",[1504,1509,1514,1519,1524,1529],{"text":1505,"config":1506},"Installieren",{"href":1507,"dataGaName":1508,"dataGaLocation":1338},"/de-de/install/","install",{"text":1510,"config":1511},"Kurzanleitungen",{"href":1512,"dataGaName":1513,"dataGaLocation":1338},"/de-de/get-started/","quick setup checklists",{"text":1515,"config":1516},"Lernen",{"href":1517,"dataGaLocation":1338,"dataGaName":1518},"https://university.gitlab.com/","learn",{"text":1520,"config":1521},"Produktdokumentation",{"href":1522,"dataGaName":1523,"dataGaLocation":1338},"https://docs.gitlab.com/","product documentation",{"text":1525,"config":1526},"Best-Practice-Videos",{"href":1527,"dataGaName":1528,"dataGaLocation":1338},"/de-de/getting-started-videos/","best practice videos",{"text":1530,"config":1531},"Integrationen",{"href":1532,"dataGaName":1533,"dataGaLocation":1338},"/de-de/integrations/","integrations",{"title":1535,"items":1536},"Entdecken",[1537,1542,1547,1552,1556],{"text":1538,"config":1539},"Kundenerfolge",{"href":1540,"dataGaName":1541,"dataGaLocation":1338},"/de-de/customers/","customer success stories",{"text":1543,"config":1544},"Blog",{"href":1545,"dataGaName":1546,"dataGaLocation":1338},"/de-de/blog/","blog",{"text":1548,"config":1549},"Demo-Hub",{"href":1550,"dataGaName":1551,"dataGaLocation":1338},"/de-de/demo-hub/","demo hub",{"text":1553,"config":1554},"The Source",{"href":1555,"dataGaName":1546,"dataGaLocation":1338},"/de-de/the-source/",{"text":1557,"config":1558},"Remote",{"href":1559,"dataGaName":1560,"dataGaLocation":1338},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1562,"items":1563},"Vernetzen",[1564,1569,1574,1579,1584,1589],{"text":1565,"config":1566},"GitLab-Services",{"href":1567,"dataGaName":1568,"dataGaLocation":1338},"/de-de/services/","services",{"text":1570,"config":1571},"Beitragen",{"href":1572,"dataGaName":1573,"dataGaLocation":1338},"https://contributors.gitlab.com","contribute",{"text":1575,"config":1576},"Community",{"href":1577,"dataGaName":1578,"dataGaLocation":1338},"/community/","community",{"text":1580,"config":1581},"Forum",{"href":1582,"dataGaName":1583,"dataGaLocation":1338},"https://forum.gitlab.com/","forum",{"text":1585,"config":1586},"Veranstaltungen",{"href":1587,"dataGaName":1588,"dataGaLocation":1338},"/events/","events",{"text":1590,"config":1591},"Partner",{"href":1592,"dataGaName":1593,"dataGaLocation":1338},"/de-de/partners/","partners",{"config":1595,"title":1598,"text":1599,"link":1600},{"background":1596,"textColor":1597},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Neues bei GitLab","Über die neuesten Funktionen und Verbesserungen auf dem Laufenden bleiben.",{"text":1601,"config":1602},"Aktuelle Nachrichten",{"href":1603,"dataGaName":1604,"dataGaLocation":1338},"/de-de/whats-new/","whats new",{"text":1606,"config":1607,"menu":1609},"Unternehmen",{"dataNavLevelOne":1608},"company",{"type":1389,"columns":1610},[1611],{"items":1612},[1613,1618,1624,1626,1631,1636,1641,1646,1651,1656],{"text":1614,"config":1615},"Über",{"href":1616,"dataGaName":1617,"dataGaLocation":1338},"/de-de/company/","about",{"text":1619,"config":1620,"footerGa":1623},"Karriere",{"href":1621,"dataGaName":1622,"dataGaLocation":1338},"/jobs/","jobs",{"dataGaName":1622},{"text":1585,"config":1625},{"href":1587,"dataGaName":1588,"dataGaLocation":1338},{"text":1627,"config":1628},"Geschäftsführung",{"href":1629,"dataGaName":1630,"dataGaLocation":1338},"/company/team/e-group/","leadership",{"text":1632,"config":1633},"Handbuch",{"href":1634,"dataGaName":1635,"dataGaLocation":1338},"https://handbook.gitlab.com/","handbook",{"text":1637,"config":1638},"Investor Relations",{"href":1639,"dataGaName":1640,"dataGaLocation":1338},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1642,"config":1643},"Trust Center",{"href":1644,"dataGaName":1645,"dataGaLocation":1338},"/de-de/security/","trust center",{"text":1647,"config":1648},"AI Transparency Center",{"href":1649,"dataGaName":1650,"dataGaLocation":1338},"/de-de/ai-transparency-center/","ai transparency center",{"text":1652,"config":1653},"Newsletter",{"href":1654,"dataGaName":1655,"dataGaLocation":1338},"/company/contact/#contact-forms","newsletter",{"text":1657,"config":1658},"Presse",{"href":1659,"dataGaName":1660,"dataGaLocation":1338},"/press/","press",{"text":1662,"config":1663,"menu":1664},"Kontakt",{"dataNavLevelOne":1608},{"type":1389,"columns":1665},[1666],{"items":1667},[1668,1673,1678],{"text":1669,"config":1670},"Vertrieb kontaktieren",{"href":1671,"dataGaName":1672,"dataGaLocation":1338},"/de-de/sales/","talk to sales",{"text":1674,"config":1675},"Support-Portal",{"href":1676,"dataGaName":1677,"dataGaLocation":1338},"https://support.gitlab.com/hc/en-us","support portal",{"text":1679,"config":1680},"Kundenportal",{"href":1681,"dataGaName":1682,"dataGaLocation":1338},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1684,"login":1685,"suggestions":1692},"Schließen",{"text":1686,"link":1687},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":1688,"config":1689},"gitlab.com",{"href":1352,"dataGaName":1690,"dataGaLocation":1691},"search login","search",{"text":1693,"default":1694},"Vorschläge",[1695,1697,1702,1704,1709,1714],{"text":1369,"config":1696},{"href":1374,"dataGaName":1369,"dataGaLocation":1691},{"text":1698,"config":1699},"Codevorschläge (KI)",{"href":1700,"dataGaName":1701,"dataGaLocation":1691},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1405,"config":1703},{"href":1407,"dataGaName":1405,"dataGaLocation":1691},{"text":1705,"config":1706},"GitLab auf AWS",{"href":1707,"dataGaName":1708,"dataGaLocation":1691},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":1710,"config":1711},"GitLab auf Google Cloud",{"href":1712,"dataGaName":1713,"dataGaLocation":1691},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1377,"config":1715},{"href":1382,"dataGaName":1716,"dataGaLocation":1691},"Why GitLab?",{"freeTrial":1718,"mobileIcon":1723,"desktopIcon":1728,"secondaryButton":1731},{"text":1719,"config":1720},"Kostenlos testen",{"href":1721,"dataGaName":1343,"dataGaLocation":1722},"https://gitlab.com/-/trials/new/","nav",{"altText":1724,"config":1725},"GitLab-Symbol",{"src":1726,"dataGaName":1727,"dataGaLocation":1722},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1724,"config":1729},{"src":1730,"dataGaName":1727,"dataGaLocation":1722},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1502,"config":1732},{"href":1733,"dataGaName":1734,"dataGaLocation":1722},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":1736,"mobileIcon":1740,"desktopIcon":1742},{"text":1737,"config":1738},"Mehr über GitLab Duo erfahren",{"href":1374,"dataGaName":1739,"dataGaLocation":1722},"gitlab duo",{"altText":1724,"config":1741},{"src":1726,"dataGaName":1727,"dataGaLocation":1722},{"altText":1724,"config":1743},{"src":1730,"dataGaName":1727,"dataGaLocation":1722},{"button":1745,"mobileIcon":1750,"desktopIcon":1752},{"text":1746,"config":1747},"/Option",{"href":1748,"dataGaName":1749,"dataGaLocation":1722},"#contact","switch",{"altText":1724,"config":1751},{"src":1726,"dataGaName":1727,"dataGaLocation":1722},{"altText":1724,"config":1753},{"src":1754,"dataGaName":1727,"dataGaLocation":1722},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1756,"mobileIcon":1761,"desktopIcon":1763},{"text":1757,"config":1758},"Zurück zur Preisübersicht",{"href":1489,"dataGaName":1759,"dataGaLocation":1722,"icon":1760},"back to pricing","GoBack",{"altText":1724,"config":1762},{"src":1726,"dataGaName":1727,"dataGaLocation":1722},{"altText":1724,"config":1764},{"src":1730,"dataGaName":1727,"dataGaLocation":1722},{"title":1766,"button":1767,"config":1771},"GitLab Orbit ist da: die Kontextebene für KI-Agenten",{"text":1380,"config":1768},{"href":1769,"dataGaName":1770,"dataGaLocation":1338},"/de-de/gitlab-orbit/","orbit",{"layout":1772,"disabled":1317},"release",{"data":1774},{"text":1775,"source":1776,"edit":1782,"contribute":1787,"config":1792,"items":1797,"minimal":2003},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":1777,"config":1778},"Quelltext der Seite anzeigen",{"href":1779,"dataGaName":1780,"dataGaLocation":1781},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1783,"config":1784},"Diese Seite bearbeiten",{"href":1785,"dataGaName":1786,"dataGaLocation":1781},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1788,"config":1789},"Beteilige dich",{"href":1790,"dataGaName":1791,"dataGaLocation":1781},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1793,"facebook":1794,"youtube":1795,"linkedin":1796},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1798,1843,1896,1938,1970],{"title":1487,"links":1799,"subMenu":1814},[1800,1804,1809],{"text":1801,"config":1802},"Tarife anzeigen",{"href":1489,"dataGaName":1803,"dataGaLocation":1781},"view plans",{"text":1805,"config":1806},"Vorteile von Premium",{"href":1807,"dataGaName":1808,"dataGaLocation":1781},"/de-de/pricing/premium/","why premium",{"text":1810,"config":1811},"Vorteile von Ultimate",{"href":1812,"dataGaName":1813,"dataGaLocation":1781},"/de-de/pricing/ultimate/","why ultimate",[1815],{"title":1662,"links":1816},[1817,1819,1821,1823,1828,1833,1838],{"text":1669,"config":1818},{"href":1671,"dataGaName":1348,"dataGaLocation":1781},{"text":1674,"config":1820},{"href":1676,"dataGaName":1677,"dataGaLocation":1781},{"text":1679,"config":1822},{"href":1681,"dataGaName":1682,"dataGaLocation":1781},{"text":1824,"config":1825},"Status",{"href":1826,"dataGaName":1827,"dataGaLocation":1781},"https://status.gitlab.com/","status",{"text":1829,"config":1830},"Nutzungsbedingungen",{"href":1831,"dataGaName":1832,"dataGaLocation":1781},"/terms/","terms of use",{"text":1834,"config":1835},"Datenschutzerklärung",{"href":1836,"dataGaName":1837,"dataGaLocation":1781},"/de-de/privacy/","privacy statement",{"text":1839,"config":1840},"Cookie-Einstellungen",{"dataGaName":1841,"dataGaLocation":1781,"id":1842,"isOneTrustButton":384},"cookie preferences","ot-sdk-btn",{"title":1385,"links":1844,"subMenu":1853},[1845,1849],{"text":1846,"config":1847},"DevSecOps-Plattform",{"href":1367,"dataGaName":1848,"dataGaLocation":1781},"devsecops platform",{"text":1850,"config":1851},"KI-unterstützte Entwicklung",{"href":1374,"dataGaName":1852,"dataGaLocation":1781},"ai-assisted development",[1854],{"title":1855,"links":1856},"Themen",[1857,1861,1866,1871,1876,1881,1886,1891],{"text":1405,"config":1858},{"href":1859,"dataGaName":1860,"dataGaLocation":1781},"/de-de/topics/ci-cd/","cicd",{"text":1862,"config":1863},"GitOps",{"href":1864,"dataGaName":1865,"dataGaLocation":1781},"/de-de/topics/gitops/","gitops",{"text":1867,"config":1868},"DevOps",{"href":1869,"dataGaName":1870,"dataGaLocation":1781},"/de-de/topics/devops/","devops",{"text":1872,"config":1873},"Versionskontrolle",{"href":1874,"dataGaName":1875,"dataGaLocation":1781},"/de-de/topics/version-control/","version control",{"text":1877,"config":1878},"DevSecOps",{"href":1879,"dataGaName":1880,"dataGaLocation":1781},"/de-de/topics/devsecops/","devsecops",{"text":1882,"config":1883},"Cloud-nativ",{"href":1884,"dataGaName":1885,"dataGaLocation":1781},"/de-de/topics/cloud-native/","cloud native",{"text":1887,"config":1888},"KI für das Programmieren",{"href":1889,"dataGaName":1890,"dataGaLocation":1781},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":1892,"config":1893},"Agentische KI",{"href":1894,"dataGaName":1895,"dataGaLocation":1781},"/de-de/topics/agentic-ai/","agentic ai",{"title":1897,"links":1898},"Lösungen",[1899,1902,1904,1909,1913,1916,1919,1922,1924,1926,1928,1933],{"text":1430,"config":1900},{"href":1425,"dataGaName":1901,"dataGaLocation":1781},"Application Security Testing",{"text":1417,"config":1903},{"href":1401,"dataGaName":1402,"dataGaLocation":1781},{"text":1905,"config":1906},"Agile Entwicklung",{"href":1907,"dataGaName":1908,"dataGaLocation":1781},"/de-de/solutions/agile-delivery/","agile delivery",{"text":1910,"config":1911},"SCM",{"href":1414,"dataGaName":1912,"dataGaLocation":1781},"source code management",{"text":1405,"config":1914},{"href":1407,"dataGaName":1915,"dataGaLocation":1781},"continuous integration & delivery",{"text":1456,"config":1917},{"href":1458,"dataGaName":1918,"dataGaLocation":1781},"value stream management",{"text":1862,"config":1920},{"href":1921,"dataGaName":1865,"dataGaLocation":1781},"/de-de/solutions/gitops/",{"text":1469,"config":1923},{"href":1472,"dataGaName":1473,"dataGaLocation":1781},{"text":1475,"config":1925},{"href":1478,"dataGaName":1479,"dataGaLocation":1781},{"text":1481,"config":1927},{"href":1484,"dataGaName":1485,"dataGaLocation":1781},{"text":1929,"config":1930},"Bildungswesen",{"href":1931,"dataGaName":1932,"dataGaLocation":1781},"/de-de/solutions/education/","education",{"text":1934,"config":1935},"Finanzdienstleistungen",{"href":1936,"dataGaName":1937,"dataGaLocation":1781},"/de-de/solutions/finance/","financial services",{"title":1492,"links":1939},[1940,1942,1944,1946,1949,1951,1954,1956,1958,1960,1962,1964,1966,1968],{"text":1505,"config":1941},{"href":1507,"dataGaName":1508,"dataGaLocation":1781},{"text":1510,"config":1943},{"href":1512,"dataGaName":1513,"dataGaLocation":1781},{"text":1515,"config":1945},{"href":1517,"dataGaName":1518,"dataGaLocation":1781},{"text":1520,"config":1947},{"href":1522,"dataGaName":1948,"dataGaLocation":1781},"docs",{"text":1543,"config":1950},{"href":1545,"dataGaName":1546,"dataGaLocation":1781},{"text":1952,"config":1953},"Neuerungen",{"href":1603,"dataGaName":1604,"dataGaLocation":1781},{"text":1538,"config":1955},{"href":1540,"dataGaName":1541,"dataGaLocation":1781},{"text":1557,"config":1957},{"href":1559,"dataGaName":1560,"dataGaLocation":1781},{"text":1565,"config":1959},{"href":1567,"dataGaName":1568,"dataGaLocation":1781},{"text":1570,"config":1961},{"href":1572,"dataGaName":1573,"dataGaLocation":1781},{"text":1575,"config":1963},{"href":1577,"dataGaName":1578,"dataGaLocation":1781},{"text":1580,"config":1965},{"href":1582,"dataGaName":1583,"dataGaLocation":1781},{"text":1585,"config":1967},{"href":1587,"dataGaName":1588,"dataGaLocation":1781},{"text":1590,"config":1969},{"href":1592,"dataGaName":1593,"dataGaLocation":1781},{"title":1606,"links":1971},[1972,1974,1976,1978,1980,1982,1987,1992,1994,1996,1998],{"text":1614,"config":1973},{"href":1616,"dataGaName":1608,"dataGaLocation":1781},{"text":1619,"config":1975},{"href":1621,"dataGaName":1622,"dataGaLocation":1781},{"text":1627,"config":1977},{"href":1629,"dataGaName":1630,"dataGaLocation":1781},{"text":1632,"config":1979},{"href":1634,"dataGaName":1635,"dataGaLocation":1781},{"text":1637,"config":1981},{"href":1639,"dataGaName":1640,"dataGaLocation":1781},{"text":1983,"config":1984},"Nachhaltigkeit",{"href":1985,"dataGaName":1986,"dataGaLocation":1781},"/sustainability/","Sustainability",{"text":1988,"config":1989},"Vielfalt, Inklusion und Zugehörigkeit",{"href":1990,"dataGaName":1991,"dataGaLocation":1781},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1642,"config":1993},{"href":1644,"dataGaName":1645,"dataGaLocation":1781},{"text":1652,"config":1995},{"href":1654,"dataGaName":1655,"dataGaLocation":1781},{"text":1657,"config":1997},{"href":1659,"dataGaName":1660,"dataGaLocation":1781},{"text":1999,"config":2000},"Transparenzerklärung zu moderner Sklaverei",{"href":2001,"dataGaName":2002,"dataGaLocation":1781},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2004},[2005,2008,2011],{"text":2006,"config":2007},"Terms",{"href":1831,"dataGaName":1832,"dataGaLocation":1781},{"text":2009,"config":2010},"Cookies",{"dataGaName":1841,"dataGaLocation":1781,"id":1842,"isOneTrustButton":384},{"text":2012,"config":2013},"Datenschutz",{"href":1836,"dataGaName":1837,"dataGaLocation":1781},[2015],{"id":2016,"title":7,"body":1316,"config":2017,"content":2019,"description":1316,"extension":2023,"meta":2024,"navigation":384,"path":2025,"seo":2026,"stem":2027,"__hash__":2028},"blogAuthors/en-us/blog/authors/tim-rizzi.yml",{"template":2018},"BlogAuthor",{"name":7,"config":2020},{"headshot":2021,"ctfId":2022},"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",[2030,2039,2047],{"title":2031,"description":2032,"heroImage":2033,"category":1312,"date":2034,"authors":2035,"slug":2038,"externalUrl":1316},"Confidential AI für GitLab Self-Hosted","KI-Coding-Agenten in GitLab Duo nutzen, ohne dass Quellcode eine hardwareverschlüsselte Grenze verlässt, und ohne eigene GPUs zu betreiben.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[2036,2037],"Mathias Ewald","Martin Paloncy","confidential-ai-for-gitlab-self-hosted",{"title":2040,"description":2041,"heroImage":2042,"category":1312,"date":2043,"authors":2044,"slug":2046,"externalUrl":1316},"Green DevOps: Warum CO2-Messung in die CI/CD-Pipeline gehört","Jeder Pipeline-Lauf verbraucht Energie, die nirgends sichtbar wird. Eco CI und Carmen machen diesen CO2-Ausstoß sichtbar, direkt in den Pipelines.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[2045],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":2048,"description":2049,"heroImage":2050,"category":1312,"date":2051,"authors":2052,"slug":2054,"externalUrl":1316},"Was ist CI/CD? Bedeutung, Vorteile und Tool-Auswahl","Was CI/CD bedeutet, welche Vorteile die Einführung bringt und worauf bei der Tool-Auswahl zu achten ist.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663328/Blog/Hero%20Images/cicd3.jpg","2026-06-22",[2053],"GitLab","what-is-ci-cd",{"promotions":2056},[2057,2071,2082,2094],{"id":2058,"categories":2059,"header":2061,"text":2062,"button":2063,"image":2068},"ai-modernization",[2060],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":2064,"config":2065},"Ermittle deinen KI-Reifegrad",{"href":2066,"dataGaName":2067,"dataGaLocation":1546},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":2069},{"src":2070},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2072,"categories":2073,"header":2074,"text":2062,"button":2075,"image":2079},"devops-modernization",[1329,1880],"Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":2076,"config":2077},"Ermittle deinen DevOps-Reifegrad",{"href":2078,"dataGaName":2067,"dataGaLocation":1546},"/de-de/assessments/devops-modernization-assessment/",{"config":2080},{"src":2081},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2083,"categories":2084,"header":2086,"text":2062,"button":2087,"image":2091},"security-modernization",[2085],"security","Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":2088,"config":2089},"Ermittle deinen Sicherheitsreifegrad",{"href":2090,"dataGaName":2067,"dataGaLocation":1546},"/de-de/assessments/security-modernization-assessment/",{"config":2092},{"src":2093},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2095,"paths":2096,"header":2099,"text":2100,"button":2101,"image":2106},"github-azure-migration",[2097,2098],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Ist dein Team bereit für den Umzug von GitHub nach Azure?","GitHub stellt bereits auf Azure um. Finde heraus, was das für dich bedeutet.",{"text":2102,"config":2103},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":2104,"dataGaName":2105,"dataGaLocation":1546},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2107},{"src":2081},{"header":2109,"blurb":2110,"button":2111,"secondaryButton":2116},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":2112,"config":2113},"Kostenlosen Test starten",{"href":2114,"dataGaName":1343,"dataGaLocation":2115},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":1669,"config":2117},{"href":1671,"dataGaName":1348,"dataGaLocation":2115},1786803757085]