CINXE.COM
Continuous integration/Docker - MediaWiki
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-disabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Continuous integration/Docker - MediaWiki</title> <script>(function(){var className="client-js vector-feature-language-in-header-disabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )mediawikiwikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""], "wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"a8d5bc1f-5487-48ad-a559-f22f08384f27","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Continuous_integration/Docker","wgTitle":"Continuous integration/Docker","wgCurRevisionId":6862386,"wgRevisionId":6862386,"wgArticleId":705452,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Continuous integration"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"Continuous_integration/Docker","wgRelevantArticleId":705452,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"mediawiki","wgCiteReferencePreviewsActive":true,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault": true,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":10000,"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgDiscussionToolsFeaturesEnabled":{"replytool":true,"newtopictool":true,"sourcemodetoolbar":true,"topicsubscription":false,"autotopicsub":false,"visualenhancements":false,"visualenhancements_reply":false,"visualenhancements_pageframe":false},"wgDiscussionToolsFallbackEditMode":"visual","wgULSPosition":"personal","wgULSisCompactLinksEnabled":true,"wgVector2022LanguageInHeader":false,"wgULSisLanguageSelectorEmpty":false,"wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"]};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready", "ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.pygments":"ready","ext.discussionTools.init.styles":"ready","oojs-ui-core.styles":"ready","oojs-ui.styles.indicators":"ready","mediawiki.widgets.styles":"ready","oojs-ui-core.icons":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.pt":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.pygments.view","site","mediawiki.page.ready","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.urlShortener.toolbar","ext.centralauth.centralautologin","mmv.bootstrap","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.discussionTools.init","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.compactlinks", "ext.uls.interface","ext.checkUser.clientHints"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&modules=ext.discussionTools.init.styles%7Cext.pygments%2CwikimediaBadges%7Cext.uls.pt%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cmediawiki.widgets.styles%7Coojs-ui-core.icons%2Cstyles%7Coojs-ui.styles.indicators%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&only=styles&skin=vector-2022"> <script async="" src="/w/load.php?lang=en&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:site_name" content="MediaWiki"> <meta property="og:title" content="Continuous integration/Docker - MediaWiki"> <meta property="og:type" content="website"> <link rel="preconnect" href="//upload.wikimedia.org"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//m.mediawiki.org/wiki/Continuous_integration/Docker"> <link rel="alternate" type="application/x-wiki" title="Edit" href="/w/index.php?title=Continuous_integration/Docker&action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/mediawiki.png"> <link rel="icon" href="/static/favicon/mediawiki.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="MediaWiki (en)"> <link rel="EditURI" type="application/rsd+xml" href="//www.mediawiki.org/w/api.php?action=rsd"> <link rel="canonical" href="https://www.mediawiki.org/wiki/Continuous_integration/Docker"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"> <link rel="alternate" type="application/atom+xml" title="MediaWiki Atom feed" href="/w/index.php?title=Special:RecentChanges&feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="ext-discussiontools-replytool-enabled ext-discussiontools-newtopictool-enabled ext-discussiontools-sourcemodetoolbar-enabled skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Continuous_integration_Docker rootpage-Continuous_integration skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navigation </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/MediaWiki" title="Visit the main page [z]" accesskey="z"><span>Main page</span></a></li><li id="n-mw-download" class="mw-list-item"><a href="/wiki/Download"><span>Get MediaWiki</span></a></li><li id="n-mw-extensions" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Category:Extensions"><span>Get extensions</span></a></li><li id="n-blog-text" class="mw-list-item"><a href="https://techblog.wikimedia.org/"><span>Tech blog</span></a></li><li id="n-mw-contribute" class="mw-list-item"><a href="/wiki/Special:MyLanguage/How_to_contribute"><span>Contribute</span></a></li> </ul> </div> </div> <div id="p-support" class="vector-menu mw-portlet mw-portlet-support" > <div class="vector-menu-heading"> Support </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-help" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Help:Contents" title="The place to find out"><span>User help</span></a></li><li id="n-mw-faq" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Manual:FAQ"><span>FAQ</span></a></li><li id="n-mw-manual" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Manual:Contents"><span>Technical manual</span></a></li><li id="n-mw-supportdesk" class="mw-list-item"><a href="/wiki/Project:Support_desk"><span>Support desk</span></a></li><li id="n-mw-communication" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Communication"><span>Communication</span></a></li> </ul> </div> </div> <div id="p-development" class="vector-menu mw-portlet mw-portlet-development" > <div class="vector-menu-heading"> Development </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mw-developerportal" class="mw-list-item"><a href="https://developer.wikimedia.org/"><span>Developer portal</span></a></li><li id="n-svn-statistics" class="mw-list-item"><a href="/wiki/Development_statistics"><span>Code statistics</span></a></li> </ul> </div> </div> <div id="p-mediawiki.org" class="vector-menu mw-portlet mw-portlet-mediawiki_org" > <div class="vector-menu-heading"> mediawiki.org </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-portal" class="mw-list-item"><a href="/wiki/Project:Help" title="About the project, what you can do, where to find things"><span>Community portal</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes in the wiki [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-mw-translate" class="mw-list-item"><a href="/wiki/Special:LanguageStats"><span>Translate content</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Load a random page [x]" accesskey="x"><span>Random page</span></a></li><li id="n-mw-discussion" class="mw-list-item"><a href="/wiki/Project:Village_Pump"><span>Village pump</span></a></li><li id="n-Sandboxlink-portlet-label" class="mw-list-item"><a href="/wiki/Project:Sandbox"><span>Sandbox</span></a></li> </ul> </div> </div> <div id="p-lang" class="vector-menu mw-portlet mw-portlet-lang" > <div class="vector-menu-heading"> In other languages </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-add wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:NewItem?site=mediawikiwiki&page=Continuous+integration%2FDocker" title="Add interlanguage links" class="wbc-editpage">Add links</a></span></div> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/MediaWiki" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/mediawikiwiki.svg" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="MediaWiki" src="/static/images/mobile/copyright/mediawikiwiki-wordmark.svg" style="width: 7.5em; height: 1.125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Search MediaWiki [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search MediaWiki" aria-label="Search MediaWiki" autocapitalize="sentences" title="Search MediaWiki [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Personal tools"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-uls" class="mw-list-item active user-links-collapsible-item"><a data-mw="interface" href="#" class="uls-trigger cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet"><span class="vector-icon mw-ui-icon-wikimedia-language mw-ui-icon-wikimedia-wikimedia-language"></span> <span>English</span></a> </li> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page's font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Appearance" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Appearance</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="https://donate.wikimedia.org/?utm_source=donate&utm_medium=sidebar&utm_campaign=spontaneous&uselang=en" class=""><span>Donate</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:CreateAccount&returnto=Continuous+integration%2FDocker" title="You are encouraged to create an account and log in; however, it is not mandatory" class=""><span>Create account</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:UserLogin&returnto=Continuous+integration%2FDocker" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o" class=""><span>Log in</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="More options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="https://donate.wikimedia.org/?utm_source=donate&utm_medium=sidebar&utm_campaign=spontaneous&uselang=en"><span>Donate</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&returnto=Continuous+integration%2FDocker" title="You are encouraged to create an account and log in; however, it is not mandatory"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:UserLogin&returnto=Continuous+integration%2FDocker" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Pages for logged out editors <a href="/wiki/Help:Introduction" aria-label="Learn more about editing"><span>learn more</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Contents" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contents</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">hide</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">Beginning</div> </a> </li> <li id="toc-Overview" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Overview"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Overview</span> </div> </a> <ul id="toc-Overview-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Build_images_locally" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Build_images_locally"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>Build images locally</span> </div> </a> <button aria-controls="toc-Build_images_locally-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Build images locally subsection</span> </button> <ul id="toc-Build_images_locally-sublist" class="vector-toc-list"> <li id="toc-Installing_docker-pkg" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Installing_docker-pkg"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.1</span> <span>Installing docker-pkg</span> </div> </a> <ul id="toc-Installing_docker-pkg-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Download_existing_images" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Download_existing_images"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2</span> <span>Download existing images</span> </div> </a> <ul id="toc-Download_existing_images-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Build_the_images" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Build_the_images"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.3</span> <span>Build the images</span> </div> </a> <ul id="toc-Build_the_images-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Troubleshooting" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Troubleshooting"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.4</span> <span>Troubleshooting</span> </div> </a> <ul id="toc-Troubleshooting-sublist" class="vector-toc-list"> <li id="toc-Could_not_find_a_suitable_TLS_CA_certificate_bundle" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#Could_not_find_a_suitable_TLS_CA_certificate_bundle"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.4.1</span> <span>Could not find a suitable TLS CA certificate bundle</span> </div> </a> <ul id="toc-Could_not_find_a_suitable_TLS_CA_certificate_bundle-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-No_images_are_built" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#No_images_are_built"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.4.2</span> <span>No images are built</span> </div> </a> <ul id="toc-No_images_are_built-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Manifest_not_found" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#Manifest_not_found"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.4.3</span> <span>Manifest not found</span> </div> </a> <ul id="toc-Manifest_not_found-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Adjusting_an_image" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Adjusting_an_image"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.5</span> <span>Adjusting an image</span> </div> </a> <ul id="toc-Adjusting_an_image-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Manage_local_images" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Manage_local_images"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.6</span> <span>Manage local images</span> </div> </a> <ul id="toc-Manage_local_images-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Deploy_images" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Deploy_images"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>Deploy images</span> </div> </a> <ul id="toc-Deploy_images-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Testing_new_images" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Testing_new_images"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>Testing new images</span> </div> </a> <button aria-controls="toc-Testing_new_images-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Testing new images subsection</span> </button> <ul id="toc-Testing_new_images-sublist" class="vector-toc-list"> <li id="toc-Test_an_image_locally" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Test_an_image_locally"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.1</span> <span>Test an image locally</span> </div> </a> <ul id="toc-Test_an_image_locally-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Debug_an_image_locally" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Debug_an_image_locally"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.2</span> <span>Debug an image locally</span> </div> </a> <ul id="toc-Debug_an_image_locally-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Test_an_image_in_CI" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Test_an_image_in_CI"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.3</span> <span>Test an image in CI</span> </div> </a> <ul id="toc-Test_an_image_in_CI-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Jenkins_Agent" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Jenkins_Agent"> <div class="vector-toc-text"> <span class="vector-toc-numb">5</span> <span>Jenkins Agent</span> </div> </a> <ul id="toc-Jenkins_Agent-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Contents" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Toggle the table of contents" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Continuous integration/Docker</span></h1> <div class="mw-indicators"> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Continuous_integration/Docker" title="View the content page [c]" accesskey="c"><span>Page</span></a></li><li id="ca-talk" class="vector-tab-noicon mw-list-item"><a href="/wiki/Talk:Continuous_integration/Docker" rel="discussion" title="Discussion about the content page [t]" accesskey="t"><span>Discussion</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Continuous_integration/Docker"><span>Read</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Continuous_integration/Docker&action=edit" title="Edit the source code of this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Continuous_integration/Docker&action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Continuous_integration/Docker"><span>Read</span></a></li><li id="ca-more-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Continuous_integration/Docker&action=edit" title="Edit the source code of this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Continuous_integration/Docker&action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Continuous_integration/Docker" title="A list of all wiki pages that link here [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Continuous_integration/Docker" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Continuous_integration/Docker&oldid=6862386" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Continuous_integration/Docker&action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Special:CiteThisPage&page=Continuous_integration%2FDocker&id=6862386&wpFormIdentifier=titleform" title="Information on how to cite this page"><span>Cite this page</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fwww.mediawiki.org%2Fwiki%2FContinuous_integration%2FDocker"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&url=https%3A%2F%2Fwww.mediawiki.org%2Fwiki%2FContinuous_integration%2FDocker"><span>Download QR code</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" > <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-create_a_book" class="mw-list-item"><a href="/w/index.php?title=Special:Book&bookcmd=book_creator&referer=Continuous+integration%2FDocker"><span>Create a book</span></a></li><li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&page=Continuous_integration%2FDocker&action=show-download-screen"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Continuous_integration/Docker&printable=yes" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects emptyPortlet" > <div class="vector-menu-heading"> In other projects </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Appearance</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">hide</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div id="siteSub" class="noprint">From mediawiki.org</div> </div> <div id="contentSub"><div id="mw-content-subtitle"><div class="subpages">< <bdi dir="ltr"><a href="/wiki/Continuous_integration" title="Continuous integration">Continuous integration</a></bdi></div></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><p>Support for <b>Docker containers</b> was added to Wikimedia CI in August 2017. These containers run from a cluster of persistent Jenkins agents in Wikimedia Cloud Services. We hope that in the future, these images will run from a Kubernetes cluster instead. </p> <meta property="mw:PageProp/toc"/> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Overview" data-mw-thread-id="h-Overview"><span data-mw-comment-start="" id="h-Overview"></span>Overview<span data-mw-comment-end="h-Overview"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=1" title="Edit section: Overview"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Overview","replies":[]}}--></div> <p>Each Docker image is designed to be self-sufficient, expecting nothing on disk, and expecting nothing to remain on disk afterward. Containers and their filesystem are destroyed after each run (except for the designated logs directory, which is preserved as the Jenkins build artefact for a few days). The behaviour of a container may only vary on environment variables provided by Jenkins (<code>ZUUL_URL</code>, <code>ZUUL_REF</code>, etc). </p><p>Administrative tasks must be handled solely by Jenkins, outside the container. </p><p>The Docker images for CI are published under the <b>releng</b> namespace at <a class="external free" href="https://docker-registry.wikimedia.org/">https://docker-registry.wikimedia.org/</a>,. </p><p>The source code for each Dockerfile resides in the <a href="https://gerrit.wikimedia.org/g/integration/config/" class="extiw" title="git:integration/config/">integration/config.git</a> repository. </p> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Build_images_locally" data-mw-thread-id="h-Build_images_locally"><span data-mw-comment-start="" id="h-Build_images_locally"></span>Build images locally<span data-mw-comment-end="h-Build_images_locally"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=2" title="Edit section: Build images locally"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Build_images_locally","replies":["h-Installing_docker-pkg-Build_images_locally","h-Download_existing_images-Build_images_locally","h-Build_the_images-Build_images_locally","h-Troubleshooting-Build_images_locally","h-Adjusting_an_image-Build_images_locally","h-Manage_local_images-Build_images_locally"]}}--></div> <p>We use <code>docker-pkg</code> to build Docker images, with Jinja for additional templating. </p> <div class="mw-heading mw-heading3"><h3 id="Installing_docker-pkg" data-mw-thread-id="h-Installing_docker-pkg-Build_images_locally"><span data-mw-comment-start="" id="h-Installing_docker-pkg-Build_images_locally"></span>Installing docker-pkg<span data-mw-comment-end="h-Installing_docker-pkg-Build_images_locally"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=3" title="Edit section: Installing docker-pkg"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div><p> docker-pkg is a <b>python3</b> program that can be cloned from <a href="https://gerrit.wikimedia.org/g/operations/docker-images/docker-pkg/%2B/refs/heads/master/" class="extiw" title="git:operations/docker-images/docker-pkg/+/refs/heads/master/">operations/docker-images/docker-pkg</a>: </p><div class="mw-highlight mw-highlight-lang-sh mw-content-ltr" dir="ltr"><pre><span></span>$<span class="w"> </span>git<span class="w"> </span>clone<span class="w"> </span>https://gerrit.wikimedia.org/r/operations/docker-images/docker-pkg $<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>docker-pkg </pre></div><p> It can then be installed in a virtual environment, for example with:</p><div class="mw-highlight mw-highlight-lang-sh mw-content-ltr" dir="ltr"><pre><span></span>$<span class="w"> </span>virtualenv<span class="w"> </span>venv $<span class="w"> </span>./venv/bin/pip<span class="w"> </span>install<span class="w"> </span>. </pre></div><p> or alternatively with <a rel="nofollow" class="external text" href="https://pipx.pypa.io/stable/">pipx</a>:</p><div class="mw-highlight mw-highlight-lang-sh mw-content-ltr" dir="ltr"><pre><span></span>$<span class="w"> </span>pipx<span class="w"> </span>install<span class="w"> </span>-e<span class="w"> </span>. </pre></div><p> Also clone the <code>integration/config</code> repository:</p><div class="mw-highlight mw-highlight-lang-sh mw-content-ltr" dir="ltr"><pre><span></span>$<span class="w"> </span>git<span class="w"> </span>clone<span class="w"> </span>https://gerrit.wikimedia.org/r/integration/config </pre></div><p>At this point, the <code>docker-pkg</code> command should be available in your terminal. </p><div class="mw-heading mw-heading3"><h3 id="Download_existing_images" data-mw-thread-id="h-Download_existing_images-Build_images_locally"><span data-mw-comment-start="" id="h-Download_existing_images-Build_images_locally"></span>Download existing images<span data-mw-comment-end="h-Download_existing_images-Build_images_locally"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=4" title="Edit section: Download existing images"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>You can significantly speed up the building of images, by first downloading the existing latest version of the image you are interested in changing (or, if creating a new image, its parent image). Building all images from scatch may take several hours and consume ±40GB disk space. </p><p>The following command will download the latest versions of WMF CI's Docker images from <code>docker-registry.wikimedia.org</code>. Note that this naturally skiips images you have previously pulled or build already (<a href="https://phabricator.wikimedia.org/T200720#4468242" class="extiw" title="phab:T200720">source</a>): </p> <pre>$ cd integration/config $ ack -o -h -s 'docker-registry.*:[.\d]+' jjb/ | sort | uniq | xargs -n1 docker pull </pre> <p>Alternatively, you can download individual images like so: </p> <pre>$ docker pull docker-registry.wikimedia.org/releng/node20:latest </pre> <p>If the image in question has a <a class="mw-selflink-fragment" href="#Debug_an_image_locally">debug script</a>, you can also run that, which will naturally download it as-needed. </p> <div class="mw-heading mw-heading3"><h3 id="Build_the_images" data-mw-thread-id="h-Build_the_images-Build_images_locally"><span data-mw-comment-start="" id="h-Build_the_images-Build_images_locally"></span>Build the images<span data-mw-comment-end="h-Build_the_images-Build_images_locally"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=5" title="Edit section: Build the images"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div><p> To build one or more images, run <code>docker pull</code> with the <code>--select</code> option. The "select" option takes a glob parameter that applies to the full reference name of the image (URL and version).</p><div class="mw-highlight mw-highlight-lang-shell-session mw-content-ltr" dir="ltr"><pre><span></span><span class="gp">$ </span>docker-pkg<span class="w"> </span>-c<span class="w"> </span>dockerfiles/config.yaml<span class="w"> </span>build<span class="w"> </span>--select<span class="w"> </span><span class="s1">'*example:*'</span><span class="w"> </span>dockerfiles/ </pre></div><p>This will scan the <code>dockerfiles/</code> folder. For each one, it will find the last version tag in <code>changelog</code>, and then if you don't have that version present in your local Docker registry, it will build start building it from the Dockerfile. </p><p>For example, <code>--select '*node-test:*'</code> would build <code>dockerfiles/node10-test/Dockerfile.template</code> as represented by <code>docker-registry.wikimedia.org/releng/node10-test:0.3.0</code>. </p><p>You can also use this to build a large number of related images, for example <code>--select '*quibble*'</code> (note the absence of a colon) would rebuild all images that have new versions in your working copy, of images that contain "quibble" in their name. </p><p> Alternatively, to <b>build the entire catalog</b>, omit the <code>--select</code> option like so:</p><div class="mw-highlight mw-highlight-lang-sh mw-content-ltr" dir="ltr"><pre><span></span>$<span class="w"> </span><span class="nb">cd</span><span class="w"> </span>path/to/integration/config $<span class="w"> </span>docker-pkg<span class="w"> </span>-c<span class="w"> </span>dockerfiles/config.yaml<span class="w"> </span>build<span class="w"> </span>dockerfiles </pre></div><style data-mw-deduplicate="TemplateStyles:r6824882">.mw-parser-output table.ambox{margin:0 10%;width:unset;border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output table.ambox+table.ambox,.mw-parser-output table.ambox+link+table.ambox,.mw-parser-output table.ambox+style+table.ambox{margin-top:-1px}.mw-parser-output .ambox td.mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox th.mbox-text,.mw-parser-output .ambox td.mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox td.mbox-image{padding:2px 0 2px 0.5em}.mw-parser-output .ambox td.mbox-imageright{padding:2px 0.5em 2px 0}.mw-parser-output table.ambox-notice{border-left-color:#36c}.mw-parser-output table.ambox-speedy{background-color:var(--background-color-error-subtle,#fee7e6)}.mw-parser-output table.ambox-delete,.mw-parser-output table.ambox-speedy{border-left-color:var(--background-color-error--active,#b32424)}.mw-parser-output table.ambox-content{border-left-color:#f28500}.mw-parser-output table.ambox-style{border-left-color:#fc3}.mw-parser-output table.ambox-move{border-left-color:#9932cc}.mw-parser-output table.ambox-protection{border-left-color:#a2a9b1}html body.mediawiki .mw-parser-output .ambox.mbox-small{clear:right;float:right;margin:4px 0 4px 1em;box-sizing:border-box;width:238px;font-size:88%;line-height:1.25em}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;box-sizing:border-box;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}</style><table class="ambox-notice box-Notice ambox plainlinks metadata" role="presentation"><tbody><tr><td class="mbox-image"><div style="width:52px"><span typeof="mw:File"><span><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/e/ec/OOjs_UI_icon_information-progressive.svg/40px-OOjs_UI_icon_information-progressive.svg.png" decoding="async" width="40" height="40" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/ec/OOjs_UI_icon_information-progressive.svg/60px-OOjs_UI_icon_information-progressive.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/ec/OOjs_UI_icon_information-progressive.svg/80px-OOjs_UI_icon_information-progressive.svg.png 2x" data-file-width="20" data-file-height="20"/></span></span></div></td><td class="mbox-text"><div class="mbox-text-span">By default <code>docker-pkg</code> does not use caching of image layers. If you want to use cached layers for quicker rebuilding of images, use the <code>--use-cache</code> option.</div></td></tr></tbody></table><p>Example output: </p><pre>== Step 0: scanning dockerfiles == Will build the following images: * docker-registry.wikimedia.org/releng/ci-stretch:0.1.0 * docker-registry.wikimedia.org/releng/operations-puppet:0.1.0 * docker-registry.wikimedia.org/releng/ci-jessie:0.3.0 == Step 1: building images == => Building image docker-registry.wikimedia.org/releng/ci-stretch:0.1.0 => Building image docker-registry.wikimedia.org/releng/operations-puppet:0.1.0 => Building image docker-registry.wikimedia.org/releng/ci-jessie:0.3.0 == Step 2: publishing == NOT publishing images as we have no auth setup == Build done! == You can see the logs at ./docker-pkg-build.log </pre> <div class="mw-heading mw-heading3"><h3 id="Troubleshooting" data-mw-thread-id="h-Troubleshooting-Build_images_locally"><span data-mw-comment-start="" id="h-Troubleshooting-Build_images_locally"></span>Troubleshooting<span data-mw-comment-end="h-Troubleshooting-Build_images_locally"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=6" title="Edit section: Troubleshooting"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading4"><h4 id="Could_not_find_a_suitable_TLS_CA_certificate_bundle" data-mw-thread-id="h-Could_not_find_a_suitable_TLS_CA_certificate_bundle-Troubleshooting"><span data-mw-comment-start="" id="h-Could_not_find_a_suitable_TLS_CA_certificate_bundle-Troubleshooting"></span>Could not find a suitable TLS CA certificate bundle<span data-mw-comment-end="h-Could_not_find_a_suitable_TLS_CA_certificate_bundle-Troubleshooting"></span></h4><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=7" title="Edit section: Could not find a suitable TLS CA certificate bundle"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The following error is known to affect macOS: <a href="https://gerrit.wikimedia.org/r/500417" class="extiw" title="gerrit:500417">gerrit:500417</a> </p> <pre>ERROR - Could not load image in integration/config/dockerfiles/…: Could not find a suitable TLS CA certificate bundle, invalid path: /etc/ssl/certs/ca-certificates.crt (builder.py:244) Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/requests/adapters.py", line 228, in cert_verify "invalid path: {}".format(cert_loc)) OSError: Could not find a suitable TLS CA certificate bundle, invalid path: /etc/ssl/certs/ca-certificates.crt </pre> <p>To workaround this issue, run the following in your Terminal window before running a <code>docker-pkg</code> command: </p> <pre>$ export REQUESTS_CA_BUNDLE=; $ docker-pkg … </pre> <div class="mw-heading mw-heading4"><h4 id="No_images_are_built" data-mw-thread-id="h-No_images_are_built-Troubleshooting"><span data-mw-comment-start="" id="h-No_images_are_built-Troubleshooting"></span>No images are built<span data-mw-comment-end="h-No_images_are_built-Troubleshooting"></span></h4><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=8" title="Edit section: No images are built"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>If you don't see any output in between "Step 1: building images" and "Step 2: publishing", this means docker-pkg did not find any images or did not find images that have unbuilt newer versions. Review the following: </p> <ul><li>"git status" in integration/config should show a change to the changelog file for the image you are updating.</li> <li>Make sure that the name used in the changelog file is correct, and matches your intended image name.</li> <li>Look for any errors in "docker-pkg-build.log".</li> <li>Make sure that you ran "docker-pkg -c dockerfiles/config.yaml dockerfiles" and not "docker-pkg -c dockerfiles/config.yaml dockerfiles/path-to-image"; docker-pkg will figure out which images to build by detecting modifications to the changelog.</li></ul> <div class="mw-heading mw-heading4"><h4 id="Manifest_not_found" data-mw-thread-id="h-Manifest_not_found-Troubleshooting"><span data-mw-comment-start="" id="h-Manifest_not_found-Troubleshooting"></span>Manifest not found<span data-mw-comment-end="h-Manifest_not_found-Troubleshooting"></span></h4><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=9" title="Edit section: Manifest not found"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>When adding a new version of an image, and also incrementing versions of dependant images, you may encounter the following error: </p> <pre>Build failed: manifest for example/my-parent-image:0.4.0 not found </pre> <p>This happens because docker-pkg (by default) fetches parent images from wikimedia.org and only rebuilds the child locally. If you are updating a parent from 0.3.0 to 0.4.0 and also incrementing the child images' versions, the parent will update fine, but then it will fail to build the children, despite the newer versions existing locally. </p><p>To mitigate this, pass <code>--no-pull</code>. Like so: </p> <pre>docker-pkg --no-pull -c dockerfiles/config.yaml dockerfiles </pre> <div class="mw-heading mw-heading3"><h3 id="Adjusting_an_image" data-mw-thread-id="h-Adjusting_an_image-Build_images_locally"><span data-mw-comment-start="" id="h-Adjusting_an_image-Build_images_locally"></span>Adjusting an image<span data-mw-comment-end="h-Adjusting_an_image-Build_images_locally"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=10" title="Edit section: Adjusting an image"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Sometimes you need to edit an image, <i>e.g.</i> to add a new dependency or to update an existing one. </p><p>To do this, make your changes to the image's <code>dockerfiles/ImageName/Dockerfile.template</code> file, and then run the following command: </p> <pre>$ docker-pkg -c dockerfiles/config.yaml --info update \ --reason "Briefly explain your change" \ --version NewImageVersion \ ImageName \ dockerfiles/ </pre> <p>This will add a properly-formatted entry in the <code>changelog</code> of the image you're changing, and all dependent images. You can then locally build the images to check that they build correctly, and the <code>debug-image</code> command to check that it works as intended. Once you're happy with your fix, bundle the changes into a git commit for review and merging. </p> <div class="mw-heading mw-heading3"><h3 id="Manage_local_images" data-mw-thread-id="h-Manage_local_images-Build_images_locally"><span data-mw-comment-start="" id="h-Manage_local_images-Build_images_locally"></span>Manage local images<span data-mw-comment-end="h-Manage_local_images-Build_images_locally"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=11" title="Edit section: Manage local images"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>List local images: </p> <pre>$ docker images </pre> <p>Remove local images from wikimedia.org (<a rel="nofollow" class="external text" href="https://stackoverflow.com/a/49496767/319266">source</a>): </p> <pre>$ docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'wikimedia.org') </pre> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Deploy_images" data-mw-thread-id="h-Deploy_images"><span data-mw-comment-start="" id="h-Deploy_images"></span>Deploy images<span data-mw-comment-end="h-Deploy_images"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=12" title="Edit section: Deploy images"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Deploy_images","replies":[]}}--></div> <p>Deploying a change to CI Dockerfiles requires shell access to the Docker registry on <code>contint1001.wikimedia.org</code> (shell group: contint-docker). Ask Release Engineering team for help. </p><p>The change to <code>integration/config</code> repository should first be merged in Gerrit. </p><p>After that, deploy it to the CI infrastructure. To do this, in the <code>integration/config</code> directory, run: <code>./fab deploy_docker</code>. This connects to the <code>contint1001.wikimedia.org</code> server and instruct it to build newer versions of Docker images in <code>integration/config</code>. </p> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Testing_new_images" data-mw-thread-id="h-Testing_new_images"><span data-mw-comment-start="" id="h-Testing_new_images"></span>Testing new images<span data-mw-comment-end="h-Testing_new_images"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=13" title="Edit section: Testing new images"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Testing_new_images","replies":["h-Test_an_image_locally-Testing_new_images","h-Debug_an_image_locally-Testing_new_images","h-Test_an_image_in_CI-Testing_new_images"]}}--></div> <div class="mw-heading mw-heading3"><h3 id="Test_an_image_locally" data-mw-thread-id="h-Test_an_image_locally-Testing_new_images"><span data-mw-comment-start="" id="h-Test_an_image_locally-Testing_new_images"></span>Test an image locally<span data-mw-comment-end="h-Test_an_image_locally-Testing_new_images"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=14" title="Edit section: Test an image locally"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Use the below steps to test a docker image locally. This can be unpublished image you've built locally with <code>docker-pkg</code>, or one that was pulled from the wikimedia.org repository. </p><p>Note that the below uses urls for the names of the images, but these refer to the ones you have locally (either created or pulled), they do not need to have been deployed or uploaded there yet. You can list the images you have locally using the <code>docker images</code> command. </p> <pre>$ cd my-gerrit-project $ mkdir -m 777 cache log $ docker run \ --rm --tty \ --volume /"$(pwd)"/log://var/lib/jenkins/log \ --volume /"$(pwd)"/cache://cache \ --volume /"$(pwd)"://src \ docker-registry.wikimedia.org/releng/node10-test:0.3.0 </pre> <div class="mw-heading mw-heading3"><h3 id="Debug_an_image_locally" data-mw-thread-id="h-Debug_an_image_locally-Testing_new_images"><span data-mw-comment-start="" id="h-Debug_an_image_locally-Testing_new_images"></span>Debug an image locally<span data-mw-comment-end="h-Debug_an_image_locally-Testing_new_images"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=15" title="Edit section: Debug an image locally"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The <code><a href="https://gerrit.wikimedia.org/r/plugins/gitiles/integration/config/%2B/master/dockerfiles/debug-image" class="extiw" title="gerrit:plugins/gitiles/integration/config/+/master/dockerfiles/debug-image">debug-image</a></code> script can be used to run a RelEng docker image locally. </p> <pre>$ cd integration-config/dockerfiles $ ./debug-image node10-test nobody@bfee2a999b20:/src$ </pre> <p>The default behaviour for <code>docker run</code> is to start the container and execute the entrypoint/cmd specified in the Dockerfile. To inspect the container instead, specify <code>-i</code> to make it interactive, and override <code>--entrypoint</code> to a shell (such as <code>/bin/bash</code>). For example: </p> <pre>$ cd my-gerrit-project/ $ docker run \ --rm --tty \ --interactive --entrypoint /bin/bash \ docker-registry.wikimedia.org/releng/node10-test:0.3.0 nobody@5f4cdb0ab167:/src$ nobody@5f4cdb0ab167:/src$ env CHROMIUM_FLAGS=--no-sandbox XDG_CACHE_HOME=/cache </pre> <div class="mw-heading mw-heading3"><h3 id="Test_an_image_in_CI" data-mw-thread-id="h-Test_an_image_in_CI-Testing_new_images"><span data-mw-comment-start="" id="h-Test_an_image_in_CI-Testing_new_images"></span>Test an image in CI<span data-mw-comment-end="h-Test_an_image_in_CI-Testing_new_images"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=16" title="Edit section: Test an image in CI"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Once the new image is pushed to docker hub it should be tested on one of the <code>integration-agent-docker-100x</code> machines. As of August 2017 there are 4 such machines: <code>integration-agent-docker-100[1:4]</code>. </p><p>To test </p> <ol><li>ssh to one of the <code>integration-agent-docker</code> machines and <code>su</code> to the <code>jenkins-deploy</code> user.<div class="mw-highlight mw-highlight-lang-sh mw-content-ltr" dir="ltr"><pre><span></span>you@laptop:~$<span class="w"> </span>ssh<span class="w"> </span>integration-agent-docker-1004 you@integration-agent-docker:~$<span class="w"> </span>sudo<span class="w"> </span>su<span class="w"> </span>-<span class="w"> </span>jenkins-deploy </pre></div></li> <li>Create a new directory and an environment file that contains the information passed from Jenkins in the form of <code>ZUUL_*</code> variables<div class="mw-highlight mw-highlight-lang-sh mw-content-ltr" dir="ltr"><pre><span></span>jenkins-deploy@integration-agent-docker:~$<span class="w"> </span>mkdir<span class="w"> </span>docker-test<span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="nb">cd</span><span class="w"> </span>docker-test jenkins-deploy@integration-agent-docker:docker-test$<span class="w"> </span><span class="nb">printf</span><span class="w"> </span><span class="s2">"ZUUL_PROJECT=operations/puppet\nZUUL_URL=git://contint2001.wikimedia.org\nZUUL_REF=refs/zuul/production/Ze59ae894f02248d9888835dbaa14dfdf\nZUUL_COMMIT=045fcb14e9fd7885957d900b9a97c883fc5cd26d\n"</span><span class="w"> </span>><span class="w"> </span>.env </pre></div></li> <li>Run the new docker image with the environment file and ensure that it runs correctly<div class="mw-highlight mw-highlight-lang-sh mw-content-ltr" dir="ltr"><pre><span></span>jenkins-deploy@integration-agent-docker:docker-test$<span class="w"> </span>mkdir<span class="w"> </span>log jenkins-deploy@integration-agent-docker:docker-test$<span class="w"> </span>docker<span class="w"> </span>run<span class="w"> </span>--rm<span class="w"> </span>-it<span class="w"> </span>--env-file<span class="w"> </span>.env<span class="w"> </span>--volume<span class="w"> </span><span class="s2">"</span><span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span><span class="s2">"</span>/log:/var/lib/jenkins/log<span class="w"> </span>contint/operations-puppet </pre></div></li> <li>If everything is working as anticipated, update JJB with the Dockerfile version that has been pushed to the Wikimedia Docker registry.</li></ol> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Jenkins_Agent" data-mw-thread-id="h-Jenkins_Agent"><span data-mw-comment-start="" id="h-Jenkins_Agent"></span>Jenkins Agent<span data-mw-comment-end="h-Jenkins_Agent"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Docker&action=edit&section=17" title="Edit section: Jenkins Agent"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Jenkins_Agent","replies":[]}}--></div> <p>To create an additional Jenkins node that can run Docker-based Jenkins jobs. </p> <ul><li>Create a new VM instance in Horizon with a name following the pattern 'integration-agent-docker-100X'.</li> <li>Wait for the first puppet run to complete and log in.</li> <li>Run the following to finish switching to the integration puppet master:</li></ul> <pre>sudo rm -fR /var/lib/puppet/ssl sudo mkdir -p /var/lib/puppet/client/ssl/certs sudo puppet agent -tv sudo cp /var/lib/puppet/ssl/certs/ca.pem /var/lib/puppet/client/ssl/certs sudo puppet agent -tv </pre> <ul><li>Add the 'role::ci::slave::labs::docker' class to the instance in horizon <ul><li>For larger instance types (<code>m1.xlarge</code> and <code>bigram</code>) specify <code>true</code> for the <code>docker_lvm_volume</code> parameter.</li></ul></li> <li>Run a final update for puppet 'sudo puppet agent -tv'</li> <li>Pull an initial set of docker images onto the host (using latest tags) to avoid doing this in test runs:</li></ul> <pre>sudo docker pull docker-registry.wikimedia.org/releng/castor:latest sudo docker pull docker-registry.wikimedia.org/releng/quibble-stretch:latest sudo docker pull docker-registry.wikimedia.org/wikimedia-stretch:latest </pre> <ul><li>Add the agent in the jenkins UI</li></ul> <!-- NewPP limit report Parsed by mw‐web.eqiad.main‐59776cd8c7‐mf7d9 Cached time: 20241120215319 Cache expiry: 2592000 Reduced expiry: false Complications: [show‐toc] DiscussionTools time usage: 0.012 seconds CPU time usage: 0.076 seconds Real time usage: 0.303 seconds Preprocessor visited node count: 166/1000000 Post‐expand include size: 1533/2097152 bytes Template argument size: 180/2097152 bytes Highest expansion depth: 6/100 Expensive parser function count: 9/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 6815/5000000 bytes Lua time usage: 0.026/10.000 seconds Lua memory usage: 659936/52428800 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 48.646 1 -total 100.00% 48.646 1 Template:Notice 95.04% 46.235 1 Template:Ambox --> <!-- Saved in parser cache with key mediawikiwiki:pcache:idhash:705452-0!canonical and timestamp 20241120215319 and revision id 6862386. Rendering was triggered because: diff-page --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://www.mediawiki.org/w/index.php?title=Continuous_integration/Docker&oldid=6862386">https://www.mediawiki.org/w/index.php?title=Continuous_integration/Docker&oldid=6862386</a>"</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Special:Categories" title="Special:Categories">Category</a>: <ul><li><a href="/wiki/Category:Continuous_integration" title="Category:Continuous integration">Continuous integration</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 20 November 2024, at 21:50.</li> <li id="footer-info-copyright">Text is available under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-ShareAlike License</a>; additional terms may apply. Text in <a class="external text" href="https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents">the Help: namespace</a> is available under the <a rel="nofollow" class="external text" href="https://creativecommons.org/publicdomain/zero/1.0/">Creative Commons CC0 License</a>. By using this site, you agree to the <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy Policy</a>.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Project:About">About mediawiki.org</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Project:General_disclaimer">Disclaimers</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/www.mediawiki.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//m.mediawiki.org/w/index.php?title=Continuous_integration/Docker&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-f69cdc8f6-zpn8c","wgBackendResponseTime":109,"wgDiscussionToolsPageThreads":[{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Overview","replies":[]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Build_images_locally","replies":[{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Installing_docker-pkg-Build_images_locally","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Download_existing_images-Build_images_locally","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Build_the_images-Build_images_locally","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Troubleshooting-Build_images_locally","replies":[{"headingLevel":4,"name":"h-","type":"heading","level":0,"id":"h-Could_not_find_a_suitable_TLS_CA_certificate_bundle-Troubleshooting","replies":[]},{"headingLevel":4,"name":"h-","type":"heading","level":0,"id":"h-No_images_are_built-Troubleshooting","replies":[]},{"headingLevel":4,"name":"h-","type":"heading","level":0,"id":"h-Manifest_not_found-Troubleshooting","replies":[]}]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Adjusting_an_image-Build_images_locally","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Manage_local_images-Build_images_locally","replies":[]}]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Deploy_images","replies":[]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Testing_new_images","replies":[{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Test_an_image_locally-Testing_new_images","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Debug_an_image_locally-Testing_new_images","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Test_an_image_in_CI-Testing_new_images","replies":[]}]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Jenkins_Agent","replies":[]}],"wgPageParseReport":{"discussiontools":{"limitreport-timeusage":"0.012"},"limitreport":{"cputime":"0.076","walltime":"0.303","ppvisitednodes":{"value":166,"limit":1000000},"postexpandincludesize":{"value":1533,"limit":2097152},"templateargumentsize":{"value":180,"limit":2097152},"expansiondepth":{"value":6,"limit":100},"expensivefunctioncount":{"value":9,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":6815,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 48.646 1 -total","100.00% 48.646 1 Template:Notice"," 95.04% 46.235 1 Template:Ambox"]},"scribunto":{"limitreport-timeusage":{"value":"0.026","limit":"10.000"},"limitreport-memusage":{"value":659936,"limit":52428800}},"cachereport":{"origin":"mw-web.eqiad.main-59776cd8c7-mf7d9","timestamp":"20241120215319","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>