[{"data":1,"prerenderedAt":1416},["ShallowReactive",2],{"/blog/docker-in-docker-with-docker-19-dot-03":3,"navigation-en-us":636,"banner-en-us":1062,"footer-en-us":1072,"blog-post-authors-en-us-Steve Azzopardi":1317,"blog-related-posts-en-us-docker-in-docker-with-docker-19-dot-03":1330,"blog-promotions-en-us":1352,"next-steps-en-us":1406},{"id":4,"title":5,"authors":6,"body":8,"category":616,"date":617,"description":618,"extension":619,"externalUrl":620,"faq":620,"featured":621,"heroImage":622,"meta":623,"navigation":328,"path":624,"seo":625,"slug":629,"stem":630,"tags":631,"template":634,"updatedDate":620,"__hash__":635},"blogPosts/en-us/blog/docker-in-docker-with-docker-19-dot-03.md","Update: Changes to GitLab CI/CD and Docker in Docker with Docker 19.03",[7],"Steve Azzopardi",{"type":9,"value":10,"toc":612},"minimark",[11,22,46,52,58,114,117,133,136,146,151,167,170,292,295,305,470,474,484,493,600,608],[12,13,14,15,21],"p",{},"Last week Docker released a new version,\n",[16,17,20],"a",{"href":18,"rel":19},"https://docs.docker.com/engine/release-notes/#19030",[],"19.03",", which\nbrings a few exciting features with it.",[12,23,24,25,30,31,39,40,45],{},"One of the features affects GitLab CI/CD when using the ",[16,26,29],{"href":27,"rel":28},"https://docs.gitlab.com/ci/docker/using_docker_build/#use-docker-in-docker-executor",[],"Docker in Docker\nworkflow",".\nAs of version 19.03, ",[16,32,35],{"href":33,"rel":34},"https://hub.docker.com/_/docker",[],[36,37,38],"code",{},"docker:dind","\nwill automatically generate TLS certificates and require using them for\ncommunication. This is from ",[16,41,44],{"href":42,"rel":43},"https://hub.docker.com/_/docker#tls",[],"Docker's official\ndocumentation",":",[47,48,49],"blockquote",{},[12,50,51],{},"Starting in 18.09+, the dind variants of this image will automatically generate TLS certificates in the directory specified by the DOCKER_TLS_CERTDIR environment variable.\nWarning: in 18.09, this behavior is disabled by default (for compatibility). If you use --network=host, shared network namespaces (as in Kubernetes pods), or otherwise have network access to the container (including containers started within the dind instance via their gateway interface), this is a potential security issue (which can lead to access to the host system, for example). It is recommended to enable TLS by setting the variable to an appropriate value (-e DOCKER_TLS_CERTDIR=/certs or similar). In 19.03+, this behavior is enabled by default.",[12,53,54,55,57],{},"When you upgrade to 19.03 (which is done automatically if using\n",[36,56,38],{},") you may start seeing an issue like:",[59,60,65],"pre",{"className":61,"code":62,"language":63,"meta":64,"style":64},"language-shell shiki shiki-themes github-light","docker: Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?.\n","shell","",[36,66,67],{"__ignoreMap":64},[68,69,72,76,80,83,86,89,92,95,98,101,104,106,109,111],"span",{"class":70,"line":71},"line",1,[68,73,75],{"class":74},"s7eDp","docker:",[68,77,79],{"class":78},"sYBdl"," Cannot",[68,81,82],{"class":78}," connect",[68,84,85],{"class":78}," to",[68,87,88],{"class":78}," the",[68,90,91],{"class":78}," Docker",[68,93,94],{"class":78}," daemon",[68,96,97],{"class":78}," at",[68,99,100],{"class":78}," tcp://docker:2375.",[68,102,103],{"class":78}," Is",[68,105,88],{"class":78},[68,107,108],{"class":78}," docker",[68,110,94],{"class":78},[68,112,113],{"class":78}," running?.\n",[12,115,116],{},"To fix the problem above you have two options:",[118,119,120,130],"ol",{},[121,122,123,124,129],"li",{},"Configure ",[16,125,128],{"href":126,"rel":127},"https://docs.gitlab.com/runner/",[],"GitLab Runner"," to use TLS.",[121,131,132],{},"Explicitly turn off TLS.",[12,134,135],{},"The shared Runners available on GitLab.com support both workflows, which\nare described in detail below.",[12,137,138,139,142,143,145],{},"You may notice that we are now also suggesting a specific version such as\n",[36,140,141],{},"docker:19.03.0-dind"," and not ",[36,144,38],{},". This is to help prevent users'\njobs randomly failing when a new update comes out.",[147,148,150],"h2",{"id":149},"configure-tls","Configure TLS",[12,152,153,154,156,157,162,163,166],{},"Since the service ",[36,155,38],{}," will create the certificates, we need to\nhave the certificate shared between the service and the job container.\nTo do this we have to add a mount inside of the\n",[16,158,161],{"href":159,"rel":160},"https://docs.gitlab.com/runner/configuration/advanced-configuration/#the-runnersdocker-section",[],"volumes","\nunder the ",[36,164,165],{},"[runners.docker]"," section.",[12,168,169],{},"For example:",[59,171,175],{"className":172,"code":173,"language":174,"meta":64,"style":64},"language-toml shiki shiki-themes github-light","[[runners]]\n  name = \"My Docker Runner\"\n  url = \"http://gitlab.com\"\n  token = \"\"\n  executor = \"docker\"\n  [runners.custom_build_dir]\n  [runners.docker]\n    privileged = true\n    volumes = [\"/certs/client\", \"/cache\"]\n    shm_size = 0\n\n","toml",[36,176,177,189,198,207,216,225,242,256,266,283],{"__ignoreMap":64},[68,178,179,183,186],{"class":70,"line":71},[68,180,182],{"class":181},"sgsFI","[[",[68,184,185],{"class":74},"runners",[68,187,188],{"class":181},"]]\n",[68,190,192,195],{"class":70,"line":191},2,[68,193,194],{"class":181},"  name = ",[68,196,197],{"class":78},"\"My Docker Runner\"\n",[68,199,201,204],{"class":70,"line":200},3,[68,202,203],{"class":181},"  url = ",[68,205,206],{"class":78},"\"http://gitlab.com\"\n",[68,208,210,213],{"class":70,"line":209},4,[68,211,212],{"class":181},"  token = ",[68,214,215],{"class":78},"\"\"\n",[68,217,219,222],{"class":70,"line":218},5,[68,220,221],{"class":181},"  executor = ",[68,223,224],{"class":78},"\"docker\"\n",[68,226,228,231,233,236,239],{"class":70,"line":227},6,[68,229,230],{"class":181},"  [",[68,232,185],{"class":74},[68,234,235],{"class":181},".",[68,237,238],{"class":74},"custom_build_dir",[68,240,241],{"class":181},"]\n",[68,243,245,247,249,251,254],{"class":70,"line":244},7,[68,246,230],{"class":181},[68,248,185],{"class":74},[68,250,235],{"class":181},[68,252,253],{"class":74},"docker",[68,255,241],{"class":181},[68,257,259,262],{"class":70,"line":258},8,[68,260,261],{"class":181},"    privileged = ",[68,263,265],{"class":264},"sYu0t","true\n",[68,267,269,272,275,278,281],{"class":70,"line":268},9,[68,270,271],{"class":181},"    volumes = [",[68,273,274],{"class":78},"\"/certs/client\"",[68,276,277],{"class":181},", ",[68,279,280],{"class":78},"\"/cache\"",[68,282,241],{"class":181},[68,284,286,289],{"class":70,"line":285},10,[68,287,288],{"class":181},"    shm_size = ",[68,290,291],{"class":264},"0\n",[12,293,294],{},"If you're a GitLab.com user, we've already done the config change above for you on the\nShared Runners.",[12,296,297,298,301,302],{},"Also, update ",[36,299,300],{},".gitlab-ci.yml"," accordingly to specify the\n",[36,303,304],{},"DOCKER_TLS_CERTDIR",[59,306,310],{"className":307,"code":308,"language":309,"meta":64,"style":64},"language-yml shiki shiki-themes github-light","image: docker:19.03.0\n\nvariables:\n  DOCKER_DRIVER: overlay2\n  # Create the certificates inside this directory for both the server\n  # and client. The certificates used by the client will be created in\n  # /certs/client so we only need to share this directory with the\n  # volume mount in `config.toml`.\n  DOCKER_TLS_CERTDIR: \"/certs\"\n\nservices:\n  - docker:19.03.0-dind\n\nbefore_script:\n  - docker info\n\nbuild:\n  stage: build\n  script:\n    - docker build -t my-docker-image .\n    - docker run my-docker-image /script/to/run/tests\n\n","yml",[36,311,312,324,330,338,348,354,359,364,369,379,383,391,400,405,413,421,426,434,445,453,462],{"__ignoreMap":64},[68,313,314,318,321],{"class":70,"line":71},[68,315,317],{"class":316},"shJU0","image",[68,319,320],{"class":181},": ",[68,322,323],{"class":78},"docker:19.03.0\n",[68,325,326],{"class":70,"line":191},[68,327,329],{"emptyLinePlaceholder":328},true,"\n",[68,331,332,335],{"class":70,"line":200},[68,333,334],{"class":316},"variables",[68,336,337],{"class":181},":\n",[68,339,340,343,345],{"class":70,"line":209},[68,341,342],{"class":316},"  DOCKER_DRIVER",[68,344,320],{"class":181},[68,346,347],{"class":78},"overlay2\n",[68,349,350],{"class":70,"line":218},[68,351,353],{"class":352},"sAwPA","  # Create the certificates inside this directory for both the server\n",[68,355,356],{"class":70,"line":227},[68,357,358],{"class":352},"  # and client. The certificates used by the client will be created in\n",[68,360,361],{"class":70,"line":244},[68,362,363],{"class":352},"  # /certs/client so we only need to share this directory with the\n",[68,365,366],{"class":70,"line":258},[68,367,368],{"class":352},"  # volume mount in `config.toml`.\n",[68,370,371,374,376],{"class":70,"line":268},[68,372,373],{"class":316},"  DOCKER_TLS_CERTDIR",[68,375,320],{"class":181},[68,377,378],{"class":78},"\"/certs\"\n",[68,380,381],{"class":70,"line":285},[68,382,329],{"emptyLinePlaceholder":328},[68,384,386,389],{"class":70,"line":385},11,[68,387,388],{"class":316},"services",[68,390,337],{"class":181},[68,392,394,397],{"class":70,"line":393},12,[68,395,396],{"class":181},"  - ",[68,398,399],{"class":78},"docker:19.03.0-dind\n",[68,401,403],{"class":70,"line":402},13,[68,404,329],{"emptyLinePlaceholder":328},[68,406,408,411],{"class":70,"line":407},14,[68,409,410],{"class":316},"before_script",[68,412,337],{"class":181},[68,414,416,418],{"class":70,"line":415},15,[68,417,396],{"class":181},[68,419,420],{"class":78},"docker info\n",[68,422,424],{"class":70,"line":423},16,[68,425,329],{"emptyLinePlaceholder":328},[68,427,429,432],{"class":70,"line":428},17,[68,430,431],{"class":316},"build",[68,433,337],{"class":181},[68,435,437,440,442],{"class":70,"line":436},18,[68,438,439],{"class":316},"  stage",[68,441,320],{"class":181},[68,443,444],{"class":78},"build\n",[68,446,448,451],{"class":70,"line":447},19,[68,449,450],{"class":316},"  script",[68,452,337],{"class":181},[68,454,456,459],{"class":70,"line":455},20,[68,457,458],{"class":181},"    - ",[68,460,461],{"class":78},"docker build -t my-docker-image .\n",[68,463,465,467],{"class":70,"line":464},21,[68,466,458],{"class":181},[68,468,469],{"class":78},"docker run my-docker-image /script/to/run/tests\n",[147,471,473],{"id":472},"disable-tls","Disable TLS",[12,475,476,477,480,481,483],{},"You might not have access to update the volume mounting inside of the\n",[36,478,479],{},"config.toml",", so the only option is to disable TLS. You can do this by\nsetting the environment variable ",[36,482,304],{}," to an empty value.",[12,485,486,487,492],{},"For GitLab.com Shared Runners users this is done already using the\n",[16,488,491],{"href":489,"rel":490},"https://docs.gitlab.com/runner/configuration/advanced-configuration/#the-runners-section",[],"environment settings",",\nwhich works the same way.",[59,494,496],{"className":307,"code":495,"language":309,"meta":64,"style":64},"image: docker:19.03.0\n\nvariables:\n  DOCKER_DRIVER: overlay2\n  DOCKER_TLS_CERTDIR: \"\"\n\nservices:\n  - docker:19.03.0-dind\n\nbefore_script:\n  - docker info\n\nbuild:\n  stage: build\n  script:\n    - docker build -t my-docker-image .\n    - docker run my-docker-image /script/to/run/tests\n\n",[36,497,498,506,510,516,524,532,536,542,548,552,558,564,568,574,582,588,594],{"__ignoreMap":64},[68,499,500,502,504],{"class":70,"line":71},[68,501,317],{"class":316},[68,503,320],{"class":181},[68,505,323],{"class":78},[68,507,508],{"class":70,"line":191},[68,509,329],{"emptyLinePlaceholder":328},[68,511,512,514],{"class":70,"line":200},[68,513,334],{"class":316},[68,515,337],{"class":181},[68,517,518,520,522],{"class":70,"line":209},[68,519,342],{"class":316},[68,521,320],{"class":181},[68,523,347],{"class":78},[68,525,526,528,530],{"class":70,"line":218},[68,527,373],{"class":316},[68,529,320],{"class":181},[68,531,215],{"class":78},[68,533,534],{"class":70,"line":227},[68,535,329],{"emptyLinePlaceholder":328},[68,537,538,540],{"class":70,"line":244},[68,539,388],{"class":316},[68,541,337],{"class":181},[68,543,544,546],{"class":70,"line":258},[68,545,396],{"class":181},[68,547,399],{"class":78},[68,549,550],{"class":70,"line":268},[68,551,329],{"emptyLinePlaceholder":328},[68,553,554,556],{"class":70,"line":285},[68,555,410],{"class":316},[68,557,337],{"class":181},[68,559,560,562],{"class":70,"line":385},[68,561,396],{"class":181},[68,563,420],{"class":78},[68,565,566],{"class":70,"line":393},[68,567,329],{"emptyLinePlaceholder":328},[68,569,570,572],{"class":70,"line":402},[68,571,431],{"class":316},[68,573,337],{"class":181},[68,575,576,578,580],{"class":70,"line":407},[68,577,439],{"class":316},[68,579,320],{"class":181},[68,581,444],{"class":78},[68,583,584,586],{"class":70,"line":415},[68,585,450],{"class":316},[68,587,337],{"class":181},[68,589,590,592],{"class":70,"line":423},[68,591,458],{"class":181},[68,593,461],{"class":78},[68,595,596,598],{"class":70,"line":428},[68,597,458],{"class":181},[68,599,469],{"class":78},[12,601,602,603,235],{},"We would like to thank the rest of the community with all the feedback\nand help throughout\n",[16,604,607],{"href":605,"rel":606},"https://gitlab.com/gitlab-org/gitlab-runner/issues/4501",[],"#4501",[609,610,611],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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 .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":64,"searchDepth":191,"depth":191,"links":613},[614,615],{"id":149,"depth":191,"text":150},{"id":472,"depth":191,"text":473},"news","2019-07-31","If you are using the Docker in Docker workflow you may need to enable TLS or explicitly turn it off.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663397/Blog/Hero%20Images/logoforblogpost.jpg",{},"/en-us/blog/docker-in-docker-with-docker-19-dot-03",{"title":5,"description":618,"ogTitle":5,"ogDescription":618,"noIndex":621,"ogImage":622,"ogUrl":626,"ogSiteName":627,"ogType":628,"canonicalUrls":626},"https://about.gitlab.com/blog/docker-in-docker-with-docker-19-dot-03","https://about.gitlab.com","article","docker-in-docker-with-docker-19-dot-03","en-us/blog/docker-in-docker-with-docker-19-dot-03",[632,633],"releases","CI/CD","BlogPost","at-uLkNSNqo1aN6oyIdfOD6wWNsCBlngpW4nj_L9wgY",{"logo":637,"freeTrial":642,"sales":647,"login":652,"items":657,"search":982,"minimal":1013,"duo":1032,"switchNav":1041,"pricingDeployment":1052},{"config":638},{"href":639,"dataGaName":640,"dataGaLocation":641},"/","gitlab logo","header",{"text":643,"config":644},"Get free trial",{"href":645,"dataGaName":646,"dataGaLocation":641},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":648,"config":649},"Request a demo",{"href":650,"dataGaName":651,"dataGaLocation":641},"/sales/?contact-topic=request-demo","sales",{"text":653,"config":654},"Sign in",{"href":655,"dataGaName":656,"dataGaLocation":641},"https://gitlab.com/users/sign_in/","sign in",[658,687,786,791,904,960],{"text":659,"config":660,"menu":662},"Platform",{"dataNavLevelOne":661},"platform",{"type":663,"columns":664},"cards",[665,671,679],{"title":659,"description":666,"link":667},"The intelligent orchestration platform for DevSecOps",{"text":668,"config":669},"Explore our Platform",{"href":670,"dataGaName":661,"dataGaLocation":641},"/platform/",{"title":672,"description":673,"link":674},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":675,"config":676},"Meet GitLab Duo",{"href":677,"dataGaName":678,"dataGaLocation":641},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":680,"description":681,"link":682},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":683,"config":684},"Learn more",{"href":685,"dataGaName":686,"dataGaLocation":641},"/why-gitlab/","why gitlab",{"text":688,"left":328,"config":689,"menu":691},"Product",{"dataNavLevelOne":690},"solutions",{"type":692,"link":693,"columns":697,"feature":765},"lists",{"text":694,"config":695},"View all Solutions",{"href":696,"dataGaName":690,"dataGaLocation":641},"/solutions/",[698,721,744],{"title":699,"description":700,"link":701,"items":706},"Automation","CI/CD and automation to accelerate deployment",{"config":702},{"icon":703,"href":704,"dataGaName":705,"dataGaLocation":641},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[707,710,713,717],{"text":633,"config":708},{"href":709,"dataGaLocation":641,"dataGaName":633},"/solutions/continuous-integration/",{"text":672,"config":711},{"href":677,"dataGaLocation":641,"dataGaName":712},"gitlab duo agent platform - product menu",{"text":714,"config":715},"Source Code Management",{"href":716,"dataGaLocation":641,"dataGaName":714},"/solutions/source-code-management/",{"text":718,"config":719},"Automated Software Delivery",{"href":704,"dataGaLocation":641,"dataGaName":720},"Automated software delivery",{"title":722,"description":723,"link":724,"items":729},"Security","Deliver code faster without compromising security",{"config":725},{"href":726,"dataGaName":727,"dataGaLocation":641,"icon":728},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[730,734,739],{"text":731,"config":732},"Application Security Testing",{"href":726,"dataGaName":733,"dataGaLocation":641},"Application security testing",{"text":735,"config":736},"Software Supply Chain Security",{"href":737,"dataGaLocation":641,"dataGaName":738},"/solutions/supply-chain/","Software supply chain security",{"text":740,"config":741},"Software Compliance",{"href":742,"dataGaName":743,"dataGaLocation":641},"/solutions/software-compliance/","software compliance",{"title":745,"link":746,"items":751},"Measurement",{"config":747},{"icon":748,"href":749,"dataGaName":750,"dataGaLocation":641},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[752,756,760],{"text":753,"config":754},"Visibility & Measurement",{"href":749,"dataGaLocation":641,"dataGaName":755},"Visibility and Measurement",{"text":757,"config":758},"Value Stream Management",{"href":759,"dataGaLocation":641,"dataGaName":757},"/solutions/value-stream-management/",{"text":761,"config":762},"Analytics & Insights",{"href":763,"dataGaLocation":641,"dataGaName":764},"/solutions/analytics-and-insights/","Analytics and insights",{"title":766,"type":692,"items":767},"GitLab for",[768,774,780],{"text":769,"config":770},"Enterprise",{"icon":771,"href":772,"dataGaLocation":641,"dataGaName":773},"Building","/enterprise/","enterprise",{"text":775,"config":776},"Small Business",{"icon":777,"href":778,"dataGaLocation":641,"dataGaName":779},"Work","/small-business/","small business",{"text":781,"config":782},"Public Sector",{"icon":783,"href":784,"dataGaLocation":641,"dataGaName":785},"Organization","/solutions/public-sector/","public sector",{"text":787,"config":788},"Pricing",{"href":789,"dataGaName":790,"dataGaLocation":641,"dataNavLevelOne":790},"/pricing/","pricing",{"text":792,"config":793,"menu":795},"Resources",{"dataNavLevelOne":794},"resources",{"type":692,"link":796,"columns":800,"feature":893},{"text":797,"config":798},"View all resources",{"href":799,"dataGaName":794,"dataGaLocation":641},"/resources/",[801,834,861],{"title":802,"items":803},"Getting started",[804,809,814,819,824,829],{"text":805,"config":806},"Install",{"href":807,"dataGaName":808,"dataGaLocation":641},"/install/","install",{"text":810,"config":811},"Quick start guides",{"href":812,"dataGaName":813,"dataGaLocation":641},"/get-started/","quick setup checklists",{"text":815,"config":816},"Learn",{"href":817,"dataGaLocation":641,"dataGaName":818},"https://university.gitlab.com/","learn",{"text":820,"config":821},"Product documentation",{"href":822,"dataGaName":823,"dataGaLocation":641},"https://docs.gitlab.com/","product documentation",{"text":825,"config":826},"Best practice videos",{"href":827,"dataGaName":828,"dataGaLocation":641},"/getting-started-videos/","best practice videos",{"text":830,"config":831},"Integrations",{"href":832,"dataGaName":833,"dataGaLocation":641},"/integrations/","integrations",{"title":835,"items":836},"Discover",[837,842,847,852,856],{"text":838,"config":839},"Customer success stories",{"href":840,"dataGaName":841,"dataGaLocation":641},"/customers/","customer success stories",{"text":843,"config":844},"Blog",{"href":845,"dataGaName":846,"dataGaLocation":641},"/blog/","blog",{"text":848,"config":849},"Demo Hub",{"href":850,"dataGaName":851,"dataGaLocation":641},"/demo-hub/","demo hub",{"text":853,"config":854},"The Source",{"href":855,"dataGaName":846,"dataGaLocation":641},"/the-source/",{"text":857,"config":858},"Remote",{"href":859,"dataGaName":860,"dataGaLocation":641},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":862,"items":863},"Connect",[864,868,873,878,883,888],{"text":865,"config":866},"GitLab Services",{"href":867,"dataGaName":388,"dataGaLocation":641},"/services/",{"text":869,"config":870},"Contribute",{"href":871,"dataGaName":872,"dataGaLocation":641},"https://contributors.gitlab.com","contribute",{"text":874,"config":875},"Community",{"href":876,"dataGaName":877,"dataGaLocation":641},"/community/","community",{"text":879,"config":880},"Forum",{"href":881,"dataGaName":882,"dataGaLocation":641},"https://forum.gitlab.com/","forum",{"text":884,"config":885},"Events",{"href":886,"dataGaName":887,"dataGaLocation":641},"/events/","events",{"text":889,"config":890},"Partners",{"href":891,"dataGaName":892,"dataGaLocation":641},"/partners/","partners",{"config":894,"title":897,"text":898,"link":899},{"background":895,"textColor":896},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":900,"config":901},"Read the latest",{"href":902,"dataGaName":903,"dataGaLocation":641},"/whats-new/","whats new",{"text":905,"config":906,"menu":908},"Company",{"dataNavLevelOne":907},"company",{"type":692,"columns":909},[910],{"items":911},[912,917,923,925,930,935,940,945,950,955],{"text":913,"config":914},"About",{"href":915,"dataGaName":916,"dataGaLocation":641},"/company/","about",{"text":918,"config":919,"footerGa":922},"Jobs",{"href":920,"dataGaName":921,"dataGaLocation":641},"/jobs/","jobs",{"dataGaName":921},{"text":884,"config":924},{"href":886,"dataGaName":887,"dataGaLocation":641},{"text":926,"config":927},"Leadership",{"href":928,"dataGaName":929,"dataGaLocation":641},"/company/team/e-group/","leadership",{"text":931,"config":932},"Handbook",{"href":933,"dataGaName":934,"dataGaLocation":641},"https://handbook.gitlab.com/","handbook",{"text":936,"config":937},"Investor relations",{"href":938,"dataGaName":939,"dataGaLocation":641},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":941,"config":942},"Trust Center",{"href":943,"dataGaName":944,"dataGaLocation":641},"/security/","trust center",{"text":946,"config":947},"AI Transparency Center",{"href":948,"dataGaName":949,"dataGaLocation":641},"/ai-transparency-center/","ai transparency center",{"text":951,"config":952},"Newsletter",{"href":953,"dataGaName":954,"dataGaLocation":641},"/company/contact/#contact-forms","newsletter",{"text":956,"config":957},"Press",{"href":958,"dataGaName":959,"dataGaLocation":641},"/press/","press",{"text":961,"config":962,"menu":963},"Contact us",{"dataNavLevelOne":907},{"type":692,"columns":964},[965],{"items":966},[967,972,977],{"text":968,"config":969},"Talk to sales",{"href":970,"dataGaName":971,"dataGaLocation":641},"/sales/","talk to sales",{"text":973,"config":974},"Support portal",{"href":975,"dataGaName":976,"dataGaLocation":641},"https://support.gitlab.com/hc/en-us","support portal",{"text":978,"config":979},"Customer portal",{"href":980,"dataGaName":981,"dataGaLocation":641},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":983,"login":984,"suggestions":991},"Close",{"text":985,"link":986},"To search repositories and projects, login to",{"text":987,"config":988},"gitlab.com",{"href":655,"dataGaName":989,"dataGaLocation":990},"search login","search",{"text":992,"default":993},"Suggestions",[994,996,1000,1002,1006,1010],{"text":672,"config":995},{"href":677,"dataGaName":672,"dataGaLocation":990},{"text":997,"config":998},"Code Suggestions (AI)",{"href":999,"dataGaName":997,"dataGaLocation":990},"/solutions/code-suggestions/",{"text":633,"config":1001},{"href":709,"dataGaName":633,"dataGaLocation":990},{"text":1003,"config":1004},"GitLab on AWS",{"href":1005,"dataGaName":1003,"dataGaLocation":990},"/partners/technology-partners/aws/",{"text":1007,"config":1008},"GitLab on Google Cloud",{"href":1009,"dataGaName":1007,"dataGaLocation":990},"/partners/technology-partners/google-cloud-platform/",{"text":1011,"config":1012},"Why GitLab?",{"href":685,"dataGaName":1011,"dataGaLocation":990},{"freeTrial":1014,"mobileIcon":1019,"desktopIcon":1024,"secondaryButton":1027},{"text":1015,"config":1016},"Start free trial",{"href":1017,"dataGaName":646,"dataGaLocation":1018},"https://gitlab.com/-/trials/new/","nav",{"altText":1020,"config":1021},"Gitlab Icon",{"src":1022,"dataGaName":1023,"dataGaLocation":1018},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1020,"config":1025},{"src":1026,"dataGaName":1023,"dataGaLocation":1018},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1028,"config":1029},"Get Started",{"href":1030,"dataGaName":1031,"dataGaLocation":1018},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1033,"mobileIcon":1037,"desktopIcon":1039},{"text":1034,"config":1035},"Learn more about GitLab Duo",{"href":677,"dataGaName":1036,"dataGaLocation":1018},"gitlab duo",{"altText":1020,"config":1038},{"src":1022,"dataGaName":1023,"dataGaLocation":1018},{"altText":1020,"config":1040},{"src":1026,"dataGaName":1023,"dataGaLocation":1018},{"button":1042,"mobileIcon":1047,"desktopIcon":1049},{"text":1043,"config":1044},"/switch",{"href":1045,"dataGaName":1046,"dataGaLocation":1018},"#contact","switch",{"altText":1020,"config":1048},{"src":1022,"dataGaName":1023,"dataGaLocation":1018},{"altText":1020,"config":1050},{"src":1051,"dataGaName":1023,"dataGaLocation":1018},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1053,"mobileIcon":1058,"desktopIcon":1060},{"text":1054,"config":1055},"Back to pricing",{"href":789,"dataGaName":1056,"dataGaLocation":1018,"icon":1057},"back to pricing","GoBack",{"altText":1020,"config":1059},{"src":1022,"dataGaName":1023,"dataGaLocation":1018},{"altText":1020,"config":1061},{"src":1026,"dataGaName":1023,"dataGaLocation":1018},{"title":1063,"titleMobile":1064,"button":1065,"config":1070},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":683,"config":1066},{"href":1067,"dataGaName":1068,"dataGaLocation":1069},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1071,"disabled":621},"release",{"data":1073},{"text":1074,"source":1075,"edit":1081,"contribute":1086,"config":1091,"items":1096,"minimal":1306},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1076,"config":1077},"View page source",{"href":1078,"dataGaName":1079,"dataGaLocation":1080},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1082,"config":1083},"Edit this page",{"href":1084,"dataGaName":1085,"dataGaLocation":1080},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1087,"config":1088},"Please contribute",{"href":1089,"dataGaName":1090,"dataGaLocation":1080},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1092,"facebook":1093,"youtube":1094,"linkedin":1095},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1097,1144,1198,1242,1274],{"title":787,"links":1098,"subMenu":1113},[1099,1103,1108],{"text":1100,"config":1101},"View plans",{"href":789,"dataGaName":1102,"dataGaLocation":1080},"view plans",{"text":1104,"config":1105},"Why Premium?",{"href":1106,"dataGaName":1107,"dataGaLocation":1080},"/pricing/premium/","why premium",{"text":1109,"config":1110},"Why Ultimate?",{"href":1111,"dataGaName":1112,"dataGaLocation":1080},"/pricing/ultimate/","why ultimate",[1114],{"title":1115,"links":1116},"Contact Us",[1117,1120,1122,1124,1129,1134,1139],{"text":1118,"config":1119},"Contact sales",{"href":970,"dataGaName":651,"dataGaLocation":1080},{"text":973,"config":1121},{"href":975,"dataGaName":976,"dataGaLocation":1080},{"text":978,"config":1123},{"href":980,"dataGaName":981,"dataGaLocation":1080},{"text":1125,"config":1126},"Status",{"href":1127,"dataGaName":1128,"dataGaLocation":1080},"https://status.gitlab.com/","status",{"text":1130,"config":1131},"Terms of use",{"href":1132,"dataGaName":1133,"dataGaLocation":1080},"/terms/","terms of use",{"text":1135,"config":1136},"Privacy statement",{"href":1137,"dataGaName":1138,"dataGaLocation":1080},"/privacy/","privacy statement",{"text":1140,"config":1141},"Cookie preferences",{"dataGaName":1142,"dataGaLocation":1080,"id":1143,"isOneTrustButton":328},"cookie preferences","ot-sdk-btn",{"title":688,"links":1145,"subMenu":1154},[1146,1150],{"text":1147,"config":1148},"DevSecOps platform",{"href":670,"dataGaName":1149,"dataGaLocation":1080},"devsecops platform",{"text":1151,"config":1152},"AI-Assisted Development",{"href":677,"dataGaName":1153,"dataGaLocation":1080},"ai-assisted development",[1155],{"title":1156,"links":1157},"Topics",[1158,1163,1168,1173,1178,1183,1188,1193],{"text":1159,"config":1160},"CICD",{"href":1161,"dataGaName":1162,"dataGaLocation":1080},"/topics/ci-cd/","cicd",{"text":1164,"config":1165},"GitOps",{"href":1166,"dataGaName":1167,"dataGaLocation":1080},"/topics/gitops/","gitops",{"text":1169,"config":1170},"DevOps",{"href":1171,"dataGaName":1172,"dataGaLocation":1080},"/topics/devops/","devops",{"text":1174,"config":1175},"Version Control",{"href":1176,"dataGaName":1177,"dataGaLocation":1080},"/topics/version-control/","version control",{"text":1179,"config":1180},"DevSecOps",{"href":1181,"dataGaName":1182,"dataGaLocation":1080},"/topics/devsecops/","devsecops",{"text":1184,"config":1185},"Cloud Native",{"href":1186,"dataGaName":1187,"dataGaLocation":1080},"/topics/cloud-native/","cloud native",{"text":1189,"config":1190},"AI for Coding",{"href":1191,"dataGaName":1192,"dataGaLocation":1080},"/topics/devops/ai-for-coding/","ai for coding",{"text":1194,"config":1195},"Agentic AI",{"href":1196,"dataGaName":1197,"dataGaLocation":1080},"/topics/agentic-ai/","agentic ai",{"title":1199,"links":1200},"Solutions",[1201,1203,1205,1210,1214,1217,1221,1224,1226,1229,1232,1237],{"text":731,"config":1202},{"href":726,"dataGaName":731,"dataGaLocation":1080},{"text":720,"config":1204},{"href":704,"dataGaName":705,"dataGaLocation":1080},{"text":1206,"config":1207},"Agile development",{"href":1208,"dataGaName":1209,"dataGaLocation":1080},"/solutions/agile-delivery/","agile delivery",{"text":1211,"config":1212},"SCM",{"href":716,"dataGaName":1213,"dataGaLocation":1080},"source code management",{"text":1159,"config":1215},{"href":709,"dataGaName":1216,"dataGaLocation":1080},"continuous integration & delivery",{"text":1218,"config":1219},"Value stream management",{"href":759,"dataGaName":1220,"dataGaLocation":1080},"value stream management",{"text":1164,"config":1222},{"href":1223,"dataGaName":1167,"dataGaLocation":1080},"/solutions/gitops/",{"text":769,"config":1225},{"href":772,"dataGaName":773,"dataGaLocation":1080},{"text":1227,"config":1228},"Small business",{"href":778,"dataGaName":779,"dataGaLocation":1080},{"text":1230,"config":1231},"Public sector",{"href":784,"dataGaName":785,"dataGaLocation":1080},{"text":1233,"config":1234},"Education",{"href":1235,"dataGaName":1236,"dataGaLocation":1080},"/solutions/education/","education",{"text":1238,"config":1239},"Financial services",{"href":1240,"dataGaName":1241,"dataGaLocation":1080},"/solutions/finance/","financial services",{"title":792,"links":1243},[1244,1246,1248,1250,1253,1255,1258,1260,1262,1264,1266,1268,1270,1272],{"text":805,"config":1245},{"href":807,"dataGaName":808,"dataGaLocation":1080},{"text":810,"config":1247},{"href":812,"dataGaName":813,"dataGaLocation":1080},{"text":815,"config":1249},{"href":817,"dataGaName":818,"dataGaLocation":1080},{"text":820,"config":1251},{"href":822,"dataGaName":1252,"dataGaLocation":1080},"docs",{"text":843,"config":1254},{"href":845,"dataGaName":846,"dataGaLocation":1080},{"text":1256,"config":1257},"What's new",{"href":902,"dataGaName":903,"dataGaLocation":1080},{"text":838,"config":1259},{"href":840,"dataGaName":841,"dataGaLocation":1080},{"text":857,"config":1261},{"href":859,"dataGaName":860,"dataGaLocation":1080},{"text":865,"config":1263},{"href":867,"dataGaName":388,"dataGaLocation":1080},{"text":869,"config":1265},{"href":871,"dataGaName":872,"dataGaLocation":1080},{"text":874,"config":1267},{"href":876,"dataGaName":877,"dataGaLocation":1080},{"text":879,"config":1269},{"href":881,"dataGaName":882,"dataGaLocation":1080},{"text":884,"config":1271},{"href":886,"dataGaName":887,"dataGaLocation":1080},{"text":889,"config":1273},{"href":891,"dataGaName":892,"dataGaLocation":1080},{"title":905,"links":1275},[1276,1278,1280,1282,1284,1286,1290,1295,1297,1299,1301],{"text":913,"config":1277},{"href":915,"dataGaName":907,"dataGaLocation":1080},{"text":918,"config":1279},{"href":920,"dataGaName":921,"dataGaLocation":1080},{"text":926,"config":1281},{"href":928,"dataGaName":929,"dataGaLocation":1080},{"text":931,"config":1283},{"href":933,"dataGaName":934,"dataGaLocation":1080},{"text":936,"config":1285},{"href":938,"dataGaName":939,"dataGaLocation":1080},{"text":1287,"config":1288},"Sustainability",{"href":1289,"dataGaName":1287,"dataGaLocation":1080},"/sustainability/",{"text":1291,"config":1292},"Diversity, inclusion and belonging (DIB)",{"href":1293,"dataGaName":1294,"dataGaLocation":1080},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":941,"config":1296},{"href":943,"dataGaName":944,"dataGaLocation":1080},{"text":951,"config":1298},{"href":953,"dataGaName":954,"dataGaLocation":1080},{"text":956,"config":1300},{"href":958,"dataGaName":959,"dataGaLocation":1080},{"text":1302,"config":1303},"Modern Slavery Transparency Statement",{"href":1304,"dataGaName":1305,"dataGaLocation":1080},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1307},[1308,1311,1314],{"text":1309,"config":1310},"Terms",{"href":1132,"dataGaName":1133,"dataGaLocation":1080},{"text":1312,"config":1313},"Cookies",{"dataGaName":1142,"dataGaLocation":1080,"id":1143,"isOneTrustButton":328},{"text":1315,"config":1316},"Privacy",{"href":1137,"dataGaName":1138,"dataGaLocation":1080},[1318],{"id":1319,"title":7,"body":620,"config":1320,"content":1322,"description":620,"extension":309,"meta":1325,"navigation":328,"path":1326,"seo":1327,"stem":1328,"__hash__":1329},"blogAuthors/en-us/blog/authors/steve-azzopardi.yml",{"template":1321},"BlogAuthor",{"name":7,"config":1323},{"headshot":64,"ctfId":1324},"steveazz",{},"/en-us/blog/authors/steve-azzopardi",{},"en-us/blog/authors/steve-azzopardi","qnb6MwMS78l86ZK9JZJ-5qc-NcHCq2bdzgXn2tHRN40",[1331,1339,1346],{"title":1332,"description":1333,"heroImage":1334,"category":616,"date":1335,"authors":1336,"slug":1338,"externalUrl":620},"GitLab named a Leader in the 2026 Gartner® Magic Quadrant™ for DevSecOps Platforms","Agents made coding fast. GitLab is the Intelligent Orchestration Platform for DevSecOps that brings speed with control for the rest of the software lifecycle.","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-06-17",[1337],"Manav Khurana","gitlab-leader-2026-gartner-mq-devsecops-platforms",{"title":1340,"description":1341,"heroImage":1342,"category":616,"date":1335,"authors":1343,"slug":1345,"externalUrl":620},"GitLab and Capgemini accelerate DevSecOps transformation","The global alliance helps organizations modernize software delivery, secure their supply chain, and bring AI into development workflows.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1781279411/n3pkmddd2eswa8qbu06z.png",[1344],"Alex Picker","gitlab-and-capgemini-global-alliance-partnership",{"title":1347,"description":1348,"heroImage":1349,"category":616,"date":1335,"authors":1350,"slug":1351,"externalUrl":620},"Introducing the 2026 EMEA GitLab Partner Award winners","Learn about the EMEA partners who made an outstanding impact over the past year.\n","https://res.cloudinary.com/about-gitlab-com/image/upload/v1781608381/biycl2ib2kpsbspjlac7.png",[1344],"2026-emea-gitlab-partner-awards",{"promotions":1353},[1354,1368,1380,1392],{"id":1355,"categories":1356,"header":1358,"text":1359,"button":1360,"image":1365},"ai-modernization",[1357],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1361,"config":1362},"Get your AI maturity score",{"href":1363,"dataGaName":1364,"dataGaLocation":846},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1366},{"src":1367},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1369,"categories":1370,"header":1372,"text":1359,"button":1373,"image":1377},"devops-modernization",[1371,1182],"product","Are you just managing tools or shipping innovation?",{"text":1374,"config":1375},"Get your DevOps maturity score",{"href":1376,"dataGaName":1364,"dataGaLocation":846},"/assessments/devops-modernization-assessment/",{"config":1378},{"src":1379},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1381,"categories":1382,"header":1384,"text":1359,"button":1385,"image":1389},"security-modernization",[1383],"security","Are you trading speed for security?",{"text":1386,"config":1387},"Get your security maturity score",{"href":1388,"dataGaName":1364,"dataGaLocation":846},"/assessments/security-modernization-assessment/",{"config":1390},{"src":1391},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1393,"paths":1394,"header":1397,"text":1398,"button":1399,"image":1404},"github-azure-migration",[1395,1396],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1400,"config":1401},"See how GitLab compares to GitHub",{"href":1402,"dataGaName":1403,"dataGaLocation":846},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1405},{"src":1379},{"header":1407,"blurb":1408,"button":1409,"secondaryButton":1414},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1410,"config":1411},"Get your free trial",{"href":1412,"dataGaName":646,"dataGaLocation":1413},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1118,"config":1415},{"href":970,"dataGaName":651,"dataGaLocation":1413},1786803766407]