| |
| |
| |
| |
| <!DOCTYPE html> |
| <!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> |
| <!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> |
| <html xmlns="http://www.w3.org/1999/xhtml"> |
| <head> |
| <meta charset="utf-8" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <title>Production Deployment — Airflow Documentation</title> |
| <link rel="stylesheet" href="_static/_gen/css/main.min.css" type="text/css" /> |
| <link rel="stylesheet" type="text/css" href="_static/copybutton.css" /> |
| <link rel="stylesheet" type="text/css" href="_static/_gen/css/main-custom.min.css" /> |
| <link rel="stylesheet" type="text/css" href="_static/graphviz.css" /> |
| <link rel="shortcut icon" href="_static/pin_32.png"/> |
| <link rel="index" title="Index" href="genindex.html" /> |
| <link rel="search" title="Search" href="search.html" /> |
| <link rel="next" title="Backport Providers" href="backport-providers.html" /> |
| <link rel="prev" title="Best Practices" href="best-practices.html" /> |
| <script type="application/javascript"> |
| var doNotTrack = false; |
| window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; |
| ga('create', 'UA-140539454-1', 'auto'); |
| ga('send', 'pageview'); |
| </script> |
| <script async src='https://www.google-analytics.com/analytics.js'></script> |
| |
| |
| </head><body class="td-section"> |
| |
| |
| <header> |
| |
| <nav class="js-navbar-scroll navbar"> |
| <div class="navbar__icon-container"> |
| <a href="/"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60"> |
| <defs> |
| <clipPath id="clip-path"> |
| <path id="Rectangle_1" d="M0 0h155.314v60H0z" fill="none" data-name="Rectangle 1"></path> |
| </clipPath> |
| </defs> |
| <g id="logo" transform="translate(-1305 -780.355)"> |
| <g id="Group_2" clip-path="url(#clip-path)" data-name="Group 2" transform="translate(1305 780.355)"> |
| <g id="Group_1" data-name="Group 1" transform="translate(.486 .486)"> |
| <path id="Path_1" d="M1307.562 880.867l28.187-28.893a.521.521 0 0 0 .063-.666c-1.714-2.393-4.877-2.808-6.049-4.416-3.472-4.763-4.353-7.459-5.845-7.292a.456.456 0 0 0-.271.143l-10.182 10.438c-5.858 6-6.7 19.225-6.852 30.3a.552.552 0 0 0 .949.386z" fill="#017cee" data-name="Path 1" transform="translate(-1306.613 -822.232)"></path> |
| <path id="Path_2" d="M1405.512 908.489l-28.893-28.189a.521.521 0 0 0-.667-.063c-2.393 1.715-2.808 4.877-4.416 6.049-4.763 3.472-7.459 4.353-7.292 5.845a.456.456 0 0 0 .143.27l10.438 10.182c6 5.858 19.225 6.7 30.3 6.852a.552.552 0 0 0 .387-.946z" fill="#00ad46" data-name="Path 2" transform="translate(-1346.876 -850.567)"></path> |
| <path id="Path_3" d="M1373.909 902.252c-3.28-3.2-4.8-9.53 1.486-22.583-10.219 4.567-13.8 10.57-12.039 12.289z" fill="#04d659" data-name="Path 3" transform="translate(-1345.96 -850.233)"></path> |
| <path id="Path_4" d="M1433.132 782.359l-28.186 28.893a.52.52 0 0 0-.063.666c1.715 2.393 4.876 2.808 6.049 4.416 3.472 4.763 4.354 7.459 5.845 7.292a.454.454 0 0 0 .271-.143l10.182-10.438c5.858-6 6.7-19.225 6.852-30.3a.553.553 0 0 0-.95-.386z" fill="#00c7d4" data-name="Path 4" transform="translate(-1375.21 -782.123)"></path> |
| <path id="Path_5" d="M1426.9 881.155c-3.2 3.28-9.53 4.8-22.584-1.486 4.567 10.219 10.57 13.8 12.289 12.039z" fill="#11e1ee" data-name="Path 5" transform="translate(-1374.875 -850.233)"></path> |
| <path id="Path_6" d="M1307 782.919l28.893 28.186a.521.521 0 0 0 .666.063c2.393-1.715 2.808-4.877 4.416-6.049 4.763-3.472 7.459-4.353 7.292-5.845a.459.459 0 0 0-.143-.271l-10.438-10.182c-6-5.858-19.225-6.7-30.3-6.852a.552.552 0 0 0-.386.95z" fill="#e43921" data-name="Path 6" transform="translate(-1306.766 -781.97)"></path> |
| <path id="Path_7" d="M1405.8 804.711c3.28 3.2 4.8 9.53-1.486 22.584 10.219-4.567 13.8-10.571 12.039-12.289z" fill-rule="evenodd" fill="#ff7557" data-name="Path 7" transform="translate(-1374.875 -797.859)"></path> |
| <path id="Path_8" d="M1329.355 849.266c3.2-3.28 9.53-4.8 22.584 1.486-4.567-10.219-10.57-13.8-12.289-12.039z" fill="#0cb6ff" data-name="Path 8" transform="translate(-1322.503 -821.316)"></path> |
| <circle id="Ellipse_1" cx="1.26" cy="1.26" r="1.26" fill="#4a4848" data-name="Ellipse 1" transform="translate(28.18 28.171)"></circle> |
| <path id="Path_9" d="M1527.558 827.347a.229.229 0 0 1-.223-.223.458.458 0 0 1 .011-.123l2.766-7.214a.346.346 0 0 1 .357-.245h.758a.348.348 0 0 1 .357.245l2.754 7.214.022.123a.228.228 0 0 1-.223.223h-.568a.288.288 0 0 1-.19-.056.352.352 0 0 1-.089-.134l-.613-1.583h-3.657l-.613 1.583a.317.317 0 0 1-.1.134.269.269 0 0 1-.178.056zm4.795-2.732l-1.505-3.958-1.505 3.958zm3.322 4.85a.258.258 0 0 1-.189-.078.241.241 0 0 1-.067-.178v-7.4a.241.241 0 0 1 .067-.178.258.258 0 0 1 .189-.078h.513a.268.268 0 0 1 .256.256v.49a2.118 2.118 0 0 1 1.828-.858 2.092 2.092 0 0 1 1.751.736 3.135 3.135 0 0 1 .636 1.9q.011.122.011.379t-.011.379a3.168 3.168 0 0 1-.636 1.9 2.111 2.111 0 0 1-1.751.736 2.154 2.154 0 0 1-1.806-.836v2.587a.241.241 0 0 1-.067.178.223.223 0 0 1-.179.078zm2.364-2.91a1.324 1.324 0 0 0 1.149-.491 2.266 2.266 0 0 0 .4-1.293q.011-.111.011-.323 0-2.107-1.562-2.107a1.365 1.365 0 0 0-1.159.513 2.111 2.111 0 0 0-.412 1.2l-.012.424.012.435a1.862 1.862 0 0 0 .424 1.149 1.4 1.4 0 0 0 1.148.493zm5.628.9a2.329 2.329 0 0 1-1.015-.223 1.94 1.94 0 0 1-.747-.6 1.487 1.487 0 0 1-.268-.859 1.459 1.459 0 0 1 .6-1.2 3.4 3.4 0 0 1 1.65-.624l1.661-.234v-.323q0-1.137-1.3-1.137a1.4 1.4 0 0 0-.8.212 1.376 1.376 0 0 0-.468.48.305.305 0 0 1-.089.145.18.18 0 0 1-.134.045h-.48a.23.23 0 0 1-.245-.245 1.17 1.17 0 0 1 .245-.6 1.931 1.931 0 0 1 .747-.591 2.7 2.7 0 0 1 1.238-.256 2.351 2.351 0 0 1 1.8.591 2.032 2.032 0 0 1 .547 1.45v3.613a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.513a.233.233 0 0 1-.257-.256v-.479a1.923 1.923 0 0 1-.714.6 2.557 2.557 0 0 1-1.203.237zm.234-.836a1.579 1.579 0 0 0 1.182-.469 1.881 1.881 0 0 0 .468-1.371v-.312l-1.293.19a2.918 2.918 0 0 0-1.193.379.761.761 0 0 0-.4.658.784.784 0 0 0 .368.691 1.585 1.585 0 0 0 .867.237zm6.643.836a2.556 2.556 0 0 1-1.873-.669 2.738 2.738 0 0 1-.714-1.9l-.011-.446.011-.446a2.7 2.7 0 0 1 .714-1.885 2.531 2.531 0 0 1 1.873-.68 2.917 2.917 0 0 1 1.36.29 2.077 2.077 0 0 1 .825.714 1.7 1.7 0 0 1 .3.848.2.2 0 0 1-.067.178.281.281 0 0 1-.19.067h-.535a.265.265 0 0 1-.168-.045.458.458 0 0 1-.111-.178 1.428 1.428 0 0 0-.535-.758 1.516 1.516 0 0 0-.87-.234 1.45 1.45 0 0 0-1.1.435 1.952 1.952 0 0 0-.435 1.3l-.011.4.011.379a1.969 1.969 0 0 0 .435 1.316 1.446 1.446 0 0 0 1.1.424 1.577 1.577 0 0 0 .87-.223 1.493 1.493 0 0 0 .535-.769.458.458 0 0 1 .111-.178.228.228 0 0 1 .168-.056h.535a.258.258 0 0 1 .19.078.2.2 0 0 1 .067.178 1.75 1.75 0 0 1-.3.847 2.078 2.078 0 0 1-.825.714 2.876 2.876 0 0 1-1.361.302zm4.078-.112a.233.233 0 0 1-.257-.256v-7.4a.241.241 0 0 1 .067-.178.259.259 0 0 1 .19-.078h.557a.267.267 0 0 1 .257.256v2.6a2.167 2.167 0 0 1 .758-.624 2.353 2.353 0 0 1 1.082-.223 2.067 2.067 0 0 1 1.661.691 2.642 2.642 0 0 1 .6 1.818v3.144a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.557a.233.233 0 0 1-.256-.256V824a1.775 1.775 0 0 0-.39-1.227 1.387 1.387 0 0 0-1.1-.435 1.481 1.481 0 0 0-1.126.446 1.7 1.7 0 0 0-.412 1.215v3.088a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067zm8.846.112a2.466 2.466 0 0 1-1.84-.7 2.938 2.938 0 0 1-.747-1.94l-.011-.379.011-.368a2.953 2.953 0 0 1 .758-1.918 2.7 2.7 0 0 1 3.735.078 3.114 3.114 0 0 1 .68 2.119v.19a.257.257 0 0 1-.078.189.241.241 0 0 1-.178.067h-3.858v.1a2.11 2.11 0 0 0 .435 1.238 1.332 1.332 0 0 0 1.081.5 1.563 1.563 0 0 0 .836-.2 1.7 1.7 0 0 0 .491-.435.6.6 0 0 1 .145-.156.391.391 0 0 1 .19-.033h.547a.252.252 0 0 1 .167.056.192.192 0 0 1 .067.156.975.975 0 0 1-.312.591 2.51 2.51 0 0 1-.859.6 3.049 3.049 0 0 1-1.26.248zm1.527-3.434v-.033a1.817 1.817 0 0 0-.424-1.249 1.512 1.512 0 0 0-2.23 0 1.883 1.883 0 0 0-.4 1.249v.033z" fill="#51504f" data-name="Path 9" transform="translate(-1460.834 -808.144)"></path> |
| <path id="Path_10" d="M1527.2 827.081l-.061.061zm-.056-.279l-.08-.031zm2.766-7.214l.08.031zm1.472 0l-.081.029zm2.754 7.214l.084-.015a.064.064 0 0 0 0-.015zm.022.123h.086v-.015zm-.067.156l.06.061zm-.914.011l-.061.061.006.005zm-.089-.134l.081-.027zm-.613-1.583l.08-.031a.086.086 0 0 0-.08-.055zm-3.657 0v-.086a.086.086 0 0 0-.08.055zm-.613 1.583l-.08-.031zm-.1.134l.055.066zm4.047-2.676v.086a.086.086 0 0 0 .08-.116zm-1.505-3.958l.08-.03a.086.086 0 0 0-.16 0zm-1.505 3.958l-.08-.03a.086.086 0 0 0 .08.116zm-1.784 2.646a.128.128 0 0 1-.1-.042l-.122.121a.3.3 0 0 0 .217.092zm-.1-.042a.129.129 0 0 1-.042-.1h-.171a.3.3 0 0 0 .092.217zm-.042-.1a.38.38 0 0 1 .007-.1l-.163-.054a.514.514 0 0 0-.016.15zm.005-.092l2.765-7.214-.16-.061-2.765 7.214zm2.766-7.216a.283.283 0 0 1 .1-.143.3.3 0 0 1 .174-.046v-.172a.47.47 0 0 0-.271.076.453.453 0 0 0-.166.226zm.276-.189h.758v-.172h-.758zm.758 0a.3.3 0 0 1 .175.046.283.283 0 0 1 .1.143l.161-.059a.451.451 0 0 0-.166-.226.47.47 0 0 0-.272-.076zm.277.19l2.754 7.214.16-.061-2.754-7.214zm2.75 7.2l.022.123.169-.031-.022-.123zm.021.107a.13.13 0 0 1-.042.1l.121.121a.3.3 0 0 0 .092-.217zm-.042.1a.13.13 0 0 1-.1.042v.171a.3.3 0 0 0 .217-.092zm-.1.042h-.568v.171h.568zm-.568 0a.206.206 0 0 1-.135-.036l-.11.132a.373.373 0 0 0 .245.076zm-.129-.031a.262.262 0 0 1-.069-.1l-.162.054a.431.431 0 0 0 .11.167zm-.07-.1l-.613-1.584-.16.062.613 1.583zm-.693-1.638h-3.657v.171h3.657zm-3.737.055l-.614 1.584.16.062.613-1.583zm-.615 1.587a.235.235 0 0 1-.075.1l.111.13a.4.4 0 0 0 .126-.172zm-.074.1a.185.185 0 0 1-.124.036v.171a.354.354 0 0 0 .233-.076zm-.124.036h-.569v.171h.569zm4.306-2.677l-1.505-3.958-.16.061 1.505 3.958zm-1.666-3.958l-1.505 3.958.16.061 1.505-3.958zm-1.425 4.075h3.01v-.171h-3.01zm6.143 4.687l-.06.061zm0-7.761l.061.061zm.881 0l-.065.056.01.009zm.078.669h-.086a.086.086 0 0 0 .155.051zm3.579-.123l-.067.053zm.636 1.9h-.086zm0 .758l-.085-.007zm-.636 1.9l.067.054zm-3.557-.1l.068-.052a.086.086 0 0 0-.154.052zm-.067 2.765l-.061-.06zm2.787-3.323l-.069-.051zm.4-1.293l-.085-.008v.005zm-2.709-1.918l-.068-.052zm-.413 1.2h-.086zm-.011.423h-.085zm.011.435h-.086zm.424 1.149l.066-.054zm-1.216 3.315a.173.173 0 0 1-.129-.053l-.121.121a.342.342 0 0 0 .25.1zm-.129-.053a.157.157 0 0 1-.042-.118h-.172a.325.325 0 0 0 .092.239zm-.042-.118v-7.4h-.172v7.4zm0-7.4a.157.157 0 0 1 .042-.118l-.121-.121a.324.324 0 0 0-.092.239zm.042-.118a.173.173 0 0 1 .129-.053v-.172a.342.342 0 0 0-.25.1zm.129-.053h.513v-.172h-.513zm.513 0a.137.137 0 0 1 .113.048l.13-.111a.309.309 0 0 0-.244-.108zm.123.058a.137.137 0 0 1 .048.113h.171a.309.309 0 0 0-.108-.243zm.048.113v.49h.171v-.49zm.155.541a2.033 2.033 0 0 1 1.759-.823v-.171a2.2 2.2 0 0 0-1.9.894zm1.759-.823a2.007 2.007 0 0 1 1.683.7l.135-.106a2.177 2.177 0 0 0-1.818-.768zm1.683.7a3.045 3.045 0 0 1 .617 1.845l.171-.007a3.218 3.218 0 0 0-.654-1.946zm.617 1.85c.007.078.011.2.011.372h.171c0-.171 0-.3-.012-.387zm.011.372c0 .171 0 .294-.011.372l.17.015c.008-.086.012-.216.012-.387zm-.011.376a3.08 3.08 0 0 1-.617 1.846l.134.106a3.25 3.25 0 0 0 .654-1.945zm-.617 1.845a2.025 2.025 0 0 1-1.683.7v.171a2.2 2.2 0 0 0 1.817-.768zm-1.683.7a2.068 2.068 0 0 1-1.739-.8l-.136.1a2.239 2.239 0 0 0 1.874.87zm-1.892-.75v2.587h.172v-2.587zm0 2.587a.156.156 0 0 1-.042.118l.121.121a.325.325 0 0 0 .092-.239zm-.046.123a.138.138 0 0 1-.114.048v.172a.308.308 0 0 0 .244-.108zm-.114.048h-.546v.172h.546zm1.817-2.739a1.408 1.408 0 0 0 1.218-.526l-.138-.1a1.24 1.24 0 0 1-1.079.455zm1.217-.525a2.355 2.355 0 0 0 .419-1.341l-.171-.007a2.182 2.182 0 0 1-.385 1.246zm.418-1.336c.008-.079.012-.19.012-.332h-.172c0 .14 0 .245-.011.315zm.012-.332a2.726 2.726 0 0 0-.407-1.632 1.448 1.448 0 0 0-1.24-.562v.171a1.278 1.278 0 0 1 1.1.492 2.565 2.565 0 0 1 .374 1.53zm-1.647-2.193a1.452 1.452 0 0 0-1.228.547l.136.1a1.282 1.282 0 0 1 1.091-.479zm-1.228.547a2.2 2.2 0 0 0-.43 1.252l.172.008a2.028 2.028 0 0 1 .4-1.157zm-.43 1.254l-.011.424h.171l.011-.424zm-.011.428l.011.435h.172l-.011-.435zm.011.436a1.95 1.95 0 0 0 .443 1.2l.133-.109a1.776 1.776 0 0 1-.4-1.1zm.443 1.2a1.484 1.484 0 0 0 1.214.522v-.171a1.314 1.314 0 0 1-1.082-.459zm5.828 1.117l.037-.077zm-.747-.6l-.07.049zm.335-2.063l.052.068zm1.65-.624l.012.085zm1.661-.234l.012.085a.086.086 0 0 0 .074-.085zm-2.107-1.249l.046.072zm-.468.48l-.075-.042a.083.083 0 0 0-.006.015zm-.089.145l-.054-.067-.007.006zm-.792-.022l-.065.056.009.009zm-.067-.178h-.086zm.245-.6l-.07-.049zm.747-.591l.038.077zm3.033.334l-.063.058zm.468 5.252l.06.061zm-.881 0l-.065.056a.043.043 0 0 0 .009.009zm-.067-.669h.086a.086.086 0 0 0-.156-.048zm-.714.6l-.04-.076zm.223-1.059l-.062-.06zm.468-1.684h.086a.086.086 0 0 0-.1-.085zm-1.293.189l.012.085zm-1.193.379l.046.072zm-.033 1.349l-.047.071zm.635.985a2.241 2.241 0 0 1-.978-.215l-.074.155a2.412 2.412 0 0 0 1.051.231zm-.978-.215a1.859 1.859 0 0 1-.715-.576l-.138.1a2.024 2.024 0 0 0 .779.629zm-.713-.573a1.4 1.4 0 0 1-.253-.81h-.172a1.571 1.571 0 0 0 .283.907zm-.253-.81a1.374 1.374 0 0 1 .569-1.136l-.105-.135a1.544 1.544 0 0 0-.635 1.272zm.569-1.137a3.316 3.316 0 0 1 1.609-.607l-.024-.17a3.481 3.481 0 0 0-1.691.642zm1.609-.607l1.661-.234-.024-.17-1.662.234zm1.735-.319v-.323h-.171v.323zm0-.323a1.156 1.156 0 0 0-.355-.917 1.536 1.536 0 0 0-1.035-.306v.172a1.37 1.37 0 0 1 .922.263.986.986 0 0 1 .3.788zm-1.39-1.223a1.486 1.486 0 0 0-.851.227l.1.142a1.316 1.316 0 0 1 .755-.2zm-.849.226a1.452 1.452 0 0 0-.5.51l.15.084a1.286 1.286 0 0 1 .44-.449zm-.5.524a.226.226 0 0 1-.062.105l.107.134a.391.391 0 0 0 .117-.185zm-.068.112a.1.1 0 0 1-.073.019v.171a.266.266 0 0 0 .194-.07zm-.073.019h-.48v.171h.48zm-.48 0a.18.18 0 0 1-.122-.046l-.112.13a.352.352 0 0 0 .234.087zm-.113-.037a.18.18 0 0 1-.047-.123h-.171a.352.352 0 0 0 .087.234zm-.047-.119a1.1 1.1 0 0 1 .23-.557l-.14-.1a1.253 1.253 0 0 0-.261.648zm.23-.556a1.843 1.843 0 0 1 .715-.564l-.075-.154a2.018 2.018 0 0 0-.78.618zm.716-.564a2.611 2.611 0 0 1 1.2-.247v-.171a2.781 2.781 0 0 0-1.277.266zm1.2-.247a2.268 2.268 0 0 1 1.732.563l.126-.116a2.435 2.435 0 0 0-1.858-.618zm1.733.564a1.945 1.945 0 0 1 .523 1.391h.171a2.117 2.117 0 0 0-.57-1.508zm.523 1.391v3.613h.171v-3.613zm0 3.613a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.157.157 0 0 1-.118.042v.171a.326.326 0 0 0 .239-.092zm-.118.042h-.513v.171h.513zm-.513 0a.2.2 0 0 1-.134-.046l-.111.13a.367.367 0 0 0 .245.088zm-.124-.037a.194.194 0 0 1-.047-.134h-.171a.366.366 0 0 0 .087.245zm-.047-.134v-.479h-.171v.479zm-.156-.528a1.846 1.846 0 0 1-.683.575l.079.152a2.012 2.012 0 0 0 .745-.629zm-.683.575a2.476 2.476 0 0 1-1.153.236v.171a2.644 2.644 0 0 0 1.233-.255zm-.919-.429a1.666 1.666 0 0 0 1.244-.494l-.123-.12a1.493 1.493 0 0 1-1.121.442zm1.244-.494a1.969 1.969 0 0 0 .492-1.431h-.171a1.8 1.8 0 0 1-.444 1.312zm.492-1.431v-.312h-.171v.312zm-.1-.4l-1.293.189.025.17 1.293-.189zm-1.293.189a3 3 0 0 0-1.228.393l.095.143a2.837 2.837 0 0 1 1.158-.365zm-1.227.392a.845.845 0 0 0-.441.73h.172a.676.676 0 0 1 .362-.586zm-.441.73a.869.869 0 0 0 .406.762l.095-.142a.7.7 0 0 1-.33-.62zm.408.764a1.673 1.673 0 0 0 .916.247v-.171a1.5 1.5 0 0 1-.823-.221zm5.686.329l-.061.06zm-.714-1.9h-.085zm-.011-.446h-.085zm.011-.446h-.085zm.714-1.885l.061.061zm3.234-.39l-.04.076zm.825.713l-.073.046zm.3.848h-.086zm-.067.178l.056.065zm-.892.022l.054-.067zm-.112-.178l-.081.029zm-.535-.758l-.048.071zm-1.974.2l-.062-.059zm-.435 1.3h-.086zm-.011.4h-.086zm.011.379h-.086zm.435 1.316l-.062.059zm1.974.2l.046.072zm.535-.769l-.079-.033zm.112-.178l.054.067.007-.006zm.892.022l-.061.06zm.067.178l-.085-.009zm-.3.847l-.072-.046zm-.825.714l-.04-.076zm-1.36.2a2.471 2.471 0 0 1-1.814-.644l-.12.122a2.64 2.64 0 0 0 1.933.694zm-1.813-.643a2.653 2.653 0 0 1-.689-1.839l-.171.006a2.822 2.822 0 0 0 .738 1.952zm-.689-1.838l-.011-.446h-.171l.011.446zm-.011-.442l.011-.446h-.171l-.011.446zm.011-.445a2.611 2.611 0 0 1 .689-1.827l-.122-.121a2.78 2.78 0 0 0-.738 1.942zm.689-1.827a2.447 2.447 0 0 1 1.813-.655v-.171a2.617 2.617 0 0 0-1.934.705zm1.813-.655a2.836 2.836 0 0 1 1.32.28l.079-.152a3 3 0 0 0-1.4-.3zm1.32.28a1.99 1.99 0 0 1 .792.683l.145-.091a2.158 2.158 0 0 0-.858-.744zm.793.685a1.617 1.617 0 0 1 .287.8l.171-.009a1.789 1.789 0 0 0-.315-.89zm.287.809a.11.11 0 0 1-.037.1l.112.13a.281.281 0 0 0 .1-.252zm-.037.1a.2.2 0 0 1-.134.046v.171a.369.369 0 0 0 .246-.088zm-.134.046h-.535v.171h.535zm-.535 0a.184.184 0 0 1-.114-.026l-.107.134a.345.345 0 0 0 .221.064zm-.114-.026a.389.389 0 0 1-.086-.144l-.158.066a.533.533 0 0 0 .137.212zm-.084-.14a1.514 1.514 0 0 0-.57-.8l-.093.144a1.343 1.343 0 0 1 .5.715zm-.568-.8a1.6 1.6 0 0 0-.918-.249v.171a1.435 1.435 0 0 1 .822.219zm-.918-.249a1.535 1.535 0 0 0-1.166.462l.124.118a1.364 1.364 0 0 1 1.042-.408zm-1.166.462a2.036 2.036 0 0 0-.458 1.36l.171.006a1.872 1.872 0 0 1 .411-1.249zm-.458 1.361l-.011.4h.171l.011-.4zm-.011.406l.011.379.171-.005-.011-.379zm.011.38a2.052 2.052 0 0 0 .458 1.371l.124-.118a1.889 1.889 0 0 1-.411-1.26zm.458 1.371a1.533 1.533 0 0 0 1.166.451v-.172a1.363 1.363 0 0 1-1.042-.4zm1.166.451a1.661 1.661 0 0 0 .916-.237l-.093-.144a1.491 1.491 0 0 1-.823.209zm.918-.238a1.576 1.576 0 0 0 .568-.812l-.162-.057a1.409 1.409 0 0 1-.5.727zm.566-.807a.39.39 0 0 1 .086-.144l-.107-.134a.533.533 0 0 0-.137.213zm.093-.151a.144.144 0 0 1 .107-.031v-.171a.31.31 0 0 0-.228.081zm.107-.031h.535v-.171h-.535zm.535 0a.173.173 0 0 1 .129.053l.121-.121a.344.344 0 0 0-.25-.1zm.134.057a.11.11 0 0 1 .037.1l.17.017a.281.281 0 0 0-.1-.252zm.037.109a1.664 1.664 0 0 1-.288.806l.144.092a1.839 1.839 0 0 0 .315-.889zm-.288.806a1.989 1.989 0 0 1-.792.683l.079.152a2.162 2.162 0 0 0 .858-.744zm-.793.684a2.8 2.8 0 0 1-1.32.28v.171a2.96 2.96 0 0 0 1.4-.3zm2.568.187l-.065.056.01.009zm0-7.772l.061.06zm.926 0l-.065.056.009.009zm.078 2.776h-.085a.086.086 0 0 0 .153.053zm.758-.624l.038.077zm2.743.468l-.065.056zm.524 5.151l-.061-.06zm-.925 0l-.065.056.009.009zm-.457-4.5l-.065.056zm-2.23.011l-.062-.059zm-.49 4.493l-.061-.06zm-.736-.019a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.367.367 0 0 0 .087.245zm-.046-.134v-7.4h-.172v7.4zm0-7.4a.156.156 0 0 1 .042-.118l-.121-.121a.326.326 0 0 0-.092.239zm.042-.118a.172.172 0 0 1 .129-.053v-.171a.343.343 0 0 0-.25.1zm.129-.053h.557v-.171h-.557zm.557 0a.137.137 0 0 1 .113.048l.13-.112a.308.308 0 0 0-.244-.108zm.122.057a.137.137 0 0 1 .048.113h.172a.309.309 0 0 0-.108-.243zm.048.113v2.6h.172v-2.6zm.153 2.651a2.076 2.076 0 0 1 .728-.6l-.075-.154a2.248 2.248 0 0 0-.788.649zm.73-.6a2.272 2.272 0 0 1 1.043-.214v-.171a2.438 2.438 0 0 0-1.121.232zm1.043-.214a1.982 1.982 0 0 1 1.6.661l.13-.112a2.152 2.152 0 0 0-1.727-.721zm1.6.663a2.557 2.557 0 0 1 .581 1.761h.171a2.727 2.727 0 0 0-.624-1.874zm.581 1.761v3.144h.171v-3.144zm0 3.144a.173.173 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm-.557 0a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.368.368 0 0 0 .087.245zm-.046-.134V823.8h-.172v3.088zm0-3.088a1.859 1.859 0 0 0-.412-1.284l-.128.114a1.69 1.69 0 0 1 .368 1.169zm-.411-1.283a1.471 1.471 0 0 0-1.169-.464v.171a1.3 1.3 0 0 1 1.039.406zm-1.169-.464a1.566 1.566 0 0 0-1.188.473l.124.118a1.4 1.4 0 0 1 1.064-.419zm-1.188.473a1.779 1.779 0 0 0-.436 1.275h.172a1.609 1.609 0 0 1 .389-1.156zm-.436 1.275v3.088h.172V823.8zm0 3.088a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm6.449-.505l-.062.059zm-.747-1.94h-.086zm-.012-.379h-.085v.005zm.012-.368l-.086-.006zm.758-1.918l-.061-.06zm3.735.078l-.065.056zm.6 2.5l.061.061zm-4.036.067v-.086a.086.086 0 0 0-.086.086zm0 .1h-.086zm.435 1.238l-.068.053zm1.918.3l.045.073zm.491-.435l-.069-.051zm.145-.156l.039.077h.006zm.9.022l-.055.066zm-.245.747l-.064-.057zm-.858.6l.035.078zm.267-3.189v.086a.086.086 0 0 0 .086-.086zm-.424-1.282l-.066.055zm-2.23 0l-.065-.055zm-.4 1.282h-.086a.086.086 0 0 0 .086.086zm1.528 3.349a2.38 2.38 0 0 1-1.779-.677l-.122.12a2.55 2.55 0 0 0 1.9.728zm-1.778-.676a2.86 2.86 0 0 1-.724-1.886l-.171.009a3.027 3.027 0 0 0 .771 1.995zm-.723-1.884l-.011-.379h-.171l.011.379zm-.011-.374l.011-.368-.172-.005-.011.368zm.011-.365a2.871 2.871 0 0 1 .735-1.864l-.124-.118a3.042 3.042 0 0 0-.782 1.971zm.734-1.864a2.331 2.331 0 0 1 1.756-.687v-.171a2.5 2.5 0 0 0-1.879.74zm1.756-.687a2.307 2.307 0 0 1 1.853.762l.13-.112a2.477 2.477 0 0 0-1.983-.821zm1.854.762a3.03 3.03 0 0 1 .659 2.062h.172a3.2 3.2 0 0 0-.7-2.175zm.659 2.062v.19h.172v-.19zm0 .19a.172.172 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-3.858v.171h3.858zm-3.944.086v.1h.172v-.1zm0 .1a2.2 2.2 0 0 0 .453 1.287l.135-.106a2.027 2.027 0 0 1-.417-1.189zm.454 1.288a1.418 1.418 0 0 0 1.148.533v-.171a1.247 1.247 0 0 1-1.015-.47zm1.148.533a1.647 1.647 0 0 0 .882-.214l-.09-.146a1.481 1.481 0 0 1-.791.188zm.882-.214a1.777 1.777 0 0 0 .515-.458l-.14-.1a1.613 1.613 0 0 1-.466.412zm.513-.456a1.251 1.251 0 0 1 .081-.1.28.28 0 0 1 .026-.025l.008-.006-.077-.153a.326.326 0 0 0-.083.068 1.55 1.55 0 0 0-.092.113zm.12-.134a.328.328 0 0 1 .146-.021v-.171a.468.468 0 0 0-.234.046zm.146-.021h.547v-.171h-.547zm.547 0a.166.166 0 0 1 .112.036l.11-.132a.337.337 0 0 0-.222-.076zm.112.036a.107.107 0 0 1 .036.09h.171a.277.277 0 0 0-.1-.222zm.036.09a.9.9 0 0 1-.291.534l.128.115a1.055 1.055 0 0 0 .334-.649zm-.291.535a2.42 2.42 0 0 1-.83.581l.072.156a2.6 2.6 0 0 0 .888-.624zm-.829.58a2.964 2.964 0 0 1-1.224.238v.171a3.133 3.133 0 0 0 1.295-.253zm.389-3.111v-.033h-.171v.033zm0-.033a1.9 1.9 0 0 0-.445-1.306l-.129.114a1.731 1.731 0 0 1 .4 1.192zm-.444-1.3a1.466 1.466 0 0 0-1.181-.521v.172a1.3 1.3 0 0 1 1.049.46zm-1.181-.521a1.466 1.466 0 0 0-1.18.521l.131.11a1.3 1.3 0 0 1 1.049-.46zm-1.181.521a1.965 1.965 0 0 0-.422 1.3h.172a1.794 1.794 0 0 1 .382-1.194zm-.422 1.3v.033h.172v-.033zm.086.119h3.055v-.171h-3.055z" fill="#51504f" data-name="Path 10" transform="translate(-1460.636 -807.945)"></path> |
| <path id="Path_11" d="M1519.066 884.011a.581.581 0 0 1-.567-.567 1.151 1.151 0 0 1 .028-.312l7.026-18.328a.881.881 0 0 1 .906-.623h1.926a.882.882 0 0 1 .907.623l7 18.328.057.312a.583.583 0 0 1-.567.567h-1.445a.735.735 0 0 1-.482-.142.9.9 0 0 1-.226-.34l-1.558-4.023h-9.292l-1.558 4.023a.8.8 0 0 1-.255.34.688.688 0 0 1-.453.142zm12.181-6.94l-3.824-10.056-3.823 10.055zm8.184-10.538a.592.592 0 0 1-.652-.651v-1.53a.714.714 0 0 1 .17-.482.656.656 0 0 1 .482-.2h1.785a.677.677 0 0 1 .68.68v1.53a.655.655 0 0 1-.2.481.713.713 0 0 1-.481.17zm.227 17.479a.593.593 0 0 1-.652-.652v-13.428a.611.611 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.359a.679.679 0 0 1 .652.651v13.427a.655.655 0 0 1-.2.482.613.613 0 0 1-.453.17zm6.861 0a.592.592 0 0 1-.651-.652v-13.4a.715.715 0 0 1 .17-.481.656.656 0 0 1 .482-.2h1.3a.677.677 0 0 1 .68.68v1.246a4.255 4.255 0 0 1 3.966-1.926h1.1a.679.679 0 0 1 .651.651v1.161a.566.566 0 0 1-.2.453.612.612 0 0 1-.453.17h-1.7a3.2 3.2 0 0 0-2.408.907 3.253 3.253 0 0 0-.879 2.408v8.328a.656.656 0 0 1-.2.482.716.716 0 0 1-.482.17zm12.234 0a.593.593 0 0 1-.651-.652v-11.814h-2.408a.592.592 0 0 1-.651-.651v-.963a.611.611 0 0 1 .17-.453.654.654 0 0 1 .481-.2h2.408v-1.417q0-4.816 4.872-4.815h1.586a.679.679 0 0 1 .652.651v.963a.656.656 0 0 1-.2.481.613.613 0 0 1-.453.17h-1.529a2.1 2.1 0 0 0-1.785.68 3.248 3.248 0 0 0-.51 2.011v1.275h6.062V863.7a.613.613 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.3a.679.679 0 0 1 .652.651v19.659a.655.655 0 0 1-.2.482.613.613 0 0 1-.454.17h-1.3a.592.592 0 0 1-.652-.652v-11.811h-6.062v11.813a.657.657 0 0 1-.2.482.614.614 0 0 1-.454.17zm20.9.283a6.487 6.487 0 0 1-4.844-1.757 6.837 6.837 0 0 1-1.813-4.674l-.029-1.218.029-1.218a6.732 6.732 0 0 1 1.841-4.646 7.389 7.389 0 0 1 9.631 0 6.736 6.736 0 0 1 1.841 4.646q.028.311.028 1.218t-.028 1.218a6.772 6.772 0 0 1-1.841 4.674 6.391 6.391 0 0 1-4.82 1.756zm0-2.181a3.582 3.582 0 0 0 2.8-1.133 4.931 4.931 0 0 0 1.133-3.258q.028-.283.028-1.076t-.028-1.076a4.931 4.931 0 0 0-1.133-3.258 3.582 3.582 0 0 0-2.8-1.133 3.671 3.671 0 0 0-2.833 1.133 4.83 4.83 0 0 0-1.1 3.258l-.028 1.076.028 1.076a4.83 4.83 0 0 0 1.1 3.258 3.671 3.671 0 0 0 2.828 1.132zm13.755 1.9a.846.846 0 0 1-.566-.17 1.321 1.321 0 0 1-.34-.538l-4.023-13.144-.056-.283a.575.575 0 0 1 .17-.425.641.641 0 0 1 .425-.17h1.246a.612.612 0 0 1 .453.17.646.646 0 0 1 .255.312l3.145 10.679 3.371-10.566a.761.761 0 0 1 .255-.4.726.726 0 0 1 .538-.2h.963a.728.728 0 0 1 .539.2.76.76 0 0 1 .255.4l3.371 10.566 3.144-10.679a.655.655 0 0 1 .2-.312.714.714 0 0 1 .482-.17h1.275a.542.542 0 0 1 .4.17.576.576 0 0 1 .17.425l-.057.283-3.994 13.144a1.323 1.323 0 0 1-.34.538.9.9 0 0 1-.6.17h-1.1a.86.86 0 0 1-.935-.708l-3.286-10.141-3.286 10.141a.928.928 0 0 1-.963.708z" fill="#51504f" data-name="Path 11" transform="translate(-1454.66 -838.62)"></path> |
| </g> |
| </g> |
| </g> |
| </svg> |
| |
| </a> |
| </div> |
| <div class="desktop-only navbar__menu-container"> |
| |
| <div class="navbar__menu-content" id="main_navbar"> |
| |
| <div class="navbar__links-container"> |
| |
| <a class="navbar__text-link" href="/community/"> |
| Community |
| </a> |
| |
| <a class="navbar__text-link" href="/meetups/"> |
| Meetups |
| </a> |
| |
| <a class="navbar__text-link" href="/docs/"> |
| Documentation |
| </a> |
| |
| <a class="navbar__text-link" href="/use-cases/"> |
| Use-cases |
| </a> |
| |
| <a class="navbar__text-link" href="/announcements/"> |
| Announcements |
| </a> |
| |
| <a class="navbar__text-link" href="/blog/"> |
| Blog |
| </a> |
| |
| <a class="navbar__text-link" href="/ecosystem/"> |
| Ecosystem |
| </a> |
| |
| </div> |
| |
| |
| |
| </div> |
| |
| </div> |
| <div class="mobile-only navbar__drawer-container"> |
| <button class="navbar__toggle-button" id="navbar-toggle-button"> |
| |
| <div id="hamburger-icon" class="navbar__toggle-button--icon visible"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20"> |
| <g id="Group_1294" data-name="Group 1294" transform="translate(-38.791 291)"> |
| <g id="Group_1291" data-name="Group 1291" transform="translate(39 -291)"> |
| <rect id="Rectangle_461" width="26" height="2" fill="#51504f" data-name="Rectangle 461" rx="1" transform="translate(-.209)"></rect> |
| </g> |
| <g id="Group_1292" data-name="Group 1292" transform="translate(39 -281.822)"> |
| <rect id="Rectangle_462" width="26" height="2" fill="#51504f" data-name="Rectangle 462" rx="1" transform="translate(-.209 -.178)"></rect> |
| </g> |
| <g id="Group_1293" data-name="Group 1293" transform="translate(39 -272.644)"> |
| <rect id="Rectangle_463" width="26" height="2" fill="#51504f" data-name="Rectangle 463" rx="1" transform="translate(-.209 -.356)"></rect> |
| </g> |
| </g> |
| </svg> |
| |
| </div> |
| |
| <div id="close-icon" class="navbar__toggle-button--icon"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="19.799" height="19.799" viewBox="0 0 19.799 19.799"> |
| <g id="Group_1574" data-name="Group 1574" transform="translate(-41.892 290.899)"> |
| <g id="Group_1291" data-name="Group 1291" transform="rotate(-45 -308.114 -187.077)"> |
| <rect id="Rectangle_461" width="26" height="2" fill="#51504f" data-name="Rectangle 461" rx="1" transform="translate(-.209)"></rect> |
| </g> |
| <g id="Group_1292" data-name="Group 1292" transform="rotate(45 372.48 -93.011)"> |
| <rect id="Rectangle_462" width="26" height="2" fill="#51504f" data-name="Rectangle 462" rx="1" transform="translate(-.209 -.178)"></rect> |
| </g> |
| </g> |
| </svg> |
| |
| </div> |
| |
| </button> |
| <div class="navbar__drawer" id="navbar-drawer"> |
| <div class="navbar__menu-content" id="main_navbar"> |
| |
| <div class="navbar__links-container"> |
| |
| <a class="navbar__text-link" href="/community/"> |
| Community |
| </a> |
| |
| <a class="navbar__text-link" href="/meetups/"> |
| Meetups |
| </a> |
| |
| <a class="navbar__text-link" href="/docs/"> |
| Documentation |
| </a> |
| |
| <a class="navbar__text-link" href="/use-cases/"> |
| Use-cases |
| </a> |
| |
| <a class="navbar__text-link" href="/announcements/"> |
| Announcements |
| </a> |
| |
| <a class="navbar__text-link" href="/blog/"> |
| Blog |
| </a> |
| |
| <a class="navbar__text-link" href="/ecosystem/"> |
| Ecosystem |
| </a> |
| |
| |
| </div> |
| |
| |
| </div> |
| </div> |
| </div> |
| </nav> |
| |
| </header> |
| |
| |
| <div class="roadmap container-fluid td-default base-layout"> |
| |
| |
| <div class="content-drawer-wrapper"> |
| <button class="content-drawer__toggle-button" id="content-open-button"> |
| |
| <div id="hamburger-icon" class="content-drawer__toggle-button--icon visible"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="20.005" height="13.879" viewBox="0 0 20.005 13.879"> |
| <g id="Group_1619" data-name="Group 1619" transform="translate(271.132 -418.872)"> |
| <g id="Group_1613" data-name="Group 1613" transform="translate(-266.229 431.045)"> |
| <path id="Path_1337" d="M-218.5 513.215h-14.583a.259.259 0 0 1-.259-.26.259.259 0 0 1 .259-.259h14.583a.26.26 0 0 1 .259.259.259.259 0 0 1-.259.26z" fill="#51504f" data-name="Path 1337" transform="translate(233.345 -512.696)"></path> |
| </g> |
| <g id="Group_1614" data-name="Group 1614" transform="translate(-266.229 425.684)"> |
| <path id="Path_1338" d="M-218.5 471.9h-14.583a.259.259 0 0 1-.259-.26.26.26 0 0 1 .259-.259h14.583a.26.26 0 0 1 .259.259.26.26 0 0 1-.259.26z" fill="#51504f" data-name="Path 1338" transform="translate(233.345 -471.376)"></path> |
| </g> |
| <g id="Group_1615" data-name="Group 1615" transform="translate(-266.229 420.323)"> |
| <path id="Path_1339" d="M-218.5 430.574h-14.583a.259.259 0 0 1-.259-.259.259.259 0 0 1 .259-.259h14.583a.26.26 0 0 1 .259.259.259.259 0 0 1-.259.259z" fill="#51504f" data-name="Path 1339" transform="translate(233.345 -430.055)"></path> |
| </g> |
| <g id="Group_1616" data-name="Group 1616" transform="translate(-271.132 429.814)"> |
| <path id="Path_1340" d="M-269.663 506.145a1.47 1.47 0 0 1-1.469-1.469 1.47 1.47 0 0 1 1.469-1.469 1.47 1.47 0 0 1 1.469 1.469 1.47 1.47 0 0 1-1.469 1.469zm0-2.418a.951.951 0 0 0-.95.95.951.951 0 0 0 .95.95.951.951 0 0 0 .95-.95.951.951 0 0 0-.95-.95z" fill="#51504f" data-name="Path 1340" transform="translate(271.132 -503.208)"></path> |
| </g> |
| <g id="Group_1617" data-name="Group 1617" transform="translate(-271.132 424.556)"> |
| <path id="Path_1341" d="M-269.663 465.62a1.47 1.47 0 0 1-1.469-1.469 1.47 1.47 0 0 1 1.469-1.469 1.47 1.47 0 0 1 1.469 1.469 1.47 1.47 0 0 1-1.469 1.469zm0-2.418a.951.951 0 0 0-.95.95.951.951 0 0 0 .95.95.951.951 0 0 0 .95-.95.951.951 0 0 0-.95-.952z" fill="#51504f" data-name="Path 1341" transform="translate(271.132 -462.683)"></path> |
| </g> |
| <g id="Group_1618" data-name="Group 1618" transform="translate(-271.132 418.872)"> |
| <path id="Path_1342" d="M-269.663 421.809a1.47 1.47 0 0 1-1.469-1.469 1.47 1.47 0 0 1 1.469-1.469 1.47 1.47 0 0 1 1.469 1.469 1.47 1.47 0 0 1-1.469 1.469zm0-2.418a.951.951 0 0 0-.95.95.951.951 0 0 0 .95.95.951.951 0 0 0 .95-.95.951.951 0 0 0-.95-.95z" fill="#51504f" data-name="Path 1342" transform="translate(271.132 -418.872)"></path> |
| </g> |
| </g> |
| </svg> |
| |
| <span class="bodytext__mobile--brownish-grey">Content</span> |
| </div> |
| |
| </button> |
| <nav id="content-navbar" class="navbar navbar--hidden"> |
| <div class="navbar__icon-container"> |
| <a href="/"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60"> |
| <defs> |
| <clipPath id="clip-path"> |
| <path id="Rectangle_1" d="M0 0h155.314v60H0z" fill="none" data-name="Rectangle 1"></path> |
| </clipPath> |
| </defs> |
| <g id="logo" transform="translate(-1305 -780.355)"> |
| <g id="Group_2" clip-path="url(#clip-path)" data-name="Group 2" transform="translate(1305 780.355)"> |
| <g id="Group_1" data-name="Group 1" transform="translate(.486 .486)"> |
| <path id="Path_1" d="M1307.562 880.867l28.187-28.893a.521.521 0 0 0 .063-.666c-1.714-2.393-4.877-2.808-6.049-4.416-3.472-4.763-4.353-7.459-5.845-7.292a.456.456 0 0 0-.271.143l-10.182 10.438c-5.858 6-6.7 19.225-6.852 30.3a.552.552 0 0 0 .949.386z" fill="#017cee" data-name="Path 1" transform="translate(-1306.613 -822.232)"></path> |
| <path id="Path_2" d="M1405.512 908.489l-28.893-28.189a.521.521 0 0 0-.667-.063c-2.393 1.715-2.808 4.877-4.416 6.049-4.763 3.472-7.459 4.353-7.292 5.845a.456.456 0 0 0 .143.27l10.438 10.182c6 5.858 19.225 6.7 30.3 6.852a.552.552 0 0 0 .387-.946z" fill="#00ad46" data-name="Path 2" transform="translate(-1346.876 -850.567)"></path> |
| <path id="Path_3" d="M1373.909 902.252c-3.28-3.2-4.8-9.53 1.486-22.583-10.219 4.567-13.8 10.57-12.039 12.289z" fill="#04d659" data-name="Path 3" transform="translate(-1345.96 -850.233)"></path> |
| <path id="Path_4" d="M1433.132 782.359l-28.186 28.893a.52.52 0 0 0-.063.666c1.715 2.393 4.876 2.808 6.049 4.416 3.472 4.763 4.354 7.459 5.845 7.292a.454.454 0 0 0 .271-.143l10.182-10.438c5.858-6 6.7-19.225 6.852-30.3a.553.553 0 0 0-.95-.386z" fill="#00c7d4" data-name="Path 4" transform="translate(-1375.21 -782.123)"></path> |
| <path id="Path_5" d="M1426.9 881.155c-3.2 3.28-9.53 4.8-22.584-1.486 4.567 10.219 10.57 13.8 12.289 12.039z" fill="#11e1ee" data-name="Path 5" transform="translate(-1374.875 -850.233)"></path> |
| <path id="Path_6" d="M1307 782.919l28.893 28.186a.521.521 0 0 0 .666.063c2.393-1.715 2.808-4.877 4.416-6.049 4.763-3.472 7.459-4.353 7.292-5.845a.459.459 0 0 0-.143-.271l-10.438-10.182c-6-5.858-19.225-6.7-30.3-6.852a.552.552 0 0 0-.386.95z" fill="#e43921" data-name="Path 6" transform="translate(-1306.766 -781.97)"></path> |
| <path id="Path_7" d="M1405.8 804.711c3.28 3.2 4.8 9.53-1.486 22.584 10.219-4.567 13.8-10.571 12.039-12.289z" fill-rule="evenodd" fill="#ff7557" data-name="Path 7" transform="translate(-1374.875 -797.859)"></path> |
| <path id="Path_8" d="M1329.355 849.266c3.2-3.28 9.53-4.8 22.584 1.486-4.567-10.219-10.57-13.8-12.289-12.039z" fill="#0cb6ff" data-name="Path 8" transform="translate(-1322.503 -821.316)"></path> |
| <circle id="Ellipse_1" cx="1.26" cy="1.26" r="1.26" fill="#4a4848" data-name="Ellipse 1" transform="translate(28.18 28.171)"></circle> |
| <path id="Path_9" d="M1527.558 827.347a.229.229 0 0 1-.223-.223.458.458 0 0 1 .011-.123l2.766-7.214a.346.346 0 0 1 .357-.245h.758a.348.348 0 0 1 .357.245l2.754 7.214.022.123a.228.228 0 0 1-.223.223h-.568a.288.288 0 0 1-.19-.056.352.352 0 0 1-.089-.134l-.613-1.583h-3.657l-.613 1.583a.317.317 0 0 1-.1.134.269.269 0 0 1-.178.056zm4.795-2.732l-1.505-3.958-1.505 3.958zm3.322 4.85a.258.258 0 0 1-.189-.078.241.241 0 0 1-.067-.178v-7.4a.241.241 0 0 1 .067-.178.258.258 0 0 1 .189-.078h.513a.268.268 0 0 1 .256.256v.49a2.118 2.118 0 0 1 1.828-.858 2.092 2.092 0 0 1 1.751.736 3.135 3.135 0 0 1 .636 1.9q.011.122.011.379t-.011.379a3.168 3.168 0 0 1-.636 1.9 2.111 2.111 0 0 1-1.751.736 2.154 2.154 0 0 1-1.806-.836v2.587a.241.241 0 0 1-.067.178.223.223 0 0 1-.179.078zm2.364-2.91a1.324 1.324 0 0 0 1.149-.491 2.266 2.266 0 0 0 .4-1.293q.011-.111.011-.323 0-2.107-1.562-2.107a1.365 1.365 0 0 0-1.159.513 2.111 2.111 0 0 0-.412 1.2l-.012.424.012.435a1.862 1.862 0 0 0 .424 1.149 1.4 1.4 0 0 0 1.148.493zm5.628.9a2.329 2.329 0 0 1-1.015-.223 1.94 1.94 0 0 1-.747-.6 1.487 1.487 0 0 1-.268-.859 1.459 1.459 0 0 1 .6-1.2 3.4 3.4 0 0 1 1.65-.624l1.661-.234v-.323q0-1.137-1.3-1.137a1.4 1.4 0 0 0-.8.212 1.376 1.376 0 0 0-.468.48.305.305 0 0 1-.089.145.18.18 0 0 1-.134.045h-.48a.23.23 0 0 1-.245-.245 1.17 1.17 0 0 1 .245-.6 1.931 1.931 0 0 1 .747-.591 2.7 2.7 0 0 1 1.238-.256 2.351 2.351 0 0 1 1.8.591 2.032 2.032 0 0 1 .547 1.45v3.613a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.513a.233.233 0 0 1-.257-.256v-.479a1.923 1.923 0 0 1-.714.6 2.557 2.557 0 0 1-1.203.237zm.234-.836a1.579 1.579 0 0 0 1.182-.469 1.881 1.881 0 0 0 .468-1.371v-.312l-1.293.19a2.918 2.918 0 0 0-1.193.379.761.761 0 0 0-.4.658.784.784 0 0 0 .368.691 1.585 1.585 0 0 0 .867.237zm6.643.836a2.556 2.556 0 0 1-1.873-.669 2.738 2.738 0 0 1-.714-1.9l-.011-.446.011-.446a2.7 2.7 0 0 1 .714-1.885 2.531 2.531 0 0 1 1.873-.68 2.917 2.917 0 0 1 1.36.29 2.077 2.077 0 0 1 .825.714 1.7 1.7 0 0 1 .3.848.2.2 0 0 1-.067.178.281.281 0 0 1-.19.067h-.535a.265.265 0 0 1-.168-.045.458.458 0 0 1-.111-.178 1.428 1.428 0 0 0-.535-.758 1.516 1.516 0 0 0-.87-.234 1.45 1.45 0 0 0-1.1.435 1.952 1.952 0 0 0-.435 1.3l-.011.4.011.379a1.969 1.969 0 0 0 .435 1.316 1.446 1.446 0 0 0 1.1.424 1.577 1.577 0 0 0 .87-.223 1.493 1.493 0 0 0 .535-.769.458.458 0 0 1 .111-.178.228.228 0 0 1 .168-.056h.535a.258.258 0 0 1 .19.078.2.2 0 0 1 .067.178 1.75 1.75 0 0 1-.3.847 2.078 2.078 0 0 1-.825.714 2.876 2.876 0 0 1-1.361.302zm4.078-.112a.233.233 0 0 1-.257-.256v-7.4a.241.241 0 0 1 .067-.178.259.259 0 0 1 .19-.078h.557a.267.267 0 0 1 .257.256v2.6a2.167 2.167 0 0 1 .758-.624 2.353 2.353 0 0 1 1.082-.223 2.067 2.067 0 0 1 1.661.691 2.642 2.642 0 0 1 .6 1.818v3.144a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.557a.233.233 0 0 1-.256-.256V824a1.775 1.775 0 0 0-.39-1.227 1.387 1.387 0 0 0-1.1-.435 1.481 1.481 0 0 0-1.126.446 1.7 1.7 0 0 0-.412 1.215v3.088a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067zm8.846.112a2.466 2.466 0 0 1-1.84-.7 2.938 2.938 0 0 1-.747-1.94l-.011-.379.011-.368a2.953 2.953 0 0 1 .758-1.918 2.7 2.7 0 0 1 3.735.078 3.114 3.114 0 0 1 .68 2.119v.19a.257.257 0 0 1-.078.189.241.241 0 0 1-.178.067h-3.858v.1a2.11 2.11 0 0 0 .435 1.238 1.332 1.332 0 0 0 1.081.5 1.563 1.563 0 0 0 .836-.2 1.7 1.7 0 0 0 .491-.435.6.6 0 0 1 .145-.156.391.391 0 0 1 .19-.033h.547a.252.252 0 0 1 .167.056.192.192 0 0 1 .067.156.975.975 0 0 1-.312.591 2.51 2.51 0 0 1-.859.6 3.049 3.049 0 0 1-1.26.248zm1.527-3.434v-.033a1.817 1.817 0 0 0-.424-1.249 1.512 1.512 0 0 0-2.23 0 1.883 1.883 0 0 0-.4 1.249v.033z" fill="#51504f" data-name="Path 9" transform="translate(-1460.834 -808.144)"></path> |
| <path id="Path_10" d="M1527.2 827.081l-.061.061zm-.056-.279l-.08-.031zm2.766-7.214l.08.031zm1.472 0l-.081.029zm2.754 7.214l.084-.015a.064.064 0 0 0 0-.015zm.022.123h.086v-.015zm-.067.156l.06.061zm-.914.011l-.061.061.006.005zm-.089-.134l.081-.027zm-.613-1.583l.08-.031a.086.086 0 0 0-.08-.055zm-3.657 0v-.086a.086.086 0 0 0-.08.055zm-.613 1.583l-.08-.031zm-.1.134l.055.066zm4.047-2.676v.086a.086.086 0 0 0 .08-.116zm-1.505-3.958l.08-.03a.086.086 0 0 0-.16 0zm-1.505 3.958l-.08-.03a.086.086 0 0 0 .08.116zm-1.784 2.646a.128.128 0 0 1-.1-.042l-.122.121a.3.3 0 0 0 .217.092zm-.1-.042a.129.129 0 0 1-.042-.1h-.171a.3.3 0 0 0 .092.217zm-.042-.1a.38.38 0 0 1 .007-.1l-.163-.054a.514.514 0 0 0-.016.15zm.005-.092l2.765-7.214-.16-.061-2.765 7.214zm2.766-7.216a.283.283 0 0 1 .1-.143.3.3 0 0 1 .174-.046v-.172a.47.47 0 0 0-.271.076.453.453 0 0 0-.166.226zm.276-.189h.758v-.172h-.758zm.758 0a.3.3 0 0 1 .175.046.283.283 0 0 1 .1.143l.161-.059a.451.451 0 0 0-.166-.226.47.47 0 0 0-.272-.076zm.277.19l2.754 7.214.16-.061-2.754-7.214zm2.75 7.2l.022.123.169-.031-.022-.123zm.021.107a.13.13 0 0 1-.042.1l.121.121a.3.3 0 0 0 .092-.217zm-.042.1a.13.13 0 0 1-.1.042v.171a.3.3 0 0 0 .217-.092zm-.1.042h-.568v.171h.568zm-.568 0a.206.206 0 0 1-.135-.036l-.11.132a.373.373 0 0 0 .245.076zm-.129-.031a.262.262 0 0 1-.069-.1l-.162.054a.431.431 0 0 0 .11.167zm-.07-.1l-.613-1.584-.16.062.613 1.583zm-.693-1.638h-3.657v.171h3.657zm-3.737.055l-.614 1.584.16.062.613-1.583zm-.615 1.587a.235.235 0 0 1-.075.1l.111.13a.4.4 0 0 0 .126-.172zm-.074.1a.185.185 0 0 1-.124.036v.171a.354.354 0 0 0 .233-.076zm-.124.036h-.569v.171h.569zm4.306-2.677l-1.505-3.958-.16.061 1.505 3.958zm-1.666-3.958l-1.505 3.958.16.061 1.505-3.958zm-1.425 4.075h3.01v-.171h-3.01zm6.143 4.687l-.06.061zm0-7.761l.061.061zm.881 0l-.065.056.01.009zm.078.669h-.086a.086.086 0 0 0 .155.051zm3.579-.123l-.067.053zm.636 1.9h-.086zm0 .758l-.085-.007zm-.636 1.9l.067.054zm-3.557-.1l.068-.052a.086.086 0 0 0-.154.052zm-.067 2.765l-.061-.06zm2.787-3.323l-.069-.051zm.4-1.293l-.085-.008v.005zm-2.709-1.918l-.068-.052zm-.413 1.2h-.086zm-.011.423h-.085zm.011.435h-.086zm.424 1.149l.066-.054zm-1.216 3.315a.173.173 0 0 1-.129-.053l-.121.121a.342.342 0 0 0 .25.1zm-.129-.053a.157.157 0 0 1-.042-.118h-.172a.325.325 0 0 0 .092.239zm-.042-.118v-7.4h-.172v7.4zm0-7.4a.157.157 0 0 1 .042-.118l-.121-.121a.324.324 0 0 0-.092.239zm.042-.118a.173.173 0 0 1 .129-.053v-.172a.342.342 0 0 0-.25.1zm.129-.053h.513v-.172h-.513zm.513 0a.137.137 0 0 1 .113.048l.13-.111a.309.309 0 0 0-.244-.108zm.123.058a.137.137 0 0 1 .048.113h.171a.309.309 0 0 0-.108-.243zm.048.113v.49h.171v-.49zm.155.541a2.033 2.033 0 0 1 1.759-.823v-.171a2.2 2.2 0 0 0-1.9.894zm1.759-.823a2.007 2.007 0 0 1 1.683.7l.135-.106a2.177 2.177 0 0 0-1.818-.768zm1.683.7a3.045 3.045 0 0 1 .617 1.845l.171-.007a3.218 3.218 0 0 0-.654-1.946zm.617 1.85c.007.078.011.2.011.372h.171c0-.171 0-.3-.012-.387zm.011.372c0 .171 0 .294-.011.372l.17.015c.008-.086.012-.216.012-.387zm-.011.376a3.08 3.08 0 0 1-.617 1.846l.134.106a3.25 3.25 0 0 0 .654-1.945zm-.617 1.845a2.025 2.025 0 0 1-1.683.7v.171a2.2 2.2 0 0 0 1.817-.768zm-1.683.7a2.068 2.068 0 0 1-1.739-.8l-.136.1a2.239 2.239 0 0 0 1.874.87zm-1.892-.75v2.587h.172v-2.587zm0 2.587a.156.156 0 0 1-.042.118l.121.121a.325.325 0 0 0 .092-.239zm-.046.123a.138.138 0 0 1-.114.048v.172a.308.308 0 0 0 .244-.108zm-.114.048h-.546v.172h.546zm1.817-2.739a1.408 1.408 0 0 0 1.218-.526l-.138-.1a1.24 1.24 0 0 1-1.079.455zm1.217-.525a2.355 2.355 0 0 0 .419-1.341l-.171-.007a2.182 2.182 0 0 1-.385 1.246zm.418-1.336c.008-.079.012-.19.012-.332h-.172c0 .14 0 .245-.011.315zm.012-.332a2.726 2.726 0 0 0-.407-1.632 1.448 1.448 0 0 0-1.24-.562v.171a1.278 1.278 0 0 1 1.1.492 2.565 2.565 0 0 1 .374 1.53zm-1.647-2.193a1.452 1.452 0 0 0-1.228.547l.136.1a1.282 1.282 0 0 1 1.091-.479zm-1.228.547a2.2 2.2 0 0 0-.43 1.252l.172.008a2.028 2.028 0 0 1 .4-1.157zm-.43 1.254l-.011.424h.171l.011-.424zm-.011.428l.011.435h.172l-.011-.435zm.011.436a1.95 1.95 0 0 0 .443 1.2l.133-.109a1.776 1.776 0 0 1-.4-1.1zm.443 1.2a1.484 1.484 0 0 0 1.214.522v-.171a1.314 1.314 0 0 1-1.082-.459zm5.828 1.117l.037-.077zm-.747-.6l-.07.049zm.335-2.063l.052.068zm1.65-.624l.012.085zm1.661-.234l.012.085a.086.086 0 0 0 .074-.085zm-2.107-1.249l.046.072zm-.468.48l-.075-.042a.083.083 0 0 0-.006.015zm-.089.145l-.054-.067-.007.006zm-.792-.022l-.065.056.009.009zm-.067-.178h-.086zm.245-.6l-.07-.049zm.747-.591l.038.077zm3.033.334l-.063.058zm.468 5.252l.06.061zm-.881 0l-.065.056a.043.043 0 0 0 .009.009zm-.067-.669h.086a.086.086 0 0 0-.156-.048zm-.714.6l-.04-.076zm.223-1.059l-.062-.06zm.468-1.684h.086a.086.086 0 0 0-.1-.085zm-1.293.189l.012.085zm-1.193.379l.046.072zm-.033 1.349l-.047.071zm.635.985a2.241 2.241 0 0 1-.978-.215l-.074.155a2.412 2.412 0 0 0 1.051.231zm-.978-.215a1.859 1.859 0 0 1-.715-.576l-.138.1a2.024 2.024 0 0 0 .779.629zm-.713-.573a1.4 1.4 0 0 1-.253-.81h-.172a1.571 1.571 0 0 0 .283.907zm-.253-.81a1.374 1.374 0 0 1 .569-1.136l-.105-.135a1.544 1.544 0 0 0-.635 1.272zm.569-1.137a3.316 3.316 0 0 1 1.609-.607l-.024-.17a3.481 3.481 0 0 0-1.691.642zm1.609-.607l1.661-.234-.024-.17-1.662.234zm1.735-.319v-.323h-.171v.323zm0-.323a1.156 1.156 0 0 0-.355-.917 1.536 1.536 0 0 0-1.035-.306v.172a1.37 1.37 0 0 1 .922.263.986.986 0 0 1 .3.788zm-1.39-1.223a1.486 1.486 0 0 0-.851.227l.1.142a1.316 1.316 0 0 1 .755-.2zm-.849.226a1.452 1.452 0 0 0-.5.51l.15.084a1.286 1.286 0 0 1 .44-.449zm-.5.524a.226.226 0 0 1-.062.105l.107.134a.391.391 0 0 0 .117-.185zm-.068.112a.1.1 0 0 1-.073.019v.171a.266.266 0 0 0 .194-.07zm-.073.019h-.48v.171h.48zm-.48 0a.18.18 0 0 1-.122-.046l-.112.13a.352.352 0 0 0 .234.087zm-.113-.037a.18.18 0 0 1-.047-.123h-.171a.352.352 0 0 0 .087.234zm-.047-.119a1.1 1.1 0 0 1 .23-.557l-.14-.1a1.253 1.253 0 0 0-.261.648zm.23-.556a1.843 1.843 0 0 1 .715-.564l-.075-.154a2.018 2.018 0 0 0-.78.618zm.716-.564a2.611 2.611 0 0 1 1.2-.247v-.171a2.781 2.781 0 0 0-1.277.266zm1.2-.247a2.268 2.268 0 0 1 1.732.563l.126-.116a2.435 2.435 0 0 0-1.858-.618zm1.733.564a1.945 1.945 0 0 1 .523 1.391h.171a2.117 2.117 0 0 0-.57-1.508zm.523 1.391v3.613h.171v-3.613zm0 3.613a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.157.157 0 0 1-.118.042v.171a.326.326 0 0 0 .239-.092zm-.118.042h-.513v.171h.513zm-.513 0a.2.2 0 0 1-.134-.046l-.111.13a.367.367 0 0 0 .245.088zm-.124-.037a.194.194 0 0 1-.047-.134h-.171a.366.366 0 0 0 .087.245zm-.047-.134v-.479h-.171v.479zm-.156-.528a1.846 1.846 0 0 1-.683.575l.079.152a2.012 2.012 0 0 0 .745-.629zm-.683.575a2.476 2.476 0 0 1-1.153.236v.171a2.644 2.644 0 0 0 1.233-.255zm-.919-.429a1.666 1.666 0 0 0 1.244-.494l-.123-.12a1.493 1.493 0 0 1-1.121.442zm1.244-.494a1.969 1.969 0 0 0 .492-1.431h-.171a1.8 1.8 0 0 1-.444 1.312zm.492-1.431v-.312h-.171v.312zm-.1-.4l-1.293.189.025.17 1.293-.189zm-1.293.189a3 3 0 0 0-1.228.393l.095.143a2.837 2.837 0 0 1 1.158-.365zm-1.227.392a.845.845 0 0 0-.441.73h.172a.676.676 0 0 1 .362-.586zm-.441.73a.869.869 0 0 0 .406.762l.095-.142a.7.7 0 0 1-.33-.62zm.408.764a1.673 1.673 0 0 0 .916.247v-.171a1.5 1.5 0 0 1-.823-.221zm5.686.329l-.061.06zm-.714-1.9h-.085zm-.011-.446h-.085zm.011-.446h-.085zm.714-1.885l.061.061zm3.234-.39l-.04.076zm.825.713l-.073.046zm.3.848h-.086zm-.067.178l.056.065zm-.892.022l.054-.067zm-.112-.178l-.081.029zm-.535-.758l-.048.071zm-1.974.2l-.062-.059zm-.435 1.3h-.086zm-.011.4h-.086zm.011.379h-.086zm.435 1.316l-.062.059zm1.974.2l.046.072zm.535-.769l-.079-.033zm.112-.178l.054.067.007-.006zm.892.022l-.061.06zm.067.178l-.085-.009zm-.3.847l-.072-.046zm-.825.714l-.04-.076zm-1.36.2a2.471 2.471 0 0 1-1.814-.644l-.12.122a2.64 2.64 0 0 0 1.933.694zm-1.813-.643a2.653 2.653 0 0 1-.689-1.839l-.171.006a2.822 2.822 0 0 0 .738 1.952zm-.689-1.838l-.011-.446h-.171l.011.446zm-.011-.442l.011-.446h-.171l-.011.446zm.011-.445a2.611 2.611 0 0 1 .689-1.827l-.122-.121a2.78 2.78 0 0 0-.738 1.942zm.689-1.827a2.447 2.447 0 0 1 1.813-.655v-.171a2.617 2.617 0 0 0-1.934.705zm1.813-.655a2.836 2.836 0 0 1 1.32.28l.079-.152a3 3 0 0 0-1.4-.3zm1.32.28a1.99 1.99 0 0 1 .792.683l.145-.091a2.158 2.158 0 0 0-.858-.744zm.793.685a1.617 1.617 0 0 1 .287.8l.171-.009a1.789 1.789 0 0 0-.315-.89zm.287.809a.11.11 0 0 1-.037.1l.112.13a.281.281 0 0 0 .1-.252zm-.037.1a.2.2 0 0 1-.134.046v.171a.369.369 0 0 0 .246-.088zm-.134.046h-.535v.171h.535zm-.535 0a.184.184 0 0 1-.114-.026l-.107.134a.345.345 0 0 0 .221.064zm-.114-.026a.389.389 0 0 1-.086-.144l-.158.066a.533.533 0 0 0 .137.212zm-.084-.14a1.514 1.514 0 0 0-.57-.8l-.093.144a1.343 1.343 0 0 1 .5.715zm-.568-.8a1.6 1.6 0 0 0-.918-.249v.171a1.435 1.435 0 0 1 .822.219zm-.918-.249a1.535 1.535 0 0 0-1.166.462l.124.118a1.364 1.364 0 0 1 1.042-.408zm-1.166.462a2.036 2.036 0 0 0-.458 1.36l.171.006a1.872 1.872 0 0 1 .411-1.249zm-.458 1.361l-.011.4h.171l.011-.4zm-.011.406l.011.379.171-.005-.011-.379zm.011.38a2.052 2.052 0 0 0 .458 1.371l.124-.118a1.889 1.889 0 0 1-.411-1.26zm.458 1.371a1.533 1.533 0 0 0 1.166.451v-.172a1.363 1.363 0 0 1-1.042-.4zm1.166.451a1.661 1.661 0 0 0 .916-.237l-.093-.144a1.491 1.491 0 0 1-.823.209zm.918-.238a1.576 1.576 0 0 0 .568-.812l-.162-.057a1.409 1.409 0 0 1-.5.727zm.566-.807a.39.39 0 0 1 .086-.144l-.107-.134a.533.533 0 0 0-.137.213zm.093-.151a.144.144 0 0 1 .107-.031v-.171a.31.31 0 0 0-.228.081zm.107-.031h.535v-.171h-.535zm.535 0a.173.173 0 0 1 .129.053l.121-.121a.344.344 0 0 0-.25-.1zm.134.057a.11.11 0 0 1 .037.1l.17.017a.281.281 0 0 0-.1-.252zm.037.109a1.664 1.664 0 0 1-.288.806l.144.092a1.839 1.839 0 0 0 .315-.889zm-.288.806a1.989 1.989 0 0 1-.792.683l.079.152a2.162 2.162 0 0 0 .858-.744zm-.793.684a2.8 2.8 0 0 1-1.32.28v.171a2.96 2.96 0 0 0 1.4-.3zm2.568.187l-.065.056.01.009zm0-7.772l.061.06zm.926 0l-.065.056.009.009zm.078 2.776h-.085a.086.086 0 0 0 .153.053zm.758-.624l.038.077zm2.743.468l-.065.056zm.524 5.151l-.061-.06zm-.925 0l-.065.056.009.009zm-.457-4.5l-.065.056zm-2.23.011l-.062-.059zm-.49 4.493l-.061-.06zm-.736-.019a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.367.367 0 0 0 .087.245zm-.046-.134v-7.4h-.172v7.4zm0-7.4a.156.156 0 0 1 .042-.118l-.121-.121a.326.326 0 0 0-.092.239zm.042-.118a.172.172 0 0 1 .129-.053v-.171a.343.343 0 0 0-.25.1zm.129-.053h.557v-.171h-.557zm.557 0a.137.137 0 0 1 .113.048l.13-.112a.308.308 0 0 0-.244-.108zm.122.057a.137.137 0 0 1 .048.113h.172a.309.309 0 0 0-.108-.243zm.048.113v2.6h.172v-2.6zm.153 2.651a2.076 2.076 0 0 1 .728-.6l-.075-.154a2.248 2.248 0 0 0-.788.649zm.73-.6a2.272 2.272 0 0 1 1.043-.214v-.171a2.438 2.438 0 0 0-1.121.232zm1.043-.214a1.982 1.982 0 0 1 1.6.661l.13-.112a2.152 2.152 0 0 0-1.727-.721zm1.6.663a2.557 2.557 0 0 1 .581 1.761h.171a2.727 2.727 0 0 0-.624-1.874zm.581 1.761v3.144h.171v-3.144zm0 3.144a.173.173 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm-.557 0a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.368.368 0 0 0 .087.245zm-.046-.134V823.8h-.172v3.088zm0-3.088a1.859 1.859 0 0 0-.412-1.284l-.128.114a1.69 1.69 0 0 1 .368 1.169zm-.411-1.283a1.471 1.471 0 0 0-1.169-.464v.171a1.3 1.3 0 0 1 1.039.406zm-1.169-.464a1.566 1.566 0 0 0-1.188.473l.124.118a1.4 1.4 0 0 1 1.064-.419zm-1.188.473a1.779 1.779 0 0 0-.436 1.275h.172a1.609 1.609 0 0 1 .389-1.156zm-.436 1.275v3.088h.172V823.8zm0 3.088a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm6.449-.505l-.062.059zm-.747-1.94h-.086zm-.012-.379h-.085v.005zm.012-.368l-.086-.006zm.758-1.918l-.061-.06zm3.735.078l-.065.056zm.6 2.5l.061.061zm-4.036.067v-.086a.086.086 0 0 0-.086.086zm0 .1h-.086zm.435 1.238l-.068.053zm1.918.3l.045.073zm.491-.435l-.069-.051zm.145-.156l.039.077h.006zm.9.022l-.055.066zm-.245.747l-.064-.057zm-.858.6l.035.078zm.267-3.189v.086a.086.086 0 0 0 .086-.086zm-.424-1.282l-.066.055zm-2.23 0l-.065-.055zm-.4 1.282h-.086a.086.086 0 0 0 .086.086zm1.528 3.349a2.38 2.38 0 0 1-1.779-.677l-.122.12a2.55 2.55 0 0 0 1.9.728zm-1.778-.676a2.86 2.86 0 0 1-.724-1.886l-.171.009a3.027 3.027 0 0 0 .771 1.995zm-.723-1.884l-.011-.379h-.171l.011.379zm-.011-.374l.011-.368-.172-.005-.011.368zm.011-.365a2.871 2.871 0 0 1 .735-1.864l-.124-.118a3.042 3.042 0 0 0-.782 1.971zm.734-1.864a2.331 2.331 0 0 1 1.756-.687v-.171a2.5 2.5 0 0 0-1.879.74zm1.756-.687a2.307 2.307 0 0 1 1.853.762l.13-.112a2.477 2.477 0 0 0-1.983-.821zm1.854.762a3.03 3.03 0 0 1 .659 2.062h.172a3.2 3.2 0 0 0-.7-2.175zm.659 2.062v.19h.172v-.19zm0 .19a.172.172 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-3.858v.171h3.858zm-3.944.086v.1h.172v-.1zm0 .1a2.2 2.2 0 0 0 .453 1.287l.135-.106a2.027 2.027 0 0 1-.417-1.189zm.454 1.288a1.418 1.418 0 0 0 1.148.533v-.171a1.247 1.247 0 0 1-1.015-.47zm1.148.533a1.647 1.647 0 0 0 .882-.214l-.09-.146a1.481 1.481 0 0 1-.791.188zm.882-.214a1.777 1.777 0 0 0 .515-.458l-.14-.1a1.613 1.613 0 0 1-.466.412zm.513-.456a1.251 1.251 0 0 1 .081-.1.28.28 0 0 1 .026-.025l.008-.006-.077-.153a.326.326 0 0 0-.083.068 1.55 1.55 0 0 0-.092.113zm.12-.134a.328.328 0 0 1 .146-.021v-.171a.468.468 0 0 0-.234.046zm.146-.021h.547v-.171h-.547zm.547 0a.166.166 0 0 1 .112.036l.11-.132a.337.337 0 0 0-.222-.076zm.112.036a.107.107 0 0 1 .036.09h.171a.277.277 0 0 0-.1-.222zm.036.09a.9.9 0 0 1-.291.534l.128.115a1.055 1.055 0 0 0 .334-.649zm-.291.535a2.42 2.42 0 0 1-.83.581l.072.156a2.6 2.6 0 0 0 .888-.624zm-.829.58a2.964 2.964 0 0 1-1.224.238v.171a3.133 3.133 0 0 0 1.295-.253zm.389-3.111v-.033h-.171v.033zm0-.033a1.9 1.9 0 0 0-.445-1.306l-.129.114a1.731 1.731 0 0 1 .4 1.192zm-.444-1.3a1.466 1.466 0 0 0-1.181-.521v.172a1.3 1.3 0 0 1 1.049.46zm-1.181-.521a1.466 1.466 0 0 0-1.18.521l.131.11a1.3 1.3 0 0 1 1.049-.46zm-1.181.521a1.965 1.965 0 0 0-.422 1.3h.172a1.794 1.794 0 0 1 .382-1.194zm-.422 1.3v.033h.172v-.033zm.086.119h3.055v-.171h-3.055z" fill="#51504f" data-name="Path 10" transform="translate(-1460.636 -807.945)"></path> |
| <path id="Path_11" d="M1519.066 884.011a.581.581 0 0 1-.567-.567 1.151 1.151 0 0 1 .028-.312l7.026-18.328a.881.881 0 0 1 .906-.623h1.926a.882.882 0 0 1 .907.623l7 18.328.057.312a.583.583 0 0 1-.567.567h-1.445a.735.735 0 0 1-.482-.142.9.9 0 0 1-.226-.34l-1.558-4.023h-9.292l-1.558 4.023a.8.8 0 0 1-.255.34.688.688 0 0 1-.453.142zm12.181-6.94l-3.824-10.056-3.823 10.055zm8.184-10.538a.592.592 0 0 1-.652-.651v-1.53a.714.714 0 0 1 .17-.482.656.656 0 0 1 .482-.2h1.785a.677.677 0 0 1 .68.68v1.53a.655.655 0 0 1-.2.481.713.713 0 0 1-.481.17zm.227 17.479a.593.593 0 0 1-.652-.652v-13.428a.611.611 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.359a.679.679 0 0 1 .652.651v13.427a.655.655 0 0 1-.2.482.613.613 0 0 1-.453.17zm6.861 0a.592.592 0 0 1-.651-.652v-13.4a.715.715 0 0 1 .17-.481.656.656 0 0 1 .482-.2h1.3a.677.677 0 0 1 .68.68v1.246a4.255 4.255 0 0 1 3.966-1.926h1.1a.679.679 0 0 1 .651.651v1.161a.566.566 0 0 1-.2.453.612.612 0 0 1-.453.17h-1.7a3.2 3.2 0 0 0-2.408.907 3.253 3.253 0 0 0-.879 2.408v8.328a.656.656 0 0 1-.2.482.716.716 0 0 1-.482.17zm12.234 0a.593.593 0 0 1-.651-.652v-11.814h-2.408a.592.592 0 0 1-.651-.651v-.963a.611.611 0 0 1 .17-.453.654.654 0 0 1 .481-.2h2.408v-1.417q0-4.816 4.872-4.815h1.586a.679.679 0 0 1 .652.651v.963a.656.656 0 0 1-.2.481.613.613 0 0 1-.453.17h-1.529a2.1 2.1 0 0 0-1.785.68 3.248 3.248 0 0 0-.51 2.011v1.275h6.062V863.7a.613.613 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.3a.679.679 0 0 1 .652.651v19.659a.655.655 0 0 1-.2.482.613.613 0 0 1-.454.17h-1.3a.592.592 0 0 1-.652-.652v-11.811h-6.062v11.813a.657.657 0 0 1-.2.482.614.614 0 0 1-.454.17zm20.9.283a6.487 6.487 0 0 1-4.844-1.757 6.837 6.837 0 0 1-1.813-4.674l-.029-1.218.029-1.218a6.732 6.732 0 0 1 1.841-4.646 7.389 7.389 0 0 1 9.631 0 6.736 6.736 0 0 1 1.841 4.646q.028.311.028 1.218t-.028 1.218a6.772 6.772 0 0 1-1.841 4.674 6.391 6.391 0 0 1-4.82 1.756zm0-2.181a3.582 3.582 0 0 0 2.8-1.133 4.931 4.931 0 0 0 1.133-3.258q.028-.283.028-1.076t-.028-1.076a4.931 4.931 0 0 0-1.133-3.258 3.582 3.582 0 0 0-2.8-1.133 3.671 3.671 0 0 0-2.833 1.133 4.83 4.83 0 0 0-1.1 3.258l-.028 1.076.028 1.076a4.83 4.83 0 0 0 1.1 3.258 3.671 3.671 0 0 0 2.828 1.132zm13.755 1.9a.846.846 0 0 1-.566-.17 1.321 1.321 0 0 1-.34-.538l-4.023-13.144-.056-.283a.575.575 0 0 1 .17-.425.641.641 0 0 1 .425-.17h1.246a.612.612 0 0 1 .453.17.646.646 0 0 1 .255.312l3.145 10.679 3.371-10.566a.761.761 0 0 1 .255-.4.726.726 0 0 1 .538-.2h.963a.728.728 0 0 1 .539.2.76.76 0 0 1 .255.4l3.371 10.566 3.144-10.679a.655.655 0 0 1 .2-.312.714.714 0 0 1 .482-.17h1.275a.542.542 0 0 1 .4.17.576.576 0 0 1 .17.425l-.057.283-3.994 13.144a1.323 1.323 0 0 1-.34.538.9.9 0 0 1-.6.17h-1.1a.86.86 0 0 1-.935-.708l-3.286-10.141-3.286 10.141a.928.928 0 0 1-.963.708z" fill="#51504f" data-name="Path 11" transform="translate(-1454.66 -838.62)"></path> |
| </g> |
| </g> |
| </g> |
| </svg> |
| |
| </a> |
| </div> |
| |
| <div id="content-close-button"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="19.799" height="19.799" viewBox="0 0 19.799 19.799"> |
| <g id="Group_1574" data-name="Group 1574" transform="translate(-41.892 290.899)"> |
| <g id="Group_1291" data-name="Group 1291" transform="rotate(-45 -308.114 -187.077)"> |
| <rect id="Rectangle_461" width="26" height="2" fill="#51504f" data-name="Rectangle 461" rx="1" transform="translate(-.209)"></rect> |
| </g> |
| <g id="Group_1292" data-name="Group 1292" transform="rotate(45 372.48 -93.011)"> |
| <rect id="Rectangle_462" width="26" height="2" fill="#51504f" data-name="Rectangle 462" rx="1" transform="translate(-.209 -.178)"></rect> |
| </g> |
| </g> |
| </svg> |
| |
| </div> |
| |
| </nav> |
| <div class="content-drawer-container" id="content-drawer"> |
| <div class="content-drawer"> |
| <div class="td-sidebar"> |
| |
| <div id="docs-version-selector" class="docs-version-selector sidebar__version-selector"> |
| <a class="dropdown-toggle" href="#" id="versionDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" |
| aria-expanded="false"> |
| <span class="bodytext__medium--greyish-brown">Version: </span><span class="version">2.0.1</span> |
| </a> |
| <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> |
| |
| </div> |
| <script type="application/x-template" id="version-item-template"> |
| <a class="dropdown-item"></a> |
| </script> |
| </div> |
| |
| <div class="searchb-box"> |
| <form class="search-form" action="search.html" method="get"> |
| <input class="search-form__input" type="text" name="q" placeholder="Search docs" size="16"> |
| <input type="hidden" name="check_keywords" value="yes" /> |
| <input type="hidden" name="area" value="default" /> |
| |
| <button class="search-form__button" type="submit"> |
| |
| <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"> |
| <g id="Group_1579" data-name="Group 1579" transform="translate(-41.001 -41)"> |
| <path id="Path_169" d="M71.415 64.687a7.215 7.215 0 1 0-6.729 6.728 7.222 7.222 0 0 0 6.729-6.728z" fill="none" data-name="Path 169" transform="translate(-14.277 -14.276)"></path> |
| <path id="Path_170" d="M60.863 59.8l-6.093-6.09a7.78 7.78 0 1 0-1.06 1.06l6.09 6.093a.468.468 0 0 0 .662 0l.4-.4a.468.468 0 0 0 .001-.663zM42.512 49.183a6.274 6.274 0 1 1 5.851 5.85 6.28 6.28 0 0 1-5.851-5.85z" fill="#51504f" data-name="Path 170"></path> |
| </g> |
| </svg> |
| </button> |
| </form> |
| </div> |
| |
| |
| <style> |
| .searchb-box { |
| margin-bottom: 26px; |
| } |
| .searchb-box .search-form { |
| width: 100%; |
| margin-top: 20px; |
| } |
| </style> |
| |
| |
| <div class="toctree" role="navigation" aria-label="main navigation"> |
| <p class="caption"><span class="caption-text">Content</span></p> |
| <ul class="current"> |
| <li class="toctree-l1"><a class="reference internal" href="index.html">Home</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="project.html">Project</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="license.html">License</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="start/index.html">Quick start</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="upgrading-to-2.html">Upgrading to Airflow 2.0+</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="upgrade-check.html">Upgrade Check Script</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="tutorial.html">Tutorial</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="tutorial_taskflow_api.html">Tutorial on the Taskflow API</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="howto/index.html">How-to Guides</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="ui.html">UI / Screenshots</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="concepts.html">Concepts</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="scheduler.html">Scheduler</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="executor/index.html">Executor</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="dag-run.html">DAG Runs</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="plugins.html">Plugins</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="security/index.html">Security</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="logging-monitoring/index.html">Logging & Monitoring</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="timezone.html">Time zones</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="usage-cli.html">Using the CLI</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="integration.html">Integration</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="kubernetes.html">Kubernetes</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="lineage.html">Lineage</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="dag-serialization.html">DAG Serialization</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="modules_management.html">Modules Management</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="smart-sensor.html">Smart Sensor</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="changelog.html">Changelog</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="best-practices.html">Best Practices</a></li> |
| <li class="toctree-l1 current"><a class="current reference internal" href="#">Production Deployment</a><ul> |
| <li class="toctree-l2"><a class="reference internal" href="#database-backend">Database backend</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#multi-node-cluster">Multi-Node Cluster</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#logging">Logging</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#configuration">Configuration</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#scheduler-uptime">Scheduler Uptime</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#production-container-images">Production Container Images</a><ul> |
| <li class="toctree-l3"><a class="reference internal" href="#production-ready-reference-image">Production-ready reference Image</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#customizing-or-extending-the-production-image">Customizing or extending the Production Image</a><ul> |
| <li class="toctree-l4"><a class="reference internal" href="#extending-the-image">Extending the image</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#customizing-the-image">Customizing the image</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#customizing-images-in-high-security-restricted-environments">Customizing images in high security restricted environments</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#customizing-extending-the-image-together">Customizing & extending the image together</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#customizing-pypi-installation">Customizing PYPI installation</a></li> |
| </ul> |
| </li> |
| <li class="toctree-l3"><a class="reference internal" href="#external-sources-for-dependencies">External sources for dependencies</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#comparing-extending-and-customizing-the-image">Comparing extending and customizing the image</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#using-the-production-image">Using the production image</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#id1">Production image build arguments</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#actions-executed-at-image-start">Actions executed at image start</a><ul> |
| <li class="toctree-l4"><a class="reference internal" href="#creating-system-user">Creating system user</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#waits-for-airflow-db-connection">Waits for Airflow DB connection</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#upgrading-airflow-db">Upgrading Airflow DB</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#creating-admin-user">Creating admin user</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#waits-for-celery-broker-connection">Waits for celery broker connection</a></li> |
| </ul> |
| </li> |
| <li class="toctree-l3"><a class="reference internal" href="#recipes">Recipes</a><ul> |
| <li class="toctree-l4"><a class="reference internal" href="#google-cloud-sdk-installation">Google Cloud SDK installation</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#apache-hadoop-stack-installation">Apache Hadoop Stack installation</a></li> |
| </ul> |
| </li> |
| <li class="toctree-l3"><a class="reference internal" href="#more-details-about-the-images">More details about the images</a></li> |
| </ul> |
| </li> |
| <li class="toctree-l2"><a class="reference internal" href="#kerberos-authenticated-workers">Kerberos-authenticated workers</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#secured-server-and-service-access-on-google-cloud">Secured Server and Service Access on Google Cloud</a><ul> |
| <li class="toctree-l3"><a class="reference internal" href="#iam-and-service-accounts">IAM and Service Accounts</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#impersonate-service-accounts">Impersonate Service Accounts</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#access-to-compute-engine-instance">Access to Compute Engine Instance</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#access-to-amazon-web-service">Access to Amazon Web Service</a></li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li class="toctree-l1"><a class="reference internal" href="backport-providers.html">Backport Providers</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="faq.html">FAQ</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="privacy_notice.html">Privacy Notice</a></li> |
| </ul> |
| <p class="caption"><span class="caption-text">References</span></p> |
| <ul> |
| <li class="toctree-l1"><a class="reference internal" href="operators-and-hooks-ref.html">Operators and hooks</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="cli-and-env-variables-ref.html">CLI</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="macros-ref.html">Macros</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="python-api-ref.html">Python API</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="rest-api-ref.html">Experimental REST API</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="stable-rest-api-ref.html">Stable REST API</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="configurations-ref.html">Configurations</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="extra-packages-ref.html">Extra packages</a></li> |
| </ul> |
| |
| </div> |
| |
| <style type="text/css"> |
| .toctree { |
| } |
| .toctree li { |
| list-style: none; |
| } |
| .toctree .caption { |
| font-family: Roboto; |
| font-size: 18px; |
| font-weight: bold; |
| font-stretch: normal; |
| font-style: normal; |
| line-height: 1.33; |
| letter-spacing: normal; |
| color: #51504f; |
| padding-bottom: 13px; |
| text-transform: uppercase; |
| margin-bottom: 0; |
| } |
| .toctree .current > a:not([href="#"]) { |
| color: #017cee; |
| } |
| .toctree > ul { |
| padding-left: 0; |
| } |
| .toctree ul { |
| padding-left: 15px; |
| display: none; |
| } |
| .toctree > ul, |
| .toctree li.current > ul { |
| display: block; |
| } |
| |
| .toctree a .toctree-expand { |
| display: inline-block; |
| position: relative; |
| height: 1em; |
| } |
| |
| .toctree a .toctree-expand:before { |
| position: absolute; |
| top: 6px; |
| left: -12px; |
| content: '►'; |
| font-size: 7px; |
| } |
| .toctree .current > a > .toctree-expand:before { |
| content: '▼'; |
| } |
| |
| .toctree .current { |
| color: #017cee; |
| } |
| .toctree li { |
| font-family: Roboto; |
| font-size: 16px; |
| font-weight: normal; |
| font-stretch: normal; |
| font-style: normal; |
| line-height: 1.63; |
| letter-spacing: normal; |
| color: #707070; |
| } |
| |
| </style> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <div class="d-flex"> |
| |
| |
| <div class="td-sidebar desktop-only d-print-none"> |
| |
| <div id="docs-version-selector" class="docs-version-selector sidebar__version-selector"> |
| <a class="dropdown-toggle" href="#" id="versionDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" |
| aria-expanded="false"> |
| <span class="bodytext__medium--greyish-brown">Version: </span><span class="version">2.0.1</span> |
| </a> |
| <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> |
| |
| </div> |
| <script type="application/x-template" id="version-item-template"> |
| <a class="dropdown-item"></a> |
| </script> |
| </div> |
| |
| <div class="searchb-box"> |
| <form class="search-form" action="search.html" method="get"> |
| <input class="search-form__input" type="text" name="q" placeholder="Search docs" size="16"> |
| <input type="hidden" name="check_keywords" value="yes" /> |
| <input type="hidden" name="area" value="default" /> |
| |
| <button class="search-form__button" type="submit"> |
| |
| <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"> |
| <g id="Group_1579" data-name="Group 1579" transform="translate(-41.001 -41)"> |
| <path id="Path_169" d="M71.415 64.687a7.215 7.215 0 1 0-6.729 6.728 7.222 7.222 0 0 0 6.729-6.728z" fill="none" data-name="Path 169" transform="translate(-14.277 -14.276)"></path> |
| <path id="Path_170" d="M60.863 59.8l-6.093-6.09a7.78 7.78 0 1 0-1.06 1.06l6.09 6.093a.468.468 0 0 0 .662 0l.4-.4a.468.468 0 0 0 .001-.663zM42.512 49.183a6.274 6.274 0 1 1 5.851 5.85 6.28 6.28 0 0 1-5.851-5.85z" fill="#51504f" data-name="Path 170"></path> |
| </g> |
| </svg> |
| </button> |
| </form> |
| </div> |
| |
| |
| <style> |
| .searchb-box { |
| margin-bottom: 26px; |
| } |
| .searchb-box .search-form { |
| width: 100%; |
| margin-top: 20px; |
| } |
| </style> |
| |
| |
| <div class="toctree" role="navigation" aria-label="main navigation"> |
| <p class="caption"><span class="caption-text">Content</span></p> |
| <ul class="current"> |
| <li class="toctree-l1"><a class="reference internal" href="index.html">Home</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="project.html">Project</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="license.html">License</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="start/index.html">Quick start</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="upgrading-to-2.html">Upgrading to Airflow 2.0+</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="upgrade-check.html">Upgrade Check Script</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="tutorial.html">Tutorial</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="tutorial_taskflow_api.html">Tutorial on the Taskflow API</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="howto/index.html">How-to Guides</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="ui.html">UI / Screenshots</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="concepts.html">Concepts</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="scheduler.html">Scheduler</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="executor/index.html">Executor</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="dag-run.html">DAG Runs</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="plugins.html">Plugins</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="security/index.html">Security</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="logging-monitoring/index.html">Logging & Monitoring</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="timezone.html">Time zones</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="usage-cli.html">Using the CLI</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="integration.html">Integration</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="kubernetes.html">Kubernetes</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="lineage.html">Lineage</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="dag-serialization.html">DAG Serialization</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="modules_management.html">Modules Management</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="smart-sensor.html">Smart Sensor</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="changelog.html">Changelog</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="best-practices.html">Best Practices</a></li> |
| <li class="toctree-l1 current"><a class="current reference internal" href="#">Production Deployment</a><ul> |
| <li class="toctree-l2"><a class="reference internal" href="#database-backend">Database backend</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#multi-node-cluster">Multi-Node Cluster</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#logging">Logging</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#configuration">Configuration</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#scheduler-uptime">Scheduler Uptime</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#production-container-images">Production Container Images</a><ul> |
| <li class="toctree-l3"><a class="reference internal" href="#production-ready-reference-image">Production-ready reference Image</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#customizing-or-extending-the-production-image">Customizing or extending the Production Image</a><ul> |
| <li class="toctree-l4"><a class="reference internal" href="#extending-the-image">Extending the image</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#customizing-the-image">Customizing the image</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#customizing-images-in-high-security-restricted-environments">Customizing images in high security restricted environments</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#customizing-extending-the-image-together">Customizing & extending the image together</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#customizing-pypi-installation">Customizing PYPI installation</a></li> |
| </ul> |
| </li> |
| <li class="toctree-l3"><a class="reference internal" href="#external-sources-for-dependencies">External sources for dependencies</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#comparing-extending-and-customizing-the-image">Comparing extending and customizing the image</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#using-the-production-image">Using the production image</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#id1">Production image build arguments</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#actions-executed-at-image-start">Actions executed at image start</a><ul> |
| <li class="toctree-l4"><a class="reference internal" href="#creating-system-user">Creating system user</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#waits-for-airflow-db-connection">Waits for Airflow DB connection</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#upgrading-airflow-db">Upgrading Airflow DB</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#creating-admin-user">Creating admin user</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#waits-for-celery-broker-connection">Waits for celery broker connection</a></li> |
| </ul> |
| </li> |
| <li class="toctree-l3"><a class="reference internal" href="#recipes">Recipes</a><ul> |
| <li class="toctree-l4"><a class="reference internal" href="#google-cloud-sdk-installation">Google Cloud SDK installation</a></li> |
| <li class="toctree-l4"><a class="reference internal" href="#apache-hadoop-stack-installation">Apache Hadoop Stack installation</a></li> |
| </ul> |
| </li> |
| <li class="toctree-l3"><a class="reference internal" href="#more-details-about-the-images">More details about the images</a></li> |
| </ul> |
| </li> |
| <li class="toctree-l2"><a class="reference internal" href="#kerberos-authenticated-workers">Kerberos-authenticated workers</a></li> |
| <li class="toctree-l2"><a class="reference internal" href="#secured-server-and-service-access-on-google-cloud">Secured Server and Service Access on Google Cloud</a><ul> |
| <li class="toctree-l3"><a class="reference internal" href="#iam-and-service-accounts">IAM and Service Accounts</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#impersonate-service-accounts">Impersonate Service Accounts</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#access-to-compute-engine-instance">Access to Compute Engine Instance</a></li> |
| <li class="toctree-l3"><a class="reference internal" href="#access-to-amazon-web-service">Access to Amazon Web Service</a></li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li class="toctree-l1"><a class="reference internal" href="backport-providers.html">Backport Providers</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="faq.html">FAQ</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="privacy_notice.html">Privacy Notice</a></li> |
| </ul> |
| <p class="caption"><span class="caption-text">References</span></p> |
| <ul> |
| <li class="toctree-l1"><a class="reference internal" href="operators-and-hooks-ref.html">Operators and hooks</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="cli-and-env-variables-ref.html">CLI</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="macros-ref.html">Macros</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="python-api-ref.html">Python API</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="rest-api-ref.html">Experimental REST API</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="stable-rest-api-ref.html">Stable REST API</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="configurations-ref.html">Configurations</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="extra-packages-ref.html">Extra packages</a></li> |
| </ul> |
| |
| </div> |
| |
| <style type="text/css"> |
| .toctree { |
| } |
| .toctree li { |
| list-style: none; |
| } |
| .toctree .caption { |
| font-family: Roboto; |
| font-size: 18px; |
| font-weight: bold; |
| font-stretch: normal; |
| font-style: normal; |
| line-height: 1.33; |
| letter-spacing: normal; |
| color: #51504f; |
| padding-bottom: 13px; |
| text-transform: uppercase; |
| margin-bottom: 0; |
| } |
| .toctree .current > a:not([href="#"]) { |
| color: #017cee; |
| } |
| .toctree > ul { |
| padding-left: 0; |
| } |
| .toctree ul { |
| padding-left: 15px; |
| display: none; |
| } |
| .toctree > ul, |
| .toctree li.current > ul { |
| display: block; |
| } |
| |
| .toctree a .toctree-expand { |
| display: inline-block; |
| position: relative; |
| height: 1em; |
| } |
| |
| .toctree a .toctree-expand:before { |
| position: absolute; |
| top: 6px; |
| left: -12px; |
| content: '►'; |
| font-size: 7px; |
| } |
| .toctree .current > a > .toctree-expand:before { |
| content: '▼'; |
| } |
| |
| .toctree .current { |
| color: #017cee; |
| } |
| .toctree li { |
| font-family: Roboto; |
| font-size: 16px; |
| font-weight: normal; |
| font-stretch: normal; |
| font-style: normal; |
| line-height: 1.63; |
| letter-spacing: normal; |
| color: #707070; |
| } |
| |
| </style> |
| </div> |
| |
| |
| |
| |
| <main class="col-12 col-md-9 col-xl-8" role="main"> |
| |
| |
| |
| |
| |
| |
| |
| |
| <div role="navigation" aria-label="breadcrumbs navigation" class="d-none d-md-block d-print-none"> |
| |
| <ul class="breadcrumb"> |
| |
| <li class="breadcrumb-item"><a href="index.html" class="icon icon-home"> Home</a></li> |
| |
| <li class="breadcrumb-item"><a href="production-deployment.html"> Production Deployment</a></li> |
| |
| </ul> |
| </div> |
| |
| <div class="rst-content"> |
| <div class="document"> |
| <div class="documentwrapper"> |
| <div class="bodywrapper"> |
| <div class="body" role="main"> |
| |
| <blockquote> |
| <div></div></blockquote> |
| <div class="section" id="production-deployment"> |
| <h1>Production Deployment<a class="headerlink" href="#production-deployment" title="Permalink to this headline">¶</a></h1> |
| <p>It is time to deploy your DAG in production. To do this, first, you need to make sure that the Airflow |
| is itself production-ready. Let’s see what precautions you need to take.</p> |
| <div class="section" id="database-backend"> |
| <h2>Database backend<a class="headerlink" href="#database-backend" title="Permalink to this headline">¶</a></h2> |
| <p>Airflow comes with an <code class="docutils literal notranslate"><span class="pre">SQLite</span></code> backend by default. This allows the user to run Airflow without any external |
| database. However, such a setup is meant to be used for testing purposes only; running the default setup |
| in production can lead to data loss in multiple scenarios. If you want to run production-grade Airflow, |
| make sure you <a class="reference internal" href="howto/set-up-database.html"><span class="doc">configure the backend</span></a> to be an external database |
| such as PostgreSQL or MySQL.</p> |
| <p>You can change the backend using the following config</p> |
| <div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[core]</span> |
| <span class="na">sql_alchemy_conn</span> <span class="o">=</span> <span class="s">my_conn_string</span> |
| </pre></div> |
| </div> |
| <p>Once you have changed the backend, airflow needs to create all the tables required for operation. |
| Create an empty DB and give airflow’s user the permission to <code class="docutils literal notranslate"><span class="pre">CREATE/ALTER</span></code> it. |
| Once that is done, you can run -</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>airflow db upgrade |
| </pre></div> |
| </div> |
| <p><code class="docutils literal notranslate"><span class="pre">upgrade</span></code> keeps track of migrations already applied, so it’s safe to run as often as you need.</p> |
| <div class="admonition note"> |
| <p class="admonition-title">Note</p> |
| <p>Do not use <code class="docutils literal notranslate"><span class="pre">airflow</span> <span class="pre">db</span> <span class="pre">init</span></code> as it can create a lot of default connections, charts, etc. which are not |
| required in production DB.</p> |
| </div> |
| </div> |
| <div class="section" id="multi-node-cluster"> |
| <h2>Multi-Node Cluster<a class="headerlink" href="#multi-node-cluster" title="Permalink to this headline">¶</a></h2> |
| <p>Airflow uses <a class="reference internal" href="_api/airflow/executors/sequential_executor/index.html#airflow.executors.sequential_executor.SequentialExecutor" title="airflow.executors.sequential_executor.SequentialExecutor"><code class="xref py py-class docutils literal notranslate"><span class="pre">SequentialExecutor</span></code></a> by default. However, by it |
| nature, the user is limited to executing at most one task at a time. <code class="docutils literal notranslate"><span class="pre">Sequential</span> <span class="pre">Executor</span></code> also pauses |
| the scheduler when it runs a task, hence not recommended in a production setup. You should use the |
| <a class="reference internal" href="_api/airflow/executors/local_executor/index.html#airflow.executors.local_executor.LocalExecutor" title="airflow.executors.local_executor.LocalExecutor"><code class="xref py py-class docutils literal notranslate"><span class="pre">LocalExecutor</span></code></a> for a single machine. |
| For a multi-node setup, you should use the <a class="reference internal" href="executor/kubernetes.html"><span class="doc">Kubernetes executor</span></a> or |
| the <a class="reference internal" href="executor/celery.html"><span class="doc">Celery executor</span></a>.</p> |
| <p>Once you have configured the executor, it is necessary to make sure that every node in the cluster contains |
| the same configuration and dags. Airflow sends simple instructions such as “execute task X of dag Y”, but |
| does not send any dag files or configuration. You can use a simple cronjob or any other mechanism to sync |
| DAGs and configs across your nodes, e.g., checkout DAGs from git repo every 5 minutes on all nodes.</p> |
| </div> |
| <div class="section" id="logging"> |
| <h2>Logging<a class="headerlink" href="#logging" title="Permalink to this headline">¶</a></h2> |
| <p>If you are using disposable nodes in your cluster, configure the log storage to be a distributed file system |
| (DFS) such as <code class="docutils literal notranslate"><span class="pre">S3</span></code> and <code class="docutils literal notranslate"><span class="pre">GCS</span></code>, or external services such as Stackdriver Logging, Elasticsearch or |
| Amazon CloudWatch. This way, the logs are available even after the node goes down or gets replaced. |
| See <a class="reference internal" href="logging-monitoring/logging-tasks.html"><span class="doc">Logging for Tasks</span></a> for configurations.</p> |
| <div class="admonition note"> |
| <p class="admonition-title">Note</p> |
| <p>The logs only appear in your DFS after the task has finished. You can view the logs while the task is |
| running in UI itself.</p> |
| </div> |
| </div> |
| <div class="section" id="configuration"> |
| <h2>Configuration<a class="headerlink" href="#configuration" title="Permalink to this headline">¶</a></h2> |
| <p>Airflow comes bundled with a default <code class="docutils literal notranslate"><span class="pre">airflow.cfg</span></code> configuration file. |
| You should use environment variables for configurations that change across deployments |
| e.g. metadata DB, password, etc. You can accomplish this using the format <span class="target" id="index-0"></span><a class="reference internal" href="cli-and-env-variables-ref.html#envvar-AIRFLOW__-SECTION-__-KEY"><code class="xref std std-envvar docutils literal notranslate"><span class="pre">AIRFLOW__{SECTION}__{KEY}</span></code></a></p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="nv">AIRFLOW__CORE__SQL_ALCHEMY_CONN</span><span class="o">=</span>my_conn_id |
| <span class="nv">AIRFLOW__WEBSERVER__BASE_URL</span><span class="o">=</span>http://host:port |
| </pre></div> |
| </div> |
| <p>Some configurations such as the Airflow Backend connection URI can be derived from bash commands as well:</p> |
| <div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="na">sql_alchemy_conn_cmd</span> <span class="o">=</span> <span class="s">bash_command_to_run</span> |
| </pre></div> |
| </div> |
| </div> |
| <div class="section" id="scheduler-uptime"> |
| <h2>Scheduler Uptime<a class="headerlink" href="#scheduler-uptime" title="Permalink to this headline">¶</a></h2> |
| <p>Airflow users occasionally report instances of the scheduler hanging without a trace, for example in these issues:</p> |
| <ul class="simple"> |
| <li><p><a class="reference external" href="https://github.com/apache/airflow/issues/7935">Scheduler gets stuck without a trace</a></p></li> |
| <li><p><a class="reference external" href="https://github.com/apache/airflow/issues/13243">Scheduler stopping frequently</a></p></li> |
| </ul> |
| <p>Strategies for mitigation:</p> |
| <ul class="simple"> |
| <li><p>When running on kubernetes, use a <code class="docutils literal notranslate"><span class="pre">livenessProbe</span></code> on the scheduler deployment to fail if the scheduler |
| has not heartbeat in a while. |
| <a class="reference external" href="https://github.com/apache/airflow/blob/190066cf201e5b0442bbbd6df74efecae523ee76/chart/templates/scheduler/scheduler-deployment.yaml#L118-L136">Example:</a>.</p></li> |
| </ul> |
| </div> |
| <div class="section" id="production-container-images"> |
| <span id="docker-image"></span><h2>Production Container Images<a class="headerlink" href="#production-container-images" title="Permalink to this headline">¶</a></h2> |
| <div class="section" id="production-ready-reference-image"> |
| <h3>Production-ready reference Image<a class="headerlink" href="#production-ready-reference-image" title="Permalink to this headline">¶</a></h3> |
| <p>For the ease of deployment in production, the community releases a production-ready reference container |
| image.</p> |
| <p>The docker image provided (as convenience binary package) in the |
| <a class="reference external" href="https://hub.docker.com/r/apache/airflow">Apache Airflow DockerHub</a> is a bare image |
| that has a few external dependencies and extras installed..</p> |
| <p>The Apache Airflow image provided as convenience package is optimized for size, so |
| it provides just a bare minimal set of the extras and dependencies installed and in most cases |
| you want to either extend or customize the image. You can see all possible extras in |
| <a class="reference internal" href="extra-packages-ref.html"><span class="doc">Reference for package extras</span></a>. The set of extras used in Airflow Production image are available in the |
| <a class="reference external" href="https://github.com/apache/airflow/blob/2c6c7fdb2308de98e142618836bdf414df9768c8/Dockerfile#L39">Dockerfile</a>.</p> |
| <p>The production images are build in DockerHub from released version and release candidates. There |
| are also images published from branches but they are used mainly for development and testing purpose. |
| See <a class="reference external" href="https://github.com/apache/airflow/blob/master/CONTRIBUTING.rst#airflow-git-branches">Airflow Git Branching</a> |
| for details.</p> |
| </div> |
| <div class="section" id="customizing-or-extending-the-production-image"> |
| <h3>Customizing or extending the Production Image<a class="headerlink" href="#customizing-or-extending-the-production-image" title="Permalink to this headline">¶</a></h3> |
| <p>Before you dive-deeply in the way how the Airflow Image is build, named and why we are doing it the |
| way we do, you might want to know very quickly how you can extend or customize the existing image |
| for Apache Airflow. This chapter gives you a short answer to those questions.</p> |
| <p>Airflow Summit 2020’s <a class="reference external" href="https://youtu.be/wDr3Y7q2XoI">Production Docker Image</a> talk provides more |
| details about the context, architecture and customization/extension methods for the Production Image.</p> |
| <div class="section" id="extending-the-image"> |
| <h4>Extending the image<a class="headerlink" href="#extending-the-image" title="Permalink to this headline">¶</a></h4> |
| <p>Extending the image is easiest if you just need to add some dependencies that do not require |
| compiling. The compilation framework of Linux (so called <code class="docutils literal notranslate"><span class="pre">build-essential</span></code>) is pretty big, and |
| for the production images, size is really important factor to optimize for, so our Production Image |
| does not contain <code class="docutils literal notranslate"><span class="pre">build-essential</span></code>. If you need compiler like gcc or g++ or make/cmake etc. - those |
| are not found in the image and it is recommended that you follow the “customize” route instead.</p> |
| <p>How to extend the image - it is something you are most likely familiar with - simply |
| build a new image using Dockerfile’s <code class="docutils literal notranslate"><span class="pre">FROM</span></code> directive and add whatever you need. Then you can add your |
| Debian dependencies with <code class="docutils literal notranslate"><span class="pre">apt</span></code> or PyPI dependencies with <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span></code> or any other stuff you need.</p> |
| <p>You should be aware, about a few things:</p> |
| <ul class="simple"> |
| <li><p>The production image of airflow uses “airflow” user, so if you want to add some of the tools |
| as <code class="docutils literal notranslate"><span class="pre">root</span></code> user, you need to switch to it with <code class="docutils literal notranslate"><span class="pre">USER</span></code> directive of the Dockerfile. Also you |
| should remember about following the |
| <a class="reference external" href="https://docs.docker.com/develop/develop-images/dockerfile_best-practices/">best practises of Dockerfiles</a> |
| to make sure your image is lean and small.</p></li> |
| </ul> |
| <div class="highlight-dockerfile notranslate"><div class="highlight"><pre><span></span><span class="k">FROM</span> <span class="s">apache/airflow:2.0.0</span> |
| <span class="k">USER</span><span class="s"> root</span> |
| <span class="k">RUN</span> apt-get update <span class="se">\</span> |
| <span class="o">&&</span> apt-get install -y --no-install-recommends <span class="se">\</span> |
| my-awesome-apt-dependency-to-add <span class="se">\</span> |
| <span class="o">&&</span> apt-get autoremove -yqq --purge <span class="se">\</span> |
| <span class="o">&&</span> apt-get clean <span class="se">\</span> |
| <span class="o">&&</span> rm -rf /var/lib/apt/lists/* |
| <span class="k">USER</span><span class="s"> airflow</span> |
| </pre></div> |
| </div> |
| <ul class="simple"> |
| <li><p>PyPI dependencies in Apache Airflow are installed in the user library, of the “airflow” user, so |
| you need to install them with the <code class="docutils literal notranslate"><span class="pre">--user</span></code> flag and WITHOUT switching to airflow user. Note also |
| that using –no-cache-dir is a good idea that can help to make your image smaller.</p></li> |
| </ul> |
| <div class="highlight-dockerfile notranslate"><div class="highlight"><pre><span></span><span class="k">FROM</span> <span class="s">apache/airflow:2.0.0</span> |
| <span class="k">RUN</span> pip install --no-cache-dir --user my-awesome-pip-dependency-to-add |
| </pre></div> |
| </div> |
| <ul class="simple"> |
| <li><p>If your apt, or PyPI dependencies require some of the build-essentials, then your best choice is |
| to follow the “Customize the image” route. However it requires to checkout sources of Apache Airflow, |
| so you might still want to choose to add build essentials to your image, even if your image will |
| be significantly bigger.</p></li> |
| </ul> |
| <div class="highlight-dockerfile notranslate"><div class="highlight"><pre><span></span><span class="k">FROM</span> <span class="s">apache/airflow:2.0.0</span> |
| <span class="k">USER</span><span class="s"> root</span> |
| <span class="k">RUN</span> apt-get update <span class="se">\</span> |
| <span class="o">&&</span> apt-get install -y --no-install-recommends <span class="se">\</span> |
| build-essential my-awesome-apt-dependency-to-add <span class="se">\</span> |
| <span class="o">&&</span> apt-get autoremove -yqq --purge <span class="se">\</span> |
| <span class="o">&&</span> apt-get clean <span class="se">\</span> |
| <span class="o">&&</span> rm -rf /var/lib/apt/lists/* |
| <span class="k">USER</span><span class="s"> airflow</span> |
| <span class="k">RUN</span> pip install --no-cache-dir --user my-awesome-pip-dependency-to-add |
| </pre></div> |
| </div> |
| <ul class="simple"> |
| <li><p>You can also embed your dags in the image by simply adding them with COPY directive of Airflow. |
| The DAGs in production image are in /opt/airflow/dags folder.</p></li> |
| </ul> |
| </div> |
| <div class="section" id="customizing-the-image"> |
| <h4>Customizing the image<a class="headerlink" href="#customizing-the-image" title="Permalink to this headline">¶</a></h4> |
| <p>Customizing the image is an alternative way of adding your own dependencies to the image - better |
| suited to prepare optimized production images.</p> |
| <p>The advantage of this method is that it produces optimized image even if you need some compile-time |
| dependencies that are not needed in the final image. You need to use Airflow Sources to build such images |
| from the <a class="reference external" href="https://downloads.apache.org/airflow/">official distribution folder of Apache Airflow</a> for the |
| released versions, or checked out from the GitHub project if you happen to do it from git sources.</p> |
| <p>The easiest way to build the image image is to use <code class="docutils literal notranslate"><span class="pre">breeze</span></code> script, but you can also build such customized |
| image by running appropriately crafted docker build in which you specify all the <code class="docutils literal notranslate"><span class="pre">build-args</span></code> |
| that you need to add to customize it. You can read about all the args and ways you can build the image |
| in the <a class="reference external" href="#production-image-build-arguments">#production-image-build-arguments</a> chapter below.</p> |
| <p>Here just a few examples are presented which should give you general understanding of what you can customize.</p> |
| <p>This builds the production image in version 3.7 with additional airflow extras from 2.0.0 PyPI package and |
| additional apt dev and runtime dependencies.</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker build . <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_BASE_IMAGE</span><span class="o">=</span><span class="s2">"python:3.7-slim-buster"</span> <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_MAJOR_MINOR_VERSION</span><span class="o">=</span><span class="m">3</span>.7 <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALLATION_METHOD</span><span class="o">=</span><span class="s2">"apache-airflow"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_VERSION</span><span class="o">=</span><span class="s2">"2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALL_VERSION</span><span class="o">=</span><span class="s2">"==2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_CONSTRAINTS_REFERENCE</span><span class="o">=</span><span class="s2">"constraints-2-0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_FROM</span><span class="o">=</span><span class="s2">"empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_TO</span><span class="o">=</span><span class="s2">"/empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_AIRFLOW_EXTRAS</span><span class="o">=</span><span class="s2">"jdbc"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_PYTHON_DEPS</span><span class="o">=</span><span class="s2">"pandas"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_DEV_APT_DEPS</span><span class="o">=</span><span class="s2">"gcc g++"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_RUNTIME_APT_DEPS</span><span class="o">=</span><span class="s2">"default-jre-headless"</span> <span class="se">\</span> |
| --tag my-image |
| </pre></div> |
| </div> |
| <p>the same image can be built using <code class="docutils literal notranslate"><span class="pre">breeze</span></code> (it supports auto-completion of the options):</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>./breeze build-image <span class="se">\</span> |
| --production-image --python <span class="m">3</span>.7 --install-airflow-version<span class="o">=</span><span class="m">2</span>.0.0 <span class="se">\</span> |
| --additional-extras<span class="o">=</span>jdbc --additional-python-deps<span class="o">=</span><span class="s2">"pandas"</span> <span class="se">\</span> |
| --additional-dev-apt-deps<span class="o">=</span><span class="s2">"gcc g++"</span> --additional-runtime-apt-deps<span class="o">=</span><span class="s2">"default-jre-headless"</span> |
| </pre></div> |
| </div> |
| <p>You can customize more aspects of the image - such as additional commands executed before apt dependencies |
| are installed, or adding extra sources to install your dependencies from. You can see all the arguments |
| described below but here is an example of rather complex command to customize the image |
| based on example in <a class="reference external" href="https://github.com/apache/airflow/issues/8605#issuecomment-690065621">this comment</a>:</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker build . -f Dockerfile <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_BASE_IMAGE</span><span class="o">=</span><span class="s2">"python:3.7-slim-buster"</span> <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_MAJOR_MINOR_VERSION</span><span class="o">=</span><span class="m">3</span>.7 <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALLATION_METHOD</span><span class="o">=</span><span class="s2">"apache-airflow"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_VERSION</span><span class="o">=</span><span class="s2">"2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALL_VERSION</span><span class="o">=</span><span class="s2">"==2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_CONSTRAINTS_REFERENCE</span><span class="o">=</span><span class="s2">"constraints-2-0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_FROM</span><span class="o">=</span><span class="s2">"empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_TO</span><span class="o">=</span><span class="s2">"/empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_AIRFLOW_EXTRAS</span><span class="o">=</span><span class="s2">"slack"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_PYTHON_DEPS</span><span class="o">=</span><span class="s2">"apache-airflow-backport-providers-odbc \</span> |
| <span class="s2"> apache-airflow-backport-providers-odbc \</span> |
| <span class="s2"> azure-storage-blob \</span> |
| <span class="s2"> sshtunnel \</span> |
| <span class="s2"> google-api-python-client \</span> |
| <span class="s2"> oauth2client \</span> |
| <span class="s2"> beautifulsoup4 \</span> |
| <span class="s2"> dateparser \</span> |
| <span class="s2"> rocketchat_API \</span> |
| <span class="s2"> typeform"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_DEV_APT_DEPS</span><span class="o">=</span><span class="s2">"msodbcsql17 unixodbc-dev g++"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_DEV_APT_COMMAND</span><span class="o">=</span><span class="s2">"curl https://packages.microsoft.com/keys/microsoft.asc | \</span> |
| <span class="s2"> apt-key add --no-tty - && \</span> |
| <span class="s2"> curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_DEV_ENV_VARS</span><span class="o">=</span><span class="s2">"ACCEPT_EULA=Y"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_RUNTIME_APT_COMMAND</span><span class="o">=</span><span class="s2">"curl https://packages.microsoft.com/keys/microsoft.asc | \</span> |
| <span class="s2"> apt-key add --no-tty - && \</span> |
| <span class="s2"> curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_RUNTIME_APT_DEPS</span><span class="o">=</span><span class="s2">"msodbcsql17 unixodbc git procps vim"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_RUNTIME_ENV_VARS</span><span class="o">=</span><span class="s2">"ACCEPT_EULA=Y"</span> <span class="se">\</span> |
| --tag my-image |
| </pre></div> |
| </div> |
| </div> |
| <div class="section" id="customizing-images-in-high-security-restricted-environments"> |
| <h4>Customizing images in high security restricted environments<a class="headerlink" href="#customizing-images-in-high-security-restricted-environments" title="Permalink to this headline">¶</a></h4> |
| <p>You can also make sure your image is only build using local constraint file and locally downloaded |
| wheel files. This is often useful in Enterprise environments where the binary files are verified and |
| vetted by the security teams.</p> |
| <p>This builds below builds the production image in version 3.7 with packages and constraints used from the local |
| <code class="docutils literal notranslate"><span class="pre">docker-context-files</span></code> rather than installed from PyPI or GitHub. It also disables MySQL client |
| installation as it is using external installation method.</p> |
| <p>Note that as a prerequisite - you need to have downloaded wheel files. In the example below we |
| first download such constraint file locally and then use <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">download</span></code> to get the .whl files needed |
| but in most likely scenario, those wheel files should be copied from an internal repository of such .whl |
| files. Note that <code class="docutils literal notranslate"><span class="pre">AIRFLOW_INSTALL_VERSION</span></code> is only there for reference, the apache airflow .whl file |
| in the right version is part of the .whl files downloaded.</p> |
| <p>Note that ‘pip download’ will only works on Linux host as some of the packages need to be compiled from |
| sources and you cannot install them providing <code class="docutils literal notranslate"><span class="pre">--platform</span></code> switch. They also need to be downloaded using |
| the same python version as the target image.</p> |
| <p>The <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">download</span></code> might happen in a separate environment. The files can be committed to a separate |
| binary repository and vetted/verified by the security team and used subsequently to build images |
| of Airflow when needed on an air-gaped system.</p> |
| <p>Preparing the constraint files and wheel files:</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>rm docker-context-files/*.whl docker-context-files/*.txt |
| |
| curl -Lo <span class="s2">"docker-context-files/constraints-2-0.txt"</span> <span class="se">\</span> |
| https://raw.githubusercontent.com/apache/airflow/constraints-2-0/constraints-3.7.txt |
| |
| pip download --dest docker-context-files <span class="se">\</span> |
| --constraint docker-context-files/constraints-2-0.txt <span class="se">\</span> |
| apache-airflow<span class="o">[</span>async,aws,azure,celery,dask,elasticsearch,gcp,kubernetes,mysql,postgres,redis,slack,ssh,statsd,virtualenv<span class="o">]==</span><span class="m">2</span>.0.0 |
| </pre></div> |
| </div> |
| <p>Since apache-airflow .whl packages are treated differently by the docker image, you need to rename the |
| downloaded apache-airflow* files, for example:</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="nb">pushd</span> docker-context-files |
| <span class="k">for</span> file in apache?airflow* |
| <span class="k">do</span> |
| mv <span class="si">${</span><span class="nv">file</span><span class="si">}</span> _<span class="si">${</span><span class="nv">file</span><span class="si">}</span> |
| <span class="k">done</span> |
| <span class="nb">popd</span> |
| </pre></div> |
| </div> |
| <p>Building the image:</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>./breeze build-image <span class="se">\</span> |
| --production-image --python <span class="m">3</span>.7 --install-airflow-version<span class="o">=</span><span class="m">2</span>.0.0 <span class="se">\</span> |
| --disable-mysql-client-installation --disable-pip-cache --install-from-local-files-when-building <span class="se">\</span> |
| --constraints-location<span class="o">=</span><span class="s2">"/docker-context-files/constraints-2-0.txt"</span> |
| </pre></div> |
| </div> |
| <p>or</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker build . <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_BASE_IMAGE</span><span class="o">=</span><span class="s2">"python:3.7-slim-buster"</span> <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_MAJOR_MINOR_VERSION</span><span class="o">=</span><span class="m">3</span>.7 <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALLATION_METHOD</span><span class="o">=</span><span class="s2">"apache-airflow"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_VERSION</span><span class="o">=</span><span class="s2">"2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALL_VERSION</span><span class="o">=</span><span class="s2">"==2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_CONSTRAINTS_REFERENCE</span><span class="o">=</span><span class="s2">"constraints-2-0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_FROM</span><span class="o">=</span><span class="s2">"empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_TO</span><span class="o">=</span><span class="s2">"/empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">INSTALL_MYSQL_CLIENT</span><span class="o">=</span><span class="s2">"false"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_PRE_CACHED_PIP_PACKAGES</span><span class="o">=</span><span class="s2">"false"</span> <span class="se">\</span> |
| --build-arg <span class="nv">INSTALL_FROM_DOCKER_CONTEXT_FILES</span><span class="o">=</span><span class="s2">"true"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_CONSTRAINTS_LOCATION</span><span class="o">=</span><span class="s2">"/docker-context-files/constraints-2-0.txt"</span> |
| </pre></div> |
| </div> |
| </div> |
| <div class="section" id="customizing-extending-the-image-together"> |
| <h4>Customizing & extending the image together<a class="headerlink" href="#customizing-extending-the-image-together" title="Permalink to this headline">¶</a></h4> |
| <p>You can combine both - customizing & extending the image. You can build the image first using |
| <code class="docutils literal notranslate"><span class="pre">customize</span></code> method (either with docker command or with <code class="docutils literal notranslate"><span class="pre">breeze</span></code> and then you can <code class="docutils literal notranslate"><span class="pre">extend</span></code> |
| the resulting image using <code class="docutils literal notranslate"><span class="pre">FROM</span></code> any dependencies you want.</p> |
| </div> |
| <div class="section" id="customizing-pypi-installation"> |
| <h4>Customizing PYPI installation<a class="headerlink" href="#customizing-pypi-installation" title="Permalink to this headline">¶</a></h4> |
| <p>You can customize PYPI sources used during image build by adding a docker-context-files/.pypirc file |
| This .pypirc will never be committed to the repository and will not be present in the final production image. |
| It is added and used only in the build segment of the image so it is never copied to the final image.</p> |
| </div> |
| </div> |
| <div class="section" id="external-sources-for-dependencies"> |
| <h3>External sources for dependencies<a class="headerlink" href="#external-sources-for-dependencies" title="Permalink to this headline">¶</a></h3> |
| <p>In corporate environments, there is often the need to build your Container images using |
| other than default sources of dependencies. The docker file uses standard sources (such as |
| Debian apt repositories or PyPI repository. However, in corporate environments, the dependencies |
| are often only possible to be installed from internal, vetted repositories that are reviewed and |
| approved by the internal security teams. In those cases, you might need to use those different |
| sources.</p> |
| <p>This is rather easy if you extend the image - you simply write your extension commands |
| using the right sources - either by adding/replacing the sources in apt configuration or |
| specifying the source repository in pip install command.</p> |
| <p>It’s a bit more involved in the case of customizing the image. We do not have yet (but we are working |
| on it) a capability of changing the sources via build args. However, since the builds use |
| Dockerfile that is a source file, you can rather easily simply modify the file manually and |
| specify different sources to be used by either of the commands.</p> |
| </div> |
| <div class="section" id="comparing-extending-and-customizing-the-image"> |
| <h3>Comparing extending and customizing the image<a class="headerlink" href="#comparing-extending-and-customizing-the-image" title="Permalink to this headline">¶</a></h3> |
| <p>Here is the comparison of the two types of building images.</p> |
| <table class="docutils align-default"> |
| <colgroup> |
| <col style="width: 54%" /> |
| <col style="width: 22%" /> |
| <col style="width: 24%" /> |
| </colgroup> |
| <thead> |
| <tr class="row-odd"><th class="head"></th> |
| <th class="head"><p>Extending the image</p></th> |
| <th class="head"><p>Customizing the image</p></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr class="row-even"><td><p>Produces optimized image</p></td> |
| <td><p>No</p></td> |
| <td><p>Yes</p></td> |
| </tr> |
| <tr class="row-odd"><td><p>Use Airflow Dockerfile sources to build the image</p></td> |
| <td><p>No</p></td> |
| <td><p>Yes</p></td> |
| </tr> |
| <tr class="row-even"><td><p>Requires Airflow sources</p></td> |
| <td><p>No</p></td> |
| <td><p>Yes</p></td> |
| </tr> |
| <tr class="row-odd"><td><p>You can build it with Breeze</p></td> |
| <td><p>No</p></td> |
| <td><p>Yes</p></td> |
| </tr> |
| <tr class="row-even"><td><p>Allows to use non-default sources for dependencies</p></td> |
| <td><p>Yes</p></td> |
| <td><p>No [1]</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <p>[1] When you combine customizing and extending the image, you can use external sources |
| in the “extend” part. There are plans to add functionality to add external sources |
| option to image customization. You can also modify Dockerfile manually if you want to |
| use non-default sources for dependencies.</p> |
| </div> |
| <div class="section" id="using-the-production-image"> |
| <h3>Using the production image<a class="headerlink" href="#using-the-production-image" title="Permalink to this headline">¶</a></h3> |
| <p>The PROD image entrypoint works as follows:</p> |
| <ul class="simple"> |
| <li><p>In case the user is not “airflow” (with undefined user id) and the group id of the user is set to 0 (root), |
| then the user is dynamically added to /etc/passwd at entry using USER_NAME variable to define the user name. |
| This is in order to accommodate the |
| <a class="reference external" href="https://docs.openshift.com/enterprise/3.0/creating_images/guidelines.html">OpenShift Guidelines</a></p></li> |
| <li><p>The <code class="docutils literal notranslate"><span class="pre">AIRFLOW_HOME</span></code> is set by default to <code class="docutils literal notranslate"><span class="pre">/opt/airflow/</span></code> - this means that DAGs |
| are in default in the <code class="docutils literal notranslate"><span class="pre">/opt/airflow/dags</span></code> folder and logs are in the <code class="docutils literal notranslate"><span class="pre">/opt/airflow/logs</span></code></p></li> |
| <li><p>The working directory is <code class="docutils literal notranslate"><span class="pre">/opt/airflow</span></code> by default.</p></li> |
| <li><p>If <code class="docutils literal notranslate"><span class="pre">AIRFLOW__CORE__SQL_ALCHEMY_CONN</span></code> variable is passed to the container and it is either mysql or postgres |
| SQL alchemy connection, then the connection is checked and the script waits until the database is reachable. |
| If <code class="docutils literal notranslate"><span class="pre">AIRFLOW__CORE__SQL_ALCHEMY_CONN_CMD</span></code> variable is passed to the container, it is evaluated as a |
| command to execute and result of this evaluation is used as <code class="docutils literal notranslate"><span class="pre">AIRFLOW__CORE__SQL_ALCHEMY_CONN</span></code>. The |
| <code class="docutils literal notranslate"><span class="pre">_CMD</span></code> variable takes precedence over the <code class="docutils literal notranslate"><span class="pre">AIRFLOW__CORE__SQL_ALCHEMY_CONN</span></code> variable.</p></li> |
| <li><p>If no <code class="docutils literal notranslate"><span class="pre">AIRFLOW__CORE__SQL_ALCHEMY_CONN</span></code> variable is set then SQLite database is created in |
| ${AIRFLOW_HOME}/airflow.db and db reset is executed.</p></li> |
| <li><p>If first argument equals to “bash” - you are dropped to a bash shell or you can executes bash command |
| if you specify extra arguments. For example:</p></li> |
| </ul> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker run -it apache/airflow:master-python3.6 bash -c <span class="s2">"ls -la"</span> |
| total <span class="m">16</span> |
| drwxr-xr-x <span class="m">4</span> airflow root <span class="m">4096</span> Jun <span class="m">5</span> <span class="m">18</span>:12 . |
| drwxr-xr-x <span class="m">1</span> root root <span class="m">4096</span> Jun <span class="m">5</span> <span class="m">18</span>:12 .. |
| drwxr-xr-x <span class="m">2</span> airflow root <span class="m">4096</span> Jun <span class="m">5</span> <span class="m">18</span>:12 dags |
| drwxr-xr-x <span class="m">2</span> airflow root <span class="m">4096</span> Jun <span class="m">5</span> <span class="m">18</span>:12 logs |
| </pre></div> |
| </div> |
| <ul class="simple"> |
| <li><p>If first argument is equal to “python” - you are dropped in python shell or python commands are executed if |
| you pass extra parameters. For example:</p></li> |
| </ul> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>> docker run -it apache/airflow:master-python3.6 python -c <span class="s2">"print('test')"</span> |
| <span class="nb">test</span> |
| </pre></div> |
| </div> |
| <ul class="simple"> |
| <li><p>If first argument equals to “airflow” - the rest of the arguments is treated as an airflow command |
| to execute. Example:</p></li> |
| </ul> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker run -it apache/airflow:master-python3.6 airflow webserver |
| </pre></div> |
| </div> |
| <ul class="simple"> |
| <li><p>If there are any other arguments - they are simply passed to the “airflow” command</p></li> |
| </ul> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>> docker run -it apache/airflow:master-python3.6 version |
| <span class="m">2</span>.0.0.dev0 |
| </pre></div> |
| </div> |
| <ul class="simple"> |
| <li><p>If <code class="docutils literal notranslate"><span class="pre">AIRFLOW__CELERY__BROKER_URL</span></code> variable is passed and airflow command with |
| scheduler, worker of flower command is used, then the script checks the broker connection |
| and waits until the Celery broker database is reachable. |
| If <code class="docutils literal notranslate"><span class="pre">AIRFLOW__CELERY__BROKER_URL_CMD</span></code> variable is passed to the container, it is evaluated as a |
| command to execute and result of this evaluation is used as <code class="docutils literal notranslate"><span class="pre">AIRFLOW__CELERY__BROKER_URL</span></code>. The |
| <code class="docutils literal notranslate"><span class="pre">_CMD</span></code> variable takes precedence over the <code class="docutils literal notranslate"><span class="pre">AIRFLOW__CELERY__BROKER_URL</span></code> variable.</p></li> |
| </ul> |
| </div> |
| <div class="section" id="id1"> |
| <h3>Production image build arguments<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3> |
| <p>The following build arguments (<code class="docutils literal notranslate"><span class="pre">--build-arg</span></code> in docker build command) can be used for production images:</p> |
| <table class="docutils align-default"> |
| <colgroup> |
| <col style="width: 33%" /> |
| <col style="width: 33%" /> |
| <col style="width: 33%" /> |
| </colgroup> |
| <thead> |
| <tr class="row-odd"><th class="head"><p>Build argument</p></th> |
| <th class="head"><p>Default value</p></th> |
| <th class="head"><p>Description</p></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">PYTHON_BASE_IMAGE</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">python:3.6-slim-buster</span></code></p></td> |
| <td><p>Base python image.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">PYTHON_MAJOR_MINOR_VERSION</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">3.6</span></code></p></td> |
| <td><p>major/minor version of Python (should |
| match base image).</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_VERSION</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">2.0.0.dev0</span></code></p></td> |
| <td><p>version of Airflow.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_REPO</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">apache/airflow</span></code></p></td> |
| <td><p>the repository from which PIP |
| dependencies are pre-installed.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_BRANCH</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">master</span></code></p></td> |
| <td><p>the branch from which PIP dependencies |
| are pre-installed initially.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_CONSTRAINTS_LOCATION</span></code></p></td> |
| <td></td> |
| <td><p>If not empty, it will override the |
| source of the constraints with the |
| specified URL or file. Note that the |
| file has to be in docker context so |
| it’s best to place such file in |
| one of the folders included in |
| .dockerignore.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_CONSTRAINTS_REFERENCE</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">constraints-master</span></code></p></td> |
| <td><p>Reference (branch or tag) from GitHub |
| where constraints file is taken from |
| It can be <code class="docutils literal notranslate"><span class="pre">constraints-master</span></code> but |
| also can be <code class="docutils literal notranslate"><span class="pre">constraints-1-10</span></code> for |
| 1.10.* installation. In case of building |
| specific version you want to point it |
| to specific tag, for example |
| <code class="docutils literal notranslate"><span class="pre">constraints-1.10.14</span></code>.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">INSTALL_PROVIDERS_FROM_SOURCES</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td> |
| <td><p>If set to <code class="docutils literal notranslate"><span class="pre">true</span></code> and image is built |
| from sources, all provider packages are |
| installed from sources rather than from |
| packages. It has no effect when |
| installing from PyPI or GitHub repo.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_EXTRAS</span></code></p></td> |
| <td><p>(see Dockerfile)</p></td> |
| <td><p>Default extras with which airflow is |
| installed.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">INSTALL_FROM_PYPI</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">true</span></code></p></td> |
| <td><p>If set to true, Airflow is installed |
| from PyPI. if you want to install |
| Airflow from self-build package |
| you can set it to false, put package in |
| <code class="docutils literal notranslate"><span class="pre">docker-context-files</span></code> and set |
| <code class="docutils literal notranslate"><span class="pre">INSTALL_FROM_DOCKER_CONTEXT_FILES</span></code> to |
| <code class="docutils literal notranslate"><span class="pre">true</span></code>. For this you have to also keep |
| <code class="docutils literal notranslate"><span class="pre">AIRFLOW_PRE_CACHED_PIP_PACKAGES</span></code> flag |
| set to <code class="docutils literal notranslate"><span class="pre">false</span></code>.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_PRE_CACHED_PIP_PACKAGES</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td> |
| <td><p>Allows to pre-cache airflow PIP packages |
| from the GitHub of Apache Airflow |
| This allows to optimize iterations for |
| Image builds and speeds up CI builds.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">INSTALL_FROM_DOCKER_CONTEXT_FILES</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td> |
| <td><p>If set to true, Airflow, providers and |
| all dependencies are installed from |
| from locally built/downloaded |
| .whl and .tar.gz files placed in the |
| <code class="docutils literal notranslate"><span class="pre">docker-context-files</span></code>. In certain |
| corporate environments, this is required |
| to install airflow from such pre-vetted |
| packages rather than from PyPI. For this |
| to work, also set <code class="docutils literal notranslate"><span class="pre">INSTALL_FROM_PYPI</span></code>. |
| Note that packages starting with |
| <code class="docutils literal notranslate"><span class="pre">apache?airflow</span></code> glob are treated |
| differently than other packages. All |
| <code class="docutils literal notranslate"><span class="pre">apache?airflow</span></code> packages are |
| installed with dependencies limited by |
| airflow constraints. All other packages |
| are installed without dependencies |
| ‘as-is’. If you wish to install airflow |
| via ‘pip download’ with all dependencies |
| downloaded, you have to rename the |
| apache airflow and provider packages to |
| not start with <code class="docutils literal notranslate"><span class="pre">apache?airflow</span></code> glob.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">UPGRADE_TO_NEWER_DEPENDENCIES</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td> |
| <td><p>If set to true, the dependencies are |
| upgraded to newer versions matching |
| setup.py before installation.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">CONTINUE_ON_PIP_CHECK_FAILURE</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td> |
| <td><p>By default the image build fails if pip |
| check fails for it. This is good for |
| interactive building but on CI the |
| image should be built regardless - we |
| have a separate step to verify image.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_AIRFLOW_EXTRAS</span></code></p></td> |
| <td></td> |
| <td><p>Optional additional extras with which |
| airflow is installed.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_PYTHON_DEPS</span></code></p></td> |
| <td></td> |
| <td><p>Optional python packages to extend |
| the image with some extra dependencies.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">DEV_APT_COMMAND</span></code></p></td> |
| <td><p>(see Dockerfile)</p></td> |
| <td><p>Dev apt command executed before dev deps |
| are installed in the Build image.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_DEV_APT_COMMAND</span></code></p></td> |
| <td></td> |
| <td><p>Additional Dev apt command executed |
| before dev dep are installed |
| in the Build image. Should start with |
| <code class="docutils literal notranslate"><span class="pre">&&</span></code>.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">DEV_APT_DEPS</span></code></p></td> |
| <td><p>(see Dockerfile)</p></td> |
| <td><p>Dev APT dependencies installed |
| in the Build image.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_DEV_APT_DEPS</span></code></p></td> |
| <td></td> |
| <td><p>Additional apt dev dependencies |
| installed in the Build image.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_DEV_APT_ENV</span></code></p></td> |
| <td></td> |
| <td><p>Additional env variables defined |
| when installing dev deps.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">RUNTIME_APT_COMMAND</span></code></p></td> |
| <td><p>(see Dockerfile)</p></td> |
| <td><p>Runtime apt command executed before deps |
| are installed in the Main image.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_RUNTIME_APT_COMMAND</span></code></p></td> |
| <td></td> |
| <td><p>Additional Runtime apt command executed |
| before runtime dep are installed |
| in the Main image. Should start with |
| <code class="docutils literal notranslate"><span class="pre">&&</span></code>.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">RUNTIME_APT_DEPS</span></code></p></td> |
| <td><p>(see Dockerfile)</p></td> |
| <td><p>Runtime APT dependencies installed |
| in the Main image.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_RUNTIME_APT_DEPS</span></code></p></td> |
| <td></td> |
| <td><p>Additional apt runtime dependencies |
| installed in the Main image.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">ADDITIONAL_RUNTIME_APT_ENV</span></code></p></td> |
| <td></td> |
| <td><p>Additional env variables defined |
| when installing runtime deps.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_HOME</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">/opt/airflow</span></code></p></td> |
| <td><p>Airflow’s HOME (that’s where logs and |
| SQLite databases are stored).</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_UID</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">50000</span></code></p></td> |
| <td><p>Airflow user UID.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_GID</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">50000</span></code></p></td> |
| <td><p>Airflow group GID. Note that most files |
| created on behalf of airflow user belong |
| to the <code class="docutils literal notranslate"><span class="pre">root</span></code> group (0) to keep |
| OpenShift Guidelines compatibility.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_USER_HOME_DIR</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">/home/airflow</span></code></p></td> |
| <td><p>Home directory of the Airflow user.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">CASS_DRIVER_BUILD_CONCURRENCY</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">8</span></code></p></td> |
| <td><p>Number of processors to use for |
| cassandra PIP install (speeds up |
| installing in case cassandra extra is |
| used).</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">INSTALL_MYSQL_CLIENT</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">true</span></code></p></td> |
| <td><p>Whether MySQL client should be installed |
| The mysql extra is removed from extras |
| if the client is not installed.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <p>There are build arguments that determine the installation mechanism of Apache Airflow for the |
| production image. There are three types of build:</p> |
| <ul class="simple"> |
| <li><p>From local sources (by default for example when you use <code class="docutils literal notranslate"><span class="pre">docker</span> <span class="pre">build</span> <span class="pre">.</span></code>)</p></li> |
| <li><p>You can build the image from released PyPI airflow package (used to build the official Docker image)</p></li> |
| <li><p>You can build the image from any version in GitHub repository(this is used mostly for system testing).</p></li> |
| </ul> |
| <table class="docutils align-default"> |
| <colgroup> |
| <col style="width: 25%" /> |
| <col style="width: 17%" /> |
| <col style="width: 58%" /> |
| </colgroup> |
| <thead> |
| <tr class="row-odd"><th class="head"><p>Build argument</p></th> |
| <th class="head"><p>Default</p></th> |
| <th class="head"><p>What to specify</p></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_INSTALLATION_METHOD</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">apache-airflow</span></code></p></td> |
| <td><p>Should point to the installation method of Apache Airflow. It can be |
| <code class="docutils literal notranslate"><span class="pre">apache-airflow</span></code> for installation from packages and URL to installation from |
| GitHub repository tag or branch or “.” to install from sources. |
| Note that installing from local sources requires appropriate values of the |
| <code class="docutils literal notranslate"><span class="pre">AIRFLOW_SOURCES_FROM</span></code> and <code class="docutils literal notranslate"><span class="pre">AIRFLOW_SOURCES_TO</span></code> variables as described below. |
| Only used when <code class="docutils literal notranslate"><span class="pre">INSTALL_FROM_PYPI</span></code> is set to <code class="docutils literal notranslate"><span class="pre">true</span></code>.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_INSTALL_VERSION</span></code></p></td> |
| <td></td> |
| <td><p>Optional - might be used for package installation of different Airflow version |
| for example”==2.0.0”. For consistency, you should also set``AIRFLOW_VERSION`` |
| to the same value AIRFLOW_VERSION is embedded as label in the image created.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_CONSTRAINTS_REFERENCE</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">constraints-master</span></code></p></td> |
| <td><p>Reference (branch or tag) from GitHub where constraints file is taken from. |
| It can be <code class="docutils literal notranslate"><span class="pre">constraints-master</span></code> but also can be``constraints-1-10`` for |
| 1.10.* installations. In case of building specific version |
| you want to point it to specific tag, for example <code class="docutils literal notranslate"><span class="pre">constraints-2.0.0</span></code></p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_WWW</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">www</span></code></p></td> |
| <td><p>In case of Airflow 2.0 it should be “www”, in case of Airflow 1.10 |
| series it should be “www_rbac”.</p></td> |
| </tr> |
| <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_SOURCES_FROM</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">empty</span></code></p></td> |
| <td><p>Sources of Airflow. Set it to “.” when you install airflow from |
| local sources.</p></td> |
| </tr> |
| <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">AIRFLOW_SOURCES_TO</span></code></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">/empty</span></code></p></td> |
| <td><p>Target for Airflow sources. Set to “/opt/airflow” when |
| you want to install airflow from local sources.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <p>This builds production image in version 3.6 with default extras from the local sources (master version |
| of 2.0 currently):</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker build . |
| </pre></div> |
| </div> |
| <p>This builds the production image in version 3.7 with default extras from 2.0.0 tag and |
| constraints taken from constraints-2-0 branch in GitHub.</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker build . <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_BASE_IMAGE</span><span class="o">=</span><span class="s2">"python:3.7-slim-buster"</span> <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_MAJOR_MINOR_VERSION</span><span class="o">=</span><span class="m">3</span>.7 <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALLATION_METHOD</span><span class="o">=</span><span class="s2">"https://github.com/apache/airflow/archive/2.0.0.tar.gz#egg=apache-airflow"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_CONSTRAINTS_REFERENCE</span><span class="o">=</span><span class="s2">"constraints-2-0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_BRANCH</span><span class="o">=</span><span class="s2">"v1-10-test"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_FROM</span><span class="o">=</span><span class="s2">"empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_TO</span><span class="o">=</span><span class="s2">"/empty"</span> |
| </pre></div> |
| </div> |
| <p>This builds the production image in version 3.7 with default extras from 2.0.0 PyPI package and |
| constraints taken from 2.0.0 tag in GitHub and pre-installed pip dependencies from the top |
| of v1-10-test branch.</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker build . <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_BASE_IMAGE</span><span class="o">=</span><span class="s2">"python:3.7-slim-buster"</span> <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_MAJOR_MINOR_VERSION</span><span class="o">=</span><span class="m">3</span>.7 <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALLATION_METHOD</span><span class="o">=</span><span class="s2">"apache-airflow"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_VERSION</span><span class="o">=</span><span class="s2">"2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALL_VERSION</span><span class="o">=</span><span class="s2">"==2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_BRANCH</span><span class="o">=</span><span class="s2">"v1-10-test"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_CONSTRAINTS_REFERENCE</span><span class="o">=</span><span class="s2">"constraints-2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_FROM</span><span class="o">=</span><span class="s2">"empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_TO</span><span class="o">=</span><span class="s2">"/empty"</span> |
| </pre></div> |
| </div> |
| <p>This builds the production image in version 3.7 with additional airflow extras from 2.0.0 PyPI package and |
| additional python dependencies and pre-installed pip dependencies from 2.0.0 tagged constraints.</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker build . <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_BASE_IMAGE</span><span class="o">=</span><span class="s2">"python:3.7-slim-buster"</span> <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_MAJOR_MINOR_VERSION</span><span class="o">=</span><span class="m">3</span>.7 <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALLATION_METHOD</span><span class="o">=</span><span class="s2">"apache-airflow"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_VERSION</span><span class="o">=</span><span class="s2">"2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALL_VERSION</span><span class="o">=</span><span class="s2">"==2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_BRANCH</span><span class="o">=</span><span class="s2">"v1-10-test"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_CONSTRAINTS_REFERENCE</span><span class="o">=</span><span class="s2">"constraints-2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_FROM</span><span class="o">=</span><span class="s2">"empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_TO</span><span class="o">=</span><span class="s2">"/empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_AIRFLOW_EXTRAS</span><span class="o">=</span><span class="s2">"mssql,hdfs"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_PYTHON_DEPS</span><span class="o">=</span><span class="s2">"sshtunnel oauth2client"</span> |
| </pre></div> |
| </div> |
| <p>This builds the production image in version 3.7 with additional airflow extras from 2.0.0 PyPI package and |
| additional apt dev and runtime dependencies.</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker build . <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_BASE_IMAGE</span><span class="o">=</span><span class="s2">"python:3.7-slim-buster"</span> <span class="se">\</span> |
| --build-arg <span class="nv">PYTHON_MAJOR_MINOR_VERSION</span><span class="o">=</span><span class="m">3</span>.7 <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALLATION_METHOD</span><span class="o">=</span><span class="s2">"apache-airflow"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_VERSION</span><span class="o">=</span><span class="s2">"2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_INSTALL_VERSION</span><span class="o">=</span><span class="s2">"==2.0.0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_CONSTRAINTS_REFERENCE</span><span class="o">=</span><span class="s2">"constraints-2-0"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_FROM</span><span class="o">=</span><span class="s2">"empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">AIRFLOW_SOURCES_TO</span><span class="o">=</span><span class="s2">"/empty"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_AIRFLOW_EXTRAS</span><span class="o">=</span><span class="s2">"jdbc"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_DEV_APT_DEPS</span><span class="o">=</span><span class="s2">"gcc g++"</span> <span class="se">\</span> |
| --build-arg <span class="nv">ADDITIONAL_RUNTIME_APT_DEPS</span><span class="o">=</span><span class="s2">"default-jre-headless"</span> |
| </pre></div> |
| </div> |
| </div> |
| <div class="section" id="actions-executed-at-image-start"> |
| <h3>Actions executed at image start<a class="headerlink" href="#actions-executed-at-image-start" title="Permalink to this headline">¶</a></h3> |
| <p>If you are using the default entrypoint of the production image, |
| there are a few actions that are automatically performed when the container starts. |
| In some cases, you can pass environment variables to the image to trigger some of that behaviour.</p> |
| <p>The variables that control the “execution” behaviour start with <code class="docutils literal notranslate"><span class="pre">_AIRFLOW</span></code> to distinguish them |
| from the variables used to build the image starting with <code class="docutils literal notranslate"><span class="pre">AIRFLOW</span></code>.</p> |
| <div class="section" id="creating-system-user"> |
| <h4>Creating system user<a class="headerlink" href="#creating-system-user" title="Permalink to this headline">¶</a></h4> |
| <p>Airflow image is Open-Shift compatible, which means that you can start it with random user ID and group id 0. |
| Airflow will automatically create such a user and make it’s home directory point to <code class="docutils literal notranslate"><span class="pre">/home/airflow</span></code>. |
| You can read more about it in the “Support arbitrary user ids” chapter in the |
| <a class="reference external" href="https://docs.openshift.com/container-platform/4.1/openshift_images/create-images.html#images-create-guide-openshift_create-images">Openshift best practices</a>.</p> |
| </div> |
| <div class="section" id="waits-for-airflow-db-connection"> |
| <h4>Waits for Airflow DB connection<a class="headerlink" href="#waits-for-airflow-db-connection" title="Permalink to this headline">¶</a></h4> |
| <p>In case Postgres or MySQL DB is used, the entrypoint will wait until the airflow DB connection becomes |
| available. This happens always when you use the default entrypoint.</p> |
| <p>The script detects backend type depending on the URL schema and assigns default port numbers if not specified |
| in the URL. Then it loops until the connection to the host/port specified can be established |
| It tries <code class="docutils literal notranslate"><span class="pre">CONNECTION_CHECK_MAX_COUNT</span></code> times and sleeps <code class="docutils literal notranslate"><span class="pre">CONNECTION_CHECK_SLEEP_TIME</span></code> between checks</p> |
| <p>Supported schemes:</p> |
| <ul class="simple"> |
| <li><p><code class="docutils literal notranslate"><span class="pre">postgres://</span></code> - default port 5432</p></li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">mysql://</span></code> - default port 3306</p></li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">sqlite://</span></code></p></li> |
| </ul> |
| <p>In case of SQLite backend, there is no connection to establish and waiting is skipped.</p> |
| </div> |
| <div class="section" id="upgrading-airflow-db"> |
| <h4>Upgrading Airflow DB<a class="headerlink" href="#upgrading-airflow-db" title="Permalink to this headline">¶</a></h4> |
| <p>If you set <code class="docutils literal notranslate"><span class="pre">_AIRFLOW_DB_UPGRADE</span></code> variable to a non-empty value, the entrypoint will run |
| the <code class="docutils literal notranslate"><span class="pre">airflow</span> <span class="pre">db</span> <span class="pre">upgrade</span></code> command right after verifying the connection. You can also use this |
| when you are running airflow with internal SQLite database (default) to upgrade the db and create |
| admin users at entrypoint, so that you can start the webserver immediately. Note - using SQLite is |
| intended only for testing purpose, never use SQLite in production as it has severe limitations when it |
| comes to concurrency.</p> |
| </div> |
| <div class="section" id="creating-admin-user"> |
| <h4>Creating admin user<a class="headerlink" href="#creating-admin-user" title="Permalink to this headline">¶</a></h4> |
| <p>The entrypoint can also create webserver user automatically when you enter it. you need to set |
| <code class="docutils literal notranslate"><span class="pre">_AIRFLOW_WWW_USER_CREATE</span></code> to a non-empty value in order to do that. This is not intended for |
| production, it is only useful if you would like to run a quick test with the production image. |
| You need to pass at least password to create such user via <code class="docutils literal notranslate"><span class="pre">_AIRFLOW_WWW_USER_PASSWORD_CMD</span></code> or |
| <code class="docutils literal notranslate"><span class="pre">_AIRFLOW_WWW_USER_PASSWORD_CMD</span></code> similarly like for other <code class="docutils literal notranslate"><span class="pre">*_CMD</span></code> variables, the content of |
| the <code class="docutils literal notranslate"><span class="pre">*_CMD</span></code> will be evaluated as shell command and it’s output will be set ass password.</p> |
| <p>User creation will fail if none of the <code class="docutils literal notranslate"><span class="pre">PASSWORD</span></code> variables are set - there is no default for |
| password for security reasons.</p> |
| <table class="docutils align-default"> |
| <colgroup> |
| <col style="width: 10%" /> |
| <col style="width: 24%" /> |
| <col style="width: 65%" /> |
| </colgroup> |
| <thead> |
| <tr class="row-odd"><th class="head"><p>Parameter</p></th> |
| <th class="head"><p>Default</p></th> |
| <th class="head"><p>Environment variable</p></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr class="row-even"><td><p>username</p></td> |
| <td><p>admin</p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">_AIRFLOW_WWW_USER_USERNAME</span></code></p></td> |
| </tr> |
| <tr class="row-odd"><td><p>password</p></td> |
| <td></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">_AIRFLOW_WWW_USER_PASSWORD_CMD</span></code> or <code class="docutils literal notranslate"><span class="pre">_AIRFLOW_WWW_USER_PASSWORD</span></code></p></td> |
| </tr> |
| <tr class="row-even"><td><p>firstname</p></td> |
| <td><p>Airflow</p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">_AIRFLOW_WWW_USER_FIRSTNAME</span></code></p></td> |
| </tr> |
| <tr class="row-odd"><td><p>lastname</p></td> |
| <td><p>Admin</p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">_AIRFLOW_WWW_USER_LASTNAME</span></code></p></td> |
| </tr> |
| <tr class="row-even"><td><p>email</p></td> |
| <td><p><a class="reference external" href="mailto:airflowadmin%40example.com">airflowadmin<span>@</span>example<span>.</span>com</a></p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">_AIRFLOW_WWW_USER_EMAIL</span></code></p></td> |
| </tr> |
| <tr class="row-odd"><td><p>role</p></td> |
| <td><p>Admin</p></td> |
| <td><p><code class="docutils literal notranslate"><span class="pre">_AIRFLOW_WWW_USER_ROLE</span></code></p></td> |
| </tr> |
| </tbody> |
| </table> |
| <p>In case the password is specified, the user will be attempted to be created, but the entrypoint will |
| not fail if the attempt fails (this accounts for the case that the user is already created).</p> |
| <p>You can, for example start the webserver in the production image with initializing the internal SQLite |
| database and creating an <code class="docutils literal notranslate"><span class="pre">admin/admin</span></code> Admin user with the following command:</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker run -it -p <span class="m">8080</span>:8080 <span class="se">\</span> |
| --env <span class="s2">"_AIRFLOW_DB_UPGRADE=true"</span> <span class="se">\</span> |
| --env <span class="s2">"_AIRFLOW_WWW_USER_CREATE=true"</span> <span class="se">\</span> |
| --env <span class="s2">"_AIRFLOW_WWW_USER_PASSWORD=admin"</span> <span class="se">\</span> |
| apache/airflow:master-python3.8 webserver |
| </pre></div> |
| </div> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker run -it -p <span class="m">8080</span>:8080 <span class="se">\</span> |
| --env <span class="s2">"_AIRFLOW_DB_UPGRADE=true"</span> <span class="se">\</span> |
| --env <span class="s2">"_AIRFLOW_WWW_USER_CREATE=true"</span> <span class="se">\</span> |
| --env <span class="s2">"_AIRFLOW_WWW_USER_PASSWORD_CMD=echo admin"</span> <span class="se">\</span> |
| apache/airflow:master-python3.8 webserver |
| </pre></div> |
| </div> |
| <p>The commands above perform initialization of the SQLite database, create admin user with admin password |
| and Admin role. They also forward local port <code class="docutils literal notranslate"><span class="pre">8080</span></code> to the webserver port and finally start the webserver.</p> |
| </div> |
| <div class="section" id="waits-for-celery-broker-connection"> |
| <h4>Waits for celery broker connection<a class="headerlink" href="#waits-for-celery-broker-connection" title="Permalink to this headline">¶</a></h4> |
| <p>In case Postgres or MySQL DB is used, and one of the <code class="docutils literal notranslate"><span class="pre">scheduler</span></code>, <code class="docutils literal notranslate"><span class="pre">celery</span></code>, <code class="docutils literal notranslate"><span class="pre">worker</span></code>, or <code class="docutils literal notranslate"><span class="pre">flower</span></code> |
| commands are used the entrypoint will wait until the celery broker DB connection is available.</p> |
| <p>The script detects backend type depending on the URL schema and assigns default port numbers if not specified |
| in the URL. Then it loops until connection to the host/port specified can be established |
| It tries <code class="docutils literal notranslate"><span class="pre">CONNECTION_CHECK_MAX_COUNT</span></code> times and sleeps <code class="docutils literal notranslate"><span class="pre">CONNECTION_CHECK_SLEEP_TIME</span></code> between checks</p> |
| <p>Supported schemes:</p> |
| <ul class="simple"> |
| <li><p><code class="docutils literal notranslate"><span class="pre">amqp(s)://</span></code> (rabbitmq) - default port 5672</p></li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">redis://</span></code> - default port 6379</p></li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">postgres://</span></code> - default port 5432</p></li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">mysql://</span></code> - default port 3306</p></li> |
| <li><p><code class="docutils literal notranslate"><span class="pre">sqlite://</span></code></p></li> |
| </ul> |
| <p>In case of SQLite backend, there is no connection to establish and waiting is skipped.</p> |
| </div> |
| </div> |
| <div class="section" id="recipes"> |
| <h3>Recipes<a class="headerlink" href="#recipes" title="Permalink to this headline">¶</a></h3> |
| <p>Users sometimes share interesting ways of using the Docker images. We encourage users to contribute these |
| recipes to the documentation in case they prove useful to other members of the community by |
| submitting a pull request. The sections below capture this knowledge.</p> |
| <div class="section" id="google-cloud-sdk-installation"> |
| <h4>Google Cloud SDK installation<a class="headerlink" href="#google-cloud-sdk-installation" title="Permalink to this headline">¶</a></h4> |
| <p>Some operators, such as <a class="reference external" href="/docs/apache-airflow-providers-google/stable/_api/airflow/providers/google/cloud/operators/kubernetes_engine/index.html#airflow.providers.google.cloud.operators.kubernetes_engine.GKEStartPodOperator" title="(in apache-airflow-providers-google vmaster)"><code class="xref py py-class docutils literal notranslate"><span class="pre">airflow.providers.google.cloud.operators.kubernetes_engine.GKEStartPodOperator</span></code></a>, |
| <a class="reference external" href="/docs/apache-airflow-providers-google/stable/_api/airflow/providers/google/cloud/operators/dataflow/index.html#airflow.providers.google.cloud.operators.dataflow.DataflowStartSqlJobOperator" title="(in apache-airflow-providers-google vmaster)"><code class="xref py py-class docutils literal notranslate"><span class="pre">airflow.providers.google.cloud.operators.dataflow.DataflowStartSqlJobOperator</span></code></a>, require |
| the installation of <a class="reference external" href="https://cloud.google.com/sdk">Google Cloud SDK</a> (includes <code class="docutils literal notranslate"><span class="pre">gcloud</span></code>). |
| You can also run these commands with BashOperator.</p> |
| <p>Create a new Dockerfile like the one shown below.</p> |
| <div class="example-block-wrapper docutils container"> |
| <p class="example-header"><span class="example-title">docs/apache-airflow/docker-images-recipes/gcloud.Dockerfile</span></p> |
| <div class="highlight-dockerfile notranslate"><div class="highlight"><pre><span></span><span class="c"># Licensed to the Apache Software Foundation (ASF) under one or more</span> |
| <span class="c"># contributor license agreements. See the NOTICE file distributed with</span> |
| <span class="c"># this work for additional information regarding copyright ownership.</span> |
| <span class="c"># The ASF licenses this file to You under the Apache License, Version 2.0</span> |
| <span class="c"># (the "License"); you may not use this file except in compliance with</span> |
| <span class="c"># the License. You may obtain a copy of the License at</span> |
| <span class="c">#</span> |
| <span class="c"># http://www.apache.org/licenses/LICENSE-2.0</span> |
| <span class="c">#</span> |
| <span class="c"># Unless required by applicable law or agreed to in writing, software</span> |
| <span class="c"># distributed under the License is distributed on an "AS IS" BASIS,</span> |
| <span class="c"># WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span> |
| <span class="c"># See the License for the specific language governing permissions and</span> |
| <span class="c"># limitations under the License.</span> |
| <span class="k">ARG</span> BASE_AIRFLOW_IMAGE |
| <span class="k">FROM</span> <span class="s">${BASE_AIRFLOW_IMAGE}</span> |
| |
| <span class="k">SHELL</span> <span class="p">[</span><span class="s2">"/bin/bash"</span><span class="p">,</span> <span class="s2">"-o"</span><span class="p">,</span> <span class="s2">"pipefail"</span><span class="p">,</span> <span class="s2">"-e"</span><span class="p">,</span> <span class="s2">"-u"</span><span class="p">,</span> <span class="s2">"-x"</span><span class="p">,</span> <span class="s2">"-c"</span><span class="p">]</span> |
| |
| <span class="k">USER</span><span class="s"> 0</span> |
| |
| <span class="k">ARG</span> <span class="nv">CLOUD_SDK_VERSION</span><span class="o">=</span><span class="m">322</span>.0.0 |
| <span class="k">ENV</span> <span class="nv">GCLOUD_HOME</span><span class="o">=</span>/opt/google-cloud-sdk |
| |
| <span class="k">ENV</span> <span class="nv">PATH</span><span class="o">=</span><span class="s2">"</span><span class="si">${</span><span class="nv">GCLOUD_HOME</span><span class="si">}</span><span class="s2">/bin/:</span><span class="si">${</span><span class="nv">PATH</span><span class="si">}</span><span class="s2">"</span> |
| |
| <span class="k">RUN</span> <span class="nv">DOWNLOAD_URL</span><span class="o">=</span><span class="s2">"https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-</span><span class="si">${</span><span class="nv">CLOUD_SDK_VERSION</span><span class="si">}</span><span class="s2">-linux-x86_64.tar.gz"</span> <span class="se">\</span> |
| <span class="o">&&</span> <span class="nv">TMP_DIR</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>mktemp -d<span class="k">)</span><span class="s2">"</span> <span class="se">\</span> |
| <span class="o">&&</span> curl -fL <span class="s2">"</span><span class="si">${</span><span class="nv">DOWNLOAD_URL</span><span class="si">}</span><span class="s2">"</span> --output <span class="s2">"</span><span class="si">${</span><span class="nv">TMP_DIR</span><span class="si">}</span><span class="s2">/google-cloud-sdk.tar.gz"</span> <span class="se">\</span> |
| <span class="o">&&</span> mkdir -p <span class="s2">"</span><span class="si">${</span><span class="nv">GCLOUD_HOME</span><span class="si">}</span><span class="s2">"</span> <span class="se">\</span> |
| <span class="o">&&</span> tar xzf <span class="s2">"</span><span class="si">${</span><span class="nv">TMP_DIR</span><span class="si">}</span><span class="s2">/google-cloud-sdk.tar.gz"</span> -C <span class="s2">"</span><span class="si">${</span><span class="nv">GCLOUD_HOME</span><span class="si">}</span><span class="s2">"</span> --strip-components<span class="o">=</span><span class="m">1</span> <span class="se">\</span> |
| <span class="o">&&</span> <span class="s2">"</span><span class="si">${</span><span class="nv">GCLOUD_HOME</span><span class="si">}</span><span class="s2">/install.sh"</span> <span class="se">\</span> |
| --bash-completion<span class="o">=</span><span class="nb">false</span> <span class="se">\</span> |
| --path-update<span class="o">=</span><span class="nb">false</span> <span class="se">\</span> |
| --usage-reporting<span class="o">=</span><span class="nb">false</span> <span class="se">\</span> |
| --additional-components alpha beta kubectl <span class="se">\</span> |
| --quiet <span class="se">\</span> |
| <span class="o">&&</span> rm -rf <span class="s2">"</span><span class="si">${</span><span class="nv">TMP_DIR</span><span class="si">}</span><span class="s2">"</span> <span class="se">\</span> |
| <span class="o">&&</span> gcloud --version |
| |
| <span class="k">USER</span><span class="s"> ${AIRFLOW_UID}</span> |
| </pre></div> |
| </div> |
| </div> |
| <p>Then build a new image.</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker build . <span class="se">\</span> |
| --build-arg <span class="nv">BASE_AIRFLOW_IMAGE</span><span class="o">=</span><span class="s2">"apache/airflow:2.0.0"</span> <span class="se">\</span> |
| -t my-airflow-image |
| </pre></div> |
| </div> |
| </div> |
| <div class="section" id="apache-hadoop-stack-installation"> |
| <h4>Apache Hadoop Stack installation<a class="headerlink" href="#apache-hadoop-stack-installation" title="Permalink to this headline">¶</a></h4> |
| <p>Airflow is often used to run tasks on Hadoop cluster. It required Java Runtime Environment (JRE) to run. |
| Below are the steps to take tools that are frequently used in Hadoop-world:</p> |
| <ul class="simple"> |
| <li><p>Java Runtime Environment (JRE)</p></li> |
| <li><p>Apache Hadoop</p></li> |
| <li><p>Apache Hive</p></li> |
| <li><p><a class="reference external" href="https://cloud.google.com/dataproc/docs/concepts/connectors/cloud-storage">Cloud Storage connector for Apache Hadoop</a></p></li> |
| </ul> |
| <p>Create a new Dockerfile like the one shown below.</p> |
| <div class="example-block-wrapper docutils container"> |
| <p class="example-header"><span class="example-title">docs/apache-airflow/docker-images-recipes/hadoop.Dockerfile</span></p> |
| <div class="highlight-dockerfile notranslate"><div class="highlight"><pre><span></span><span class="c"># Licensed to the Apache Software Foundation (ASF) under one or more</span> |
| <span class="c"># contributor license agreements. See the NOTICE file distributed with</span> |
| <span class="c"># this work for additional information regarding copyright ownership.</span> |
| <span class="c"># The ASF licenses this file to You under the Apache License, Version 2.0</span> |
| <span class="c"># (the "License"); you may not use this file except in compliance with</span> |
| <span class="c"># the License. You may obtain a copy of the License at</span> |
| <span class="c">#</span> |
| <span class="c"># http://www.apache.org/licenses/LICENSE-2.0</span> |
| <span class="c">#</span> |
| <span class="c"># Unless required by applicable law or agreed to in writing, software</span> |
| <span class="c"># distributed under the License is distributed on an "AS IS" BASIS,</span> |
| <span class="c"># WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span> |
| <span class="c"># See the License for the specific language governing permissions and</span> |
| <span class="c"># limitations under the License.</span> |
| <span class="k">ARG</span> BASE_AIRFLOW_IMAGE |
| |
| <span class="k">FROM</span> <span class="s">${BASE_AIRFLOW_IMAGE}</span> |
| |
| <span class="k">SHELL</span> <span class="p">[</span><span class="s2">"/bin/bash"</span><span class="p">,</span> <span class="s2">"-o"</span><span class="p">,</span> <span class="s2">"pipefail"</span><span class="p">,</span> <span class="s2">"-e"</span><span class="p">,</span> <span class="s2">"-u"</span><span class="p">,</span> <span class="s2">"-x"</span><span class="p">,</span> <span class="s2">"-c"</span><span class="p">]</span> |
| |
| <span class="k">USER</span><span class="s"> 0</span> |
| |
| <span class="c"># Install Java</span> |
| <span class="k">RUN</span> mkdir -pv /usr/share/man/man1 <span class="se">\</span> |
| <span class="o">&&</span> mkdir -pv /usr/share/man/man7 <span class="se">\</span> |
| <span class="o">&&</span> curl -fsSL https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public <span class="p">|</span> apt-key add - <span class="se">\</span> |
| <span class="o">&&</span> <span class="nb">echo</span> <span class="s1">'deb https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ buster main'</span> > <span class="se">\</span> |
| /etc/apt/sources.list.d/adoptopenjdk.list <span class="se">\</span> |
| <span class="o">&&</span> apt-get update <span class="se">\</span> |
| <span class="o">&&</span> apt-get install --no-install-recommends -y <span class="se">\</span> |
| adoptopenjdk-8-hotspot-jre <span class="se">\</span> |
| <span class="o">&&</span> apt-get autoremove -yqq --purge <span class="se">\</span> |
| <span class="o">&&</span> apt-get clean <span class="se">\</span> |
| <span class="o">&&</span> rm -rf /var/lib/apt/lists/* |
| <span class="k">ENV</span> <span class="nv">JAVA_HOME</span><span class="o">=</span>/usr/lib/jvm/adoptopenjdk-8-hotspot-jre-amd64 |
| |
| <span class="k">RUN</span> mkdir -p /opt/spark/jars |
| |
| <span class="c"># Install Apache Hadoop</span> |
| <span class="k">ARG</span> <span class="nv">HADOOP_VERSION</span><span class="o">=</span><span class="m">2</span>.10.1 |
| <span class="k">ENV</span> <span class="nv">HADOOP_HOME</span><span class="o">=</span>/opt/hadoop |
| <span class="k">ENV</span> <span class="nv">HADOOP_CONF_DIR</span><span class="o">=</span>/etc/hadoop |
| <span class="k">ENV</span> <span class="nv">MULTIHOMED_NETWORK</span><span class="o">=</span><span class="m">1</span> |
| <span class="k">ENV</span> <span class="nv">USER</span><span class="o">=</span>root |
| |
| <span class="k">RUN</span> <span class="nv">HADOOP_URL</span><span class="o">=</span><span class="s2">"https://archive.apache.org/dist/hadoop/common/hadoop-</span><span class="nv">$HADOOP_VERSION</span><span class="s2">/hadoop-</span><span class="nv">$HADOOP_VERSION</span><span class="s2">.tar.gz"</span> <span class="se">\</span> |
| <span class="o">&&</span> curl <span class="s1">'https://dist.apache.org/repos/dist/release/hadoop/common/KEYS'</span> <span class="p">|</span> gpg --import - <span class="se">\</span> |
| <span class="o">&&</span> curl -fSL <span class="s2">"</span><span class="nv">$HADOOP_URL</span><span class="s2">"</span> -o /tmp/hadoop.tar.gz <span class="se">\</span> |
| <span class="o">&&</span> curl -fSL <span class="s2">"</span><span class="nv">$HADOOP_URL</span><span class="s2">.asc"</span> -o /tmp/hadoop.tar.gz.asc <span class="se">\</span> |
| <span class="o">&&</span> gpg --verify /tmp/hadoop.tar.gz.asc <span class="se">\</span> |
| <span class="o">&&</span> tar -xvf /tmp/hadoop.tar.gz -C <span class="s2">"</span><span class="si">${</span><span class="nv">HADOOP_HOME</span><span class="si">}</span><span class="s2">"</span> --strip-components<span class="o">=</span><span class="m">1</span> <span class="se">\</span> |
| <span class="o">&&</span> rm /tmp/hadoop.tar.gz /tmp/hadoop.tar.gz.asc <span class="se">\</span> |
| <span class="o">&&</span> ln -s <span class="s2">"</span><span class="si">${</span><span class="nv">HADOOP_HOME</span><span class="si">}</span><span class="s2">/etc/hadoop"</span> /etc/hadoop <span class="se">\</span> |
| <span class="o">&&</span> mkdir <span class="s2">"</span><span class="si">${</span><span class="nv">HADOOP_HOME</span><span class="si">}</span><span class="s2">/logs"</span> <span class="se">\</span> |
| <span class="o">&&</span> mkdir /hadoop-data |
| |
| <span class="k">ENV</span> <span class="nv">PATH</span><span class="o">=</span><span class="s2">"</span><span class="nv">$HADOOP_HOME</span><span class="s2">/bin/:</span><span class="nv">$PATH</span><span class="s2">"</span> |
| |
| <span class="c"># Install Apache Hive</span> |
| <span class="k">ARG</span> <span class="nv">HIVE_VERSION</span><span class="o">=</span><span class="m">2</span>.3.7 |
| <span class="k">ENV</span> <span class="nv">HIVE_HOME</span><span class="o">=</span>/opt/hive |
| <span class="k">ENV</span> <span class="nv">HIVE_CONF_DIR</span><span class="o">=</span>/etc/hive |
| |
| <span class="k">RUN</span> <span class="nv">HIVE_URL</span><span class="o">=</span><span class="s2">"https://archive.apache.org/dist/hive/hive-</span><span class="si">${</span><span class="nv">HIVE_VERSION</span><span class="si">}</span><span class="s2">/apache-hive-</span><span class="si">${</span><span class="nv">HIVE_VERSION</span><span class="si">}</span><span class="s2">-bin.tar.gz"</span> <span class="se">\</span> |
| <span class="o">&&</span> curl -fSL <span class="s1">'https://downloads.apache.org/hive/KEYS'</span> <span class="p">|</span> gpg --import - <span class="se">\</span> |
| <span class="o">&&</span> curl -fSL <span class="s2">"</span><span class="nv">$HIVE_URL</span><span class="s2">"</span> -o /tmp/hive.tar.gz <span class="se">\</span> |
| <span class="o">&&</span> curl -fSL <span class="s2">"</span><span class="nv">$HIVE_URL</span><span class="s2">.asc"</span> -o /tmp/hive.tar.gz.asc <span class="se">\</span> |
| <span class="o">&&</span> gpg --verify /tmp/hive.tar.gz.asc <span class="se">\</span> |
| <span class="o">&&</span> mkdir -p <span class="s2">"</span><span class="si">${</span><span class="nv">HIVE_HOME</span><span class="si">}</span><span class="s2">"</span> <span class="se">\</span> |
| <span class="o">&&</span> tar -xf /tmp/hive.tar.gz -C <span class="s2">"</span><span class="si">${</span><span class="nv">HIVE_HOME</span><span class="si">}</span><span class="s2">"</span> --strip-components<span class="o">=</span><span class="m">1</span> <span class="se">\</span> |
| <span class="o">&&</span> rm /tmp/hive.tar.gz /tmp/hive.tar.gz.asc <span class="se">\</span> |
| <span class="o">&&</span> ln -s <span class="s2">"</span><span class="si">${</span><span class="nv">HIVE_HOME</span><span class="si">}</span><span class="s2">/etc/hive"</span> <span class="s2">"</span><span class="si">${</span><span class="nv">HIVE_CONF_DIR</span><span class="si">}</span><span class="s2">"</span> <span class="se">\</span> |
| <span class="o">&&</span> mkdir <span class="s2">"</span><span class="si">${</span><span class="nv">HIVE_HOME</span><span class="si">}</span><span class="s2">/logs"</span> |
| |
| <span class="k">ENV</span> <span class="nv">PATH</span><span class="o">=</span><span class="s2">"</span><span class="nv">$HIVE_HOME</span><span class="s2">/bin/:</span><span class="nv">$PATH</span><span class="s2">"</span> |
| |
| <span class="c"># Install GCS connector for Apache Hadoop</span> |
| <span class="c"># See: https://cloud.google.com/dataproc/docs/concepts/connectors/cloud-storage</span> |
| <span class="k">ARG</span> <span class="nv">GCS_VARIANT</span><span class="o">=</span><span class="s2">"hadoop2"</span> |
| <span class="k">ARG</span> <span class="nv">GCS_VERSION</span><span class="o">=</span><span class="s2">"2.1.5"</span> |
| |
| <span class="k">RUN</span> <span class="nv">GCS_JAR_PATH</span><span class="o">=</span><span class="s2">"/opt/spark/jars/gcs-connector-</span><span class="si">${</span><span class="nv">GCS_VARIANT</span><span class="si">}</span><span class="s2">-</span><span class="si">${</span><span class="nv">GCS_VERSION</span><span class="si">}</span><span class="s2">.jar"</span> <span class="se">\</span> |
| <span class="o">&&</span> <span class="nv">GCS_JAR_URL</span><span class="o">=</span><span class="s2">"https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-</span><span class="si">${</span><span class="nv">GCS_VARIANT</span><span class="si">}</span><span class="s2">-</span><span class="si">${</span><span class="nv">GCS_VERSION</span><span class="si">}</span><span class="s2">.jar"</span> <span class="se">\</span> |
| <span class="o">&&</span> curl <span class="s2">"</span><span class="si">${</span><span class="nv">GCS_JAR_URL</span><span class="si">}</span><span class="s2">"</span> -o <span class="s2">"</span><span class="si">${</span><span class="nv">GCS_JAR_PATH</span><span class="si">}</span><span class="s2">"</span> |
| |
| <span class="k">ENV</span> <span class="nv">HADOOP_CLASSPATH</span><span class="o">=</span><span class="s2">"/opt/spark/jars/gcs-connector-</span><span class="si">${</span><span class="nv">GCS_VARIANT</span><span class="si">}</span><span class="s2">-</span><span class="si">${</span><span class="nv">GCS_VERSION</span><span class="si">}</span><span class="s2">.jar:</span><span class="nv">$HADOOP_CLASSPATH</span><span class="s2">"</span> |
| |
| <span class="k">USER</span><span class="s"> ${AIRFLOW_UID}</span> |
| </pre></div> |
| </div> |
| </div> |
| <p>Then build a new image.</p> |
| <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>docker build . <span class="se">\</span> |
| --build-arg <span class="nv">BASE_AIRFLOW_IMAGE</span><span class="o">=</span><span class="s2">"apache/airflow:2.0.0"</span> <span class="se">\</span> |
| -t my-airflow-image |
| </pre></div> |
| </div> |
| </div> |
| </div> |
| <div class="section" id="more-details-about-the-images"> |
| <h3>More details about the images<a class="headerlink" href="#more-details-about-the-images" title="Permalink to this headline">¶</a></h3> |
| <p>You can read more details about the images - the context, their parameters and internal structure in the |
| <a class="reference external" href="https://github.com/apache/airflow/blob/master/IMAGES.rst">IMAGES.rst</a> document.</p> |
| </div> |
| </div> |
| <div class="section" id="kerberos-authenticated-workers"> |
| <span id="production-deployment-kerberos"></span><h2>Kerberos-authenticated workers<a class="headerlink" href="#kerberos-authenticated-workers" title="Permalink to this headline">¶</a></h2> |
| <p>Apache Airflow has a built-in mechanism for authenticating the operation with a KDC (Key Distribution Center). |
| Airflow has a separate command <code class="docutils literal notranslate"><span class="pre">airflow</span> <span class="pre">kerberos</span></code> that acts as token refresher. It uses the pre-configured |
| Kerberos Keytab to authenticate in the KDC to obtain a valid token, and then refreshing valid token |
| at regular intervals within the current token expiry window.</p> |
| <p>Each request for refresh uses a configured principal, and only keytab valid for the principal specified |
| is capable of retrieving the authentication token.</p> |
| <p>The best practice to implement proper security mechanism in this case is to make sure that worker |
| workloads have no access to the Keytab but only have access to the periodically refreshed, temporary |
| authentication tokens. This can be achieved in docker environment by running the <code class="docutils literal notranslate"><span class="pre">airflow</span> <span class="pre">kerberos</span></code> |
| command and the worker command in separate containers - where only the <code class="docutils literal notranslate"><span class="pre">airflow</span> <span class="pre">kerberos</span></code> token has |
| access to the Keytab file (preferably configured as secret resource). Those two containers should share |
| a volume where the temporary token should be written by the <code class="docutils literal notranslate"><span class="pre">airflow</span> <span class="pre">kerberos</span></code> and read by the workers.</p> |
| <p>In the Kubernetes environment, this can be realized by the concept of side-car, where both Kerberos |
| token refresher and worker are part of the same Pod. Only the Kerberos side-car has access to |
| Keytab secret and both containers in the same Pod share the volume, where temporary token is written by |
| the side-care container and read by the worker container.</p> |
| <p>This concept is implemented in the development version of the Helm Chart that is part of Airflow source code.</p> |
| </div> |
| <div class="section" id="secured-server-and-service-access-on-google-cloud"> |
| <h2>Secured Server and Service Access on Google Cloud<a class="headerlink" href="#secured-server-and-service-access-on-google-cloud" title="Permalink to this headline">¶</a></h2> |
| <p>This section describes techniques and solutions for securely accessing servers and services when your Airflow |
| environment is deployed on Google Cloud, or you connect to Google services, or you are connecting |
| to the Google API.</p> |
| <div class="section" id="iam-and-service-accounts"> |
| <h3>IAM and Service Accounts<a class="headerlink" href="#iam-and-service-accounts" title="Permalink to this headline">¶</a></h3> |
| <p>You should not rely on internal network segmentation or firewalling as our primary security mechanisms. |
| To protect your organization’s data, every request you make should contain sender identity. In the case of |
| Google Cloud, the identity is provided by |
| <a class="reference external" href="https://cloud.google.com/iam/docs/service-accounts">the IAM and Service account</a>. Each Compute Engine |
| instance has an associated service account identity. It provides cryptographic credentials that your workload |
| can use to prove its identity when making calls to Google APIs or third-party services. Each instance has |
| access only to short-lived credentials. If you use Google-managed service account keys, then the private |
| key is always held in escrow and is never directly accessible.</p> |
| <p>If you are using Kubernetes Engine, you can use |
| <a class="reference external" href="https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity">Workload Identity</a> to assign |
| an identity to individual pods.</p> |
| <p>For more information about service accounts in the Airflow, see <a class="reference external" href="/docs/apache-airflow-providers-google/stable/connections/gcp.html#howto-connection-gcp" title="(in apache-airflow-providers-google vmaster)"><span>Google Cloud Connection</span></a></p> |
| </div> |
| <div class="section" id="impersonate-service-accounts"> |
| <h3>Impersonate Service Accounts<a class="headerlink" href="#impersonate-service-accounts" title="Permalink to this headline">¶</a></h3> |
| <p>If you need access to other service accounts, you can |
| <a class="reference external" href="/docs/apache-airflow-providers-google/stable/connections/gcp.html#howto-connection-gcp-impersonation" title="(in apache-airflow-providers-google vmaster)"><span class="xref std std-ref">impersonate other service accounts</span></a> to exchange the token with |
| the default identity to another service account. Thus, the account keys are still managed by Google |
| and cannot be read by your workload.</p> |
| <p>It is not recommended to generate service account keys and store them in the metadata database or the |
| secrets backend. Even with the use of the backend secret, the service account key is available for |
| your workload.</p> |
| </div> |
| <div class="section" id="access-to-compute-engine-instance"> |
| <h3>Access to Compute Engine Instance<a class="headerlink" href="#access-to-compute-engine-instance" title="Permalink to this headline">¶</a></h3> |
| <p>If you want to establish an SSH connection to the Compute Engine instance, you must have the network address |
| of this instance and credentials to access it. To simplify this task, you can use |
| <a class="reference external" href="/docs/apache-airflow-providers-google/stable/_api/airflow/providers/google/cloud/hooks/compute/index.html#airflow.providers.google.cloud.hooks.compute.ComputeEngineHook" title="(in apache-airflow-providers-google vmaster)"><code class="xref py py-class docutils literal notranslate"><span class="pre">ComputeEngineHook</span></code></a> |
| instead of <a class="reference external" href="/docs/apache-airflow-providers-ssh/stable/_api/airflow/providers/ssh/hooks/ssh/index.html#airflow.providers.ssh.hooks.ssh.SSHHook" title="(in apache-airflow-providers-ssh vmaster)"><code class="xref py py-class docutils literal notranslate"><span class="pre">SSHHook</span></code></a></p> |
| <p>The <a class="reference external" href="/docs/apache-airflow-providers-google/stable/_api/airflow/providers/google/cloud/hooks/compute/index.html#airflow.providers.google.cloud.hooks.compute.ComputeEngineHook" title="(in apache-airflow-providers-google vmaster)"><code class="xref py py-class docutils literal notranslate"><span class="pre">ComputeEngineHook</span></code></a> support authorization with |
| Google OS Login service. It is an extremely robust way to manage Linux access properly as it stores |
| short-lived ssh keys in the metadata service, offers PAM modules for access and sudo privilege checking |
| and offers the <code class="docutils literal notranslate"><span class="pre">nsswitch</span></code> user lookup into the metadata service as well.</p> |
| <p>It also solves the discovery problem that arises as your infrastructure grows. You can use the |
| instance name instead of the network address.</p> |
| </div> |
| <div class="section" id="access-to-amazon-web-service"> |
| <h3>Access to Amazon Web Service<a class="headerlink" href="#access-to-amazon-web-service" title="Permalink to this headline">¶</a></h3> |
| <p>Thanks to the |
| <a class="reference external" href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html">Web Identity Federation</a>, |
| you can exchange the Google Cloud Platform identity to the Amazon Web Service identity, |
| which effectively means access to Amazon Web Service platform. |
| For more information, see: <a class="reference external" href="/docs/apache-airflow-providers-amazon/stable/connections/aws.html#howto-connection-aws-gcp-federation" title="(in apache-airflow-providers-amazon vmaster)"><span>Google Cloud to AWS authentication using Web Identity Federation</span></a></p> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div class="pager" role="navigation" aria-label="related navigation"> |
| <a rel="prev" title="Best Practices" href="best-practices.html" > |
| <button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" accesskey="p">Previous</button> |
| </a> |
| <a rel="next" title="Backport Providers" href="backport-providers.html" > |
| <button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" accesskey="n">Next</button> |
| </a> |
| </div> |
| </div> |
| |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="rating-container"> |
| <p class="bodytext__medium--greyish-brown font-weight-500">Was this entry helpful?</p> |
| <div class="rating"> |
| |
| <div id="rate-star-5" class="rate-star"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02"> |
| <g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)"> |
| <path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path> |
| </g> |
| </svg> |
| |
| </div> |
| |
| <div id="rate-star-4" class="rate-star"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02"> |
| <g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)"> |
| <path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path> |
| </g> |
| </svg> |
| |
| </div> |
| |
| <div id="rate-star-3" class="rate-star"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02"> |
| <g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)"> |
| <path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path> |
| </g> |
| </svg> |
| |
| </div> |
| |
| <div id="rate-star-2" class="rate-star"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02"> |
| <g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)"> |
| <path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path> |
| </g> |
| </svg> |
| |
| </div> |
| |
| <div id="rate-star-1" class="rate-star"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02"> |
| <g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)"> |
| <path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path> |
| </g> |
| </svg> |
| |
| </div> |
| |
| </div> |
| </div> |
| |
| </main> |
| |
| |
| |
| |
| <nav class="wy-nav-side-toc"> |
| <div class="wy-menu-vertical"> |
| <ul> |
| <li><a class="reference internal" href="#">Production Deployment</a><ul> |
| <li><a class="reference internal" href="#database-backend">Database backend</a></li> |
| <li><a class="reference internal" href="#multi-node-cluster">Multi-Node Cluster</a></li> |
| <li><a class="reference internal" href="#logging">Logging</a></li> |
| <li><a class="reference internal" href="#configuration">Configuration</a></li> |
| <li><a class="reference internal" href="#scheduler-uptime">Scheduler Uptime</a></li> |
| <li><a class="reference internal" href="#production-container-images">Production Container Images</a><ul> |
| <li><a class="reference internal" href="#production-ready-reference-image">Production-ready reference Image</a></li> |
| <li><a class="reference internal" href="#customizing-or-extending-the-production-image">Customizing or extending the Production Image</a><ul> |
| <li><a class="reference internal" href="#extending-the-image">Extending the image</a></li> |
| <li><a class="reference internal" href="#customizing-the-image">Customizing the image</a></li> |
| <li><a class="reference internal" href="#customizing-images-in-high-security-restricted-environments">Customizing images in high security restricted environments</a></li> |
| <li><a class="reference internal" href="#customizing-extending-the-image-together">Customizing & extending the image together</a></li> |
| <li><a class="reference internal" href="#customizing-pypi-installation">Customizing PYPI installation</a></li> |
| </ul> |
| </li> |
| <li><a class="reference internal" href="#external-sources-for-dependencies">External sources for dependencies</a></li> |
| <li><a class="reference internal" href="#comparing-extending-and-customizing-the-image">Comparing extending and customizing the image</a></li> |
| <li><a class="reference internal" href="#using-the-production-image">Using the production image</a></li> |
| <li><a class="reference internal" href="#id1">Production image build arguments</a></li> |
| <li><a class="reference internal" href="#actions-executed-at-image-start">Actions executed at image start</a><ul> |
| <li><a class="reference internal" href="#creating-system-user">Creating system user</a></li> |
| <li><a class="reference internal" href="#waits-for-airflow-db-connection">Waits for Airflow DB connection</a></li> |
| <li><a class="reference internal" href="#upgrading-airflow-db">Upgrading Airflow DB</a></li> |
| <li><a class="reference internal" href="#creating-admin-user">Creating admin user</a></li> |
| <li><a class="reference internal" href="#waits-for-celery-broker-connection">Waits for celery broker connection</a></li> |
| </ul> |
| </li> |
| <li><a class="reference internal" href="#recipes">Recipes</a><ul> |
| <li><a class="reference internal" href="#google-cloud-sdk-installation">Google Cloud SDK installation</a></li> |
| <li><a class="reference internal" href="#apache-hadoop-stack-installation">Apache Hadoop Stack installation</a></li> |
| </ul> |
| </li> |
| <li><a class="reference internal" href="#more-details-about-the-images">More details about the images</a></li> |
| </ul> |
| </li> |
| <li><a class="reference internal" href="#kerberos-authenticated-workers">Kerberos-authenticated workers</a></li> |
| <li><a class="reference internal" href="#secured-server-and-service-access-on-google-cloud">Secured Server and Service Access on Google Cloud</a><ul> |
| <li><a class="reference internal" href="#iam-and-service-accounts">IAM and Service Accounts</a></li> |
| <li><a class="reference internal" href="#impersonate-service-accounts">Impersonate Service Accounts</a></li> |
| <li><a class="reference internal" href="#access-to-compute-engine-instance">Access to Compute Engine Instance</a></li> |
| <li><a class="reference internal" href="#access-to-amazon-web-service">Access to Amazon Web Service</a></li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| |
| </div> |
| </nav> |
| |
| </div> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <div class="base-layout--button"> |
| <a href="https://github.com/apache/airflow/edit/master/docs/apache-airflow/production-deployment.rst" rel="nofollow"> |
| |
| <button class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="30.76" height="30"> |
| <path d="M15.379 0a15.381 15.381 0 00-4.86 29.974c.769.141 1.05-.334 1.05-.741 0-.365-.013-1.332-.021-2.616-4.278.929-5.181-2.062-5.181-2.062a4.071 4.071 0 00-1.708-2.25c-1.4-.954.106-.935.106-.935a3.231 3.231 0 012.356 1.585 3.274 3.274 0 004.476 1.278 3.287 3.287 0 01.976-2.056c-3.415-.388-7.005-1.707-7.005-7.6a5.947 5.947 0 011.583-4.127 5.53 5.53 0 01.151-4.07s1.291-.413 4.229 1.577a14.577 14.577 0 017.7 0c2.936-1.99 4.225-1.577 4.225-1.577a5.523 5.523 0 01.153 4.07 5.937 5.937 0 011.581 4.127c0 5.909-3.6 7.209-7.022 7.589a3.672 3.672 0 011.044 2.848c0 2.056-.019 3.715-.019 4.219 0 .411.277.89 1.057.74A15.382 15.382 0 0015.378.001z" data-name="Path 224" fill="#51504f" fill-rule="evenodd"></path> |
| </svg> |
| |
| <span class="bodytext__medium--brownish-grey">Suggest a change on this page</span> |
| </button> |
| </a> |
| </div> |
| |
| |
| </div> |
| |
| |
| |
| |
| <footer> |
| <div class="footer-section footer-section__media-section"> |
| <div class="d-flex align-items-center"> |
| |
| <a class="footer-section__media-section--link" target="_blank" href="https://github.com"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45"> |
| <path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2.365a8.284 8.284 0 0 1 .23 6.105 8.9 8.9 0 0 1 2.371 6.191c0 8.862-5.393 10.812-10.533 11.384a5.506 5.506 0 0 1 1.566 4.272c0 3.084-.028 5.572-.028 6.329 0 .617.415 1.334 1.586 1.109a23.073 23.073 0 0 0-7.308-44.958z" fill="#fff" fill-rule="evenodd" data-name="Path 207" transform="translate(-205.894 -1078.578)"></path> |
| </svg> |
| |
| </a> |
| |
| <a class="footer-section__media-section--link" target="_blank" href="https://jira.atlassian.com/"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="45" height="45" viewBox="0 0 45 45"> |
| <g id="Group_210" data-name="Group 210" transform="translate(-339.789 -1315.282)"> |
| <path id="Path_218" d="M394.82 1315.282h-21.671a9.784 9.784 0 0 0 9.784 9.778h3.986v3.857a9.784 9.784 0 0 0 9.784 9.771v-21.523a1.884 1.884 0 0 0-1.883-1.883z" fill="#fff" data-name="Path 218" transform="translate(-11.914)"></path> |
| <path id="Path_219" d="M378.14 1332.072h-21.671a9.778 9.778 0 0 0 9.778 9.778h4.018v3.857a9.784 9.784 0 0 0 9.752 9.778v-21.536a1.877 1.877 0 0 0-1.877-1.877z" fill="#fff" data-name="Path 219" transform="translate(-5.957 -5.996)"></path> |
| <path id="Path_220" d="M361.46 1348.862h-21.671a9.778 9.778 0 0 0 9.778 9.778h3.992v3.857a9.778 9.778 0 0 0 9.778 9.778v-21.529a1.883 1.883 0 0 0-1.877-1.884z" fill="#fff" data-name="Path 220" transform="translate(0 -11.993)"></path> |
| </g> |
| </svg> |
| |
| </a> |
| |
| <a class="footer-section__media-section--link" target="_blank" href="https://slack.com"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073"> |
| <g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)"> |
| <g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)"> |
| <path id="Path_208" d="M670.634 856.859a4.744 4.744 0 1 1-4.744-4.744h4.744z" fill="#fff" data-name="Path 208" transform="translate(-661.145 -852.115)"></path> |
| <path id="Path_209" d="M684.059 856.859a4.744 4.744 0 0 1 9.489 0v11.861a4.744 4.744 0 1 1-9.489 0z" fill="#fff" data-name="Path 209" transform="translate(-672.198 -852.115)"></path> |
| </g> |
| <g id="Group_205" data-name="Group 205" transform="translate(661.145 806.287)"> |
| <path id="Path_210" d="M688.8 815.776a4.744 4.744 0 1 1 4.744-4.745v4.745z" fill="#fff" data-name="Path 210" transform="translate(-672.198 -806.287)"></path> |
| <path id="Path_211" d="M677.751 829.2a4.744 4.744 0 0 1 0 9.489H665.89a4.744 4.744 0 1 1 0-9.489z" fill="#fff" data-name="Path 211" transform="translate(-661.145 -817.34)"></path> |
| </g> |
| <g id="Group_206" data-name="Group 206" transform="translate(684.868 806.287)"> |
| <path id="Path_212" d="M729.887 833.945a4.744 4.744 0 1 1 4.745 4.745h-4.745z" fill="#fff" data-name="Path 212" transform="translate(-718.026 -817.34)"></path> |
| <path id="Path_213" d="M716.462 822.893a4.744 4.744 0 1 1-9.489 0v-11.862a4.744 4.744 0 0 1 9.489 0z" fill="#fff" data-name="Path 213" transform="translate(-706.973 -806.287)"></path> |
| </g> |
| <g id="Group_207" data-name="Group 207" transform="translate(684.868 830.01)"> |
| <path id="Path_214" d="M711.718 875.029a4.744 4.744 0 1 1-4.745 4.744v-4.744z" fill="#fff" data-name="Path 214" transform="translate(-706.973 -863.168)"></path> |
| <path id="Path_215" d="M711.718 861.6a4.744 4.744 0 1 1 0-9.489h11.861a4.744 4.744 0 0 1 0 9.489z" fill="#fff" data-name="Path 215" transform="translate(-706.973 -852.115)"></path> |
| </g> |
| </g> |
| </svg> |
| |
| </a> |
| |
| <a class="footer-section__media-section--link" target="_blank" href="https://stackoverflow.com"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6"> |
| <g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)"> |
| <path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"></path> |
| <path id="Path_217" d="M661.012 1003.008l19.467 4.069.824-3.914-19.467-4.069zm2.575-9.27l18.025 8.395 1.648-3.605-18.025-8.446zm5-8.858l15.3 12.721 2.524-3.039-15.3-12.721zm9.888-9.425l-3.193 2.369 11.845 15.965 3.193-2.369zm-17.875 36.617h19.879v-3.966H660.6z" fill="#fff" data-name="Path 217" transform="translate(-7.469)"></path> |
| </g> |
| </svg> |
| |
| </a> |
| |
| <a class="footer-section__media-section--link" target="_blank" href="https://twitter.com"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="44.355" height="44.355" viewBox="0 0 44.355 44.355"> |
| <g id="Group_211" data-name="Group 211" transform="translate(-503 -1382.2)"> |
| <path id="Path_221" d="M541.811 1382.2h-33.267a5.546 5.546 0 0 0-5.544 5.544v33.266a5.547 5.547 0 0 0 5.544 5.545h33.267a5.546 5.546 0 0 0 5.544-5.545v-33.266a5.546 5.546 0 0 0-5.544-5.544zm-5.611 16.533c.011.244.011.488.011.732 0 7.507-5.722 16.178-16.179 16.178a16.173 16.173 0 0 1-8.7-2.539 10.92 10.92 0 0 0 1.353.078 11.4 11.4 0 0 0 7.064-2.44 5.685 5.685 0 0 1-5.311-3.947 5.725 5.725 0 0 0 2.561-.1 5.7 5.7 0 0 1-4.557-5.578v-.078a5.752 5.752 0 0 0 2.572.71 5.709 5.709 0 0 1-1.763-7.6 16.146 16.146 0 0 0 11.721 5.944 6.282 6.282 0 0 1-.144-1.3 5.688 5.688 0 0 1 9.836-3.892 11.3 11.3 0 0 0 3.615-1.375 5.721 5.721 0 0 1-2.506 3.149 11.538 11.538 0 0 0 3.271-.9 11.585 11.585 0 0 1-2.844 2.958z" fill="#fff" data-name="Path 221"></path> |
| </g> |
| </svg> |
| |
| </a> |
| |
| <a class="footer-section__media-section--link" target="_blank" href="https://youtube.com"> |
| <svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941"> |
| <path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="translate(-1076 -1224.542)"></path> |
| </svg> |
| |
| </a> |
| |
| </div> |
| |
| |
| <div class="footer-section__media-section--button-with-text"> |
| <span class="footer-section__media-section--text">Want to be a part of Apache Airflow?</span> |
| <a href="/community"> |
| |
| <button id="" class="btn-filled bodytext__medium--white ">Join community</button> |
| |
| </a> |
| </div> |
| |
| |
| </div> |
| <div class="footer-section footer-section__policies-section"> |
| <div class="footer-section"> |
| <span>© The Apache Software Foundation 2019</span> |
| <div class="footer-section__policies-section--policies"> |
| |
| <a href="https://www.apache.org/licenses/" class="footer-section__policies-section--policy-item"> |
| <span>License</span> |
| </a> |
| |
| <a href="https://www.apache.org/foundation/sponsorship.html" class="footer-section__policies-section--policy-item"> |
| <span>Donate</span> |
| </a> |
| |
| <a href="https://www.apache.org/foundation/thanks.html" class="footer-section__policies-section--policy-item"> |
| <span>Thanks</span> |
| </a> |
| |
| <a href="https://www.apache.org/security/" class="footer-section__policies-section--policy-item"> |
| <span>Security</span> |
| </a> |
| |
| |
| </div> |
| </div> |
| <span class="footer-section__policies-section--disclaimer"> |
| Apache Airflow, Apache, Airflow, the Airflow logo, and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation. |
| All other products or name brands are trademarks of their respective holders, including The Apache Software Foundation. |
| </span> |
| </div> |
| </footer> |
| <script type="text/javascript" src="_static/_gen/js/docs.js"></script> |
| <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> |
| <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script> |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> |
| <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script> |
| <script src="_static/jquery.js"></script> |
| <script src="_static/underscore.js"></script> |
| <script src="_static/doctools.js"></script> |
| <script src="_static/language_data.js"></script> |
| <script src="_static/clipboard.min.js"></script> |
| <script src="_static/copybutton.js"></script> |
| <script src="_static/jira-links.js"></script> |
| </body> |
| </html> |