{"id":345767,"date":"2023-02-21T21:02:59","date_gmt":"2023-02-21T21:02:59","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=345767"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=345767","title":{"rendered":"<span>\u0417\u0430\u043f\u0443\u0441\u043a R \u043a\u043e\u0434\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4a6\/b73\/b6f\/4a6b73b6f8666e1ce7c288f8d10ebabc.png\" width=\"780\" height=\"439\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4a6\/b73\/b6f\/4a6b73b6f8666e1ce7c288f8d10ebabc.png\"\/><figcaption><\/figcaption><\/figure>\n<div class=\"persona\" persona=\"true\"><img decoding=\"async\" persona=\"true\" class=\"image persona__image\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/1ce\/964\/eda\/1ce964eda2a885ac39e58462a2ea0a66.jpg\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1ce\/964\/eda\/1ce964eda2a885ac39e58462a2ea0a66.jpg\" data-blurred=\"true\"\/><\/p>\n<h5 class=\"persona__heading\" persona=\"true\">\u0410\u0432\u0442\u043e\u0440 \u0441\u0442\u0430\u0442\u044c\u0438: \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0412\u043e\u043b\u043e\u0434\u0438\u043d<\/h5>\n<p>Analytics Engineer \u0432 Trafficstars<\/p>\n<\/div>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0412\u043e\u043b\u043e\u0434\u0438\u043d, \u044f Analytics Engineer \u0432 Trafficstars. \u041a\u043e\u0433\u0434\u0430-\u0442\u043e \u044f, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435, \u0431\u044b\u043b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 R \u0438 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043e\u0441\u0442\u0440\u043e \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e. \u0415\u0449\u0451 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u0442\u043a\u0443\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e. \u0410 \u0443\u0436 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c &#171;\u043a\u043d\u043e\u043f\u043e\u0447\u043a\u043e\u0439 play&#187; \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0447\u0442\u043e\u0439.<\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u0430 \u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 R). \u0422\u0430\u043a\u0436\u0435 \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0438 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430\u043c. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043f\u043b\u043e\u0445\u043e \u0441 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0449\u0438\u043a\u0430\u043c\u0438 (\u0438\u043b\u0438 \u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0442 \u0443 \u0432\u0430\u0441 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438). \u042f \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442, \u043d\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c.<\/p>\n<h3>\u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043f\u0440\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442 cron. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u0438 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c \u0432\u043b\u0438\u044f\u043d\u0438\u0435\u043c. \u041d\u043e \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u0433\u0438\u0431\u043a\u0438\u0439, \u043a\u0430\u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b.<\/p>\n<p><em>Cron &#8212; \u0443\u0442\u0438\u043b\u0438\u0442\u0430 linux \u0438 macos, Windows \u0438 \u0435\u0433\u043e Task Scheduler \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0443 \u043d\u0438\u0445 \u0441 \u043a\u0440\u043e\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0435 \u0436\u0435 \u0431\u043e\u043b\u044f\u0447\u043a\u0438 \u0438 \u043d\u0435\u0434\u043e\u0431\u0441\u0442\u0432\u0430 (\u0438 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442 \u0441 \u043d\u0438\u043c \u043e\u043f\u044b\u0442\u0430). \u0412 R \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 taskscheduleR, \u0442\u0430\u043c \u0438 add-in \u0434\u043b\u044f RStudio \u0435\u0441\u0442\u044c.<\/em><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b (\u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>crontab -e<\/code>), \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u0443 \u0432\u0430\u0441 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443 (\u0447\u0430\u0441\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b):<\/p>\n<pre><code class=\"bash\">m h  dom mon dow   command<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a cron-\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u043d\u0430\u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p><strong>m<\/strong> &#8212; \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043c\u0438\u043d\u0443\u0442\u0435 (\u043e\u0442 0 \u0434\u043e 59)<\/p>\n<\/li>\n<li>\n<p><strong>h<\/strong> &#8212; \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0430\u0441 (\u043e\u0442 0 \u0434\u043e 23)<\/p>\n<\/li>\n<li>\n<p><strong>dom<\/strong> &#8212; \u0432 \u043a\u0430\u043a\u043e\u0439 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443 (1-31) \u0434\u0435\u043d\u044c \u043c\u0435\u0441\u044f\u0446\u0430<\/p>\n<\/li>\n<li>\n<p><strong>mon<\/strong> &#8212; \u0432 \u043a\u0430\u043a\u043e\u0439 \u043c\u0435\u0441\u044f\u0446 (1-12)<\/p>\n<\/li>\n<li>\n<p><strong>dow<\/strong> &#8212; \u0432 \u043a\u0430\u043a\u043e\u0439 \u0434\u0435\u043d\u044c \u043d\u0435\u0434\u0435\u043b\u0438 (0-6, \u0433\u0434\u0435 0 &#8212; \u044d\u0442\u043e \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435).<\/p>\n<\/li>\n<li>\n<p>\u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u0430\u0448\u0430 <strong>command<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u043b\u0430, \u043d\u043e \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b:<\/p>\n<ul>\n<li>\n<p>\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443 \u0438\u043b\u0438 \u043c\u0435\u0441\u044f\u0446)    <\/p>\n<\/li>\n<li>\n<p>n-m &#8212; \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0442 n \u0434\u043e m (\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\/k &#8212; \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0448\u0430\u0433 (\u043a\u0430\u0436\u0434\u044b\u0439 k-\u044b\u0439 \u0434\u0435\u043d\u044c \u043c\u0435\u0441\u044f\u0446\u0430)<\/p>\n<\/li>\n<li>\n<p>\u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u043b\u0438 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f dom \u0438 dow, \u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445. \u0422\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c <code>30 11 1 * 0<\/code> \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c &#171;\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 11:30 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0441\u044f\u0446 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0438\u043b\u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435&#187;. \u0412\u044b\u0445\u043e\u0434\u0438\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u0438\u043b\u0438, \u0430 \u043d\u0435 \u043a\u0430\u043a \u0438 (\u043d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b). \u0412\u043e\u043e\u0431\u0449\u0435 \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 <a href=\"https:\/\/crontab.guru\/\">\u0441\u0430\u0439\u0442<\/a> \u0432 \u043f\u043e\u043c\u043e\u0449\u044c, \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 cron \u0432 R \u0435\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442 cronR, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0442\u0430\u043a \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438\u0441\u044f. \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0438 add-in \u0434\u043b\u044f RStudio<\/p>\n<h3>\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 cron<\/h3>\n<p>Cron &#8212; \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043d\u043e \u043b\u0438\u0448\u0451\u043d \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0430\u043b\u0451\u0440\u0442\u0438\u043d\u0433 \u043d\u0435 \u0442\u0430\u043a \u043b\u0435\u0433\u043a\u043e \u0441\u044e\u0434\u0430 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c. \u041b\u043e\u0433\u0438 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 ELK \u0441\u0442\u0435\u043a). \u0422\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435. \u0418 \u0435\u0441\u043b\u0438 \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u043e \u0438 \u0432\u0430\u0448\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0436\u0435. \u0418 \u0435\u0449\u0451 \u043d\u0430 \u043c\u043d\u043e\u0433\u043e \u0432\u0435\u0441\u0451\u043b\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u0442\u044c\u0441\u044f (\u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0443\u0442\u0438).<\/p>\n<p>\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 cron \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432 \u0432\u0438\u0434\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442, \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/pipelines\/schedules.html\">scheduled pipelines \u0432 Gitlab<\/a>, <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/cron-jobs\/\">cronjob \u0432 Kubernetes<\/a>, <a href=\"https:\/\/airflow.apache.org\/\">Airflow<\/a>. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0439 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0434\u043b\u044f ETL \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 (\u0438 \u0434\u0430\u0442\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0445) \u0437\u0430\u0434\u0430\u0447. \u0415\u0433\u043e \u044f \u0434\u0430\u043b\u0435\u0435 \u0438 \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c. \u0425\u043e\u0442\u044f \u0438\u0441\u043a\u0443\u0448\u0451\u043d\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438 \u0443\u0434\u0438\u0432\u0438\u0442\u044c\u0441\u044f, \u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u043e \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0432\u043e\u0430\u043d\u0438\u044f, \u0442\u043e \u0432 Airflow \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e Python \u043a\u043e\u0434, \u043d\u043e \u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0451\u0439 \u044d\u0442\u043e \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0432\u0435\u043d\u0447\u0430\u044e.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0437\u043d\u0430\u043d\u0438\u044f R \u0432\u0430\u043c \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f Docker. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438\u0437 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u0442\u0430\u043a \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u043e (\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043a \u043d\u0435\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0441\u0442\u044b\u0434\u043d\u043e). \u0422\u0430\u043a\u0436\u0435 \u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 git).<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Docker desktop. \u0418 \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435 \u0438\u043c\u0435\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u043d\u0430 \u043b\u0438\u043d\u0443\u043a\u0441. \u0411\u043b\u0430\u0433\u043e \u0441 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u044d\u0442\u043e \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e. \u0410 \u043c\u043e\u0436\u043d\u043e \u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0443 \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433 \u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u0430. \u041f\u043e\u0442\u043e\u043c \u0432\u0430\u0448\u0438 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0430 \u043f\u0440\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u043b\u044c\u0441\u044b.<br \/> <a href=\"https:\/\/docs.docker.com\/get-docker\/\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 Docker desktop<\/a>.<br \/> <a href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/cli\/\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 docker<\/a><br \/> <a href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Dockerfile<\/a><br \/> <a href=\"https:\/\/docs.docker.com\/compose\/compose-file\/\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e docker-compose \u0444\u0430\u0439\u043b\u0443<\/a><\/p>\n<h3>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u0441\u0442\u0430\u0442\u044c\u0438 &#8212; \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u0434\u0430 \u0433\u0434\u0435 \u0438 \u043a\u043e\u0433\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e. \u0418 \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043a\u0430\u0436\u0443\u0442, \u043d\u0443 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0436\u0435 \u0432\u0441\u0451, \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u0434 \u0432 Docker \u043e\u0431\u0440\u0430\u0437, \u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0442\u0430\u043a \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e.<\/p>\n<p>\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043f\u0440\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b. \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0439\u0442\u0435 \u0438\u0445 \u043a\u0430\u043a \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0445\u043e\u0441\u0442\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b. \u042d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0437\u0430\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 (rocker\/tidyverse), \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0430 \u043b\u0438\u043d\u0443\u043a\u0441 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c R \u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u043c tidyverse. \u0412 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043d\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435), \u043f\u043e\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u043f\u0440\u044f\u043c\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430.<\/p>\n<pre><code class=\"bash\">docker run rocker\/tidyverse R -e print\\('\"Hello, world!\"'\\)<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0430 <code>rocker\/tidyverse<\/code>, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0438 \u0435\u0433\u043e \u0438 \u0432 \u043d\u0451\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 R <code>-e print('\"Hello, world!\"')<\/code>. \u0414\u0443\u043c\u0430\u044e, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0443\u0434\u0430 \u044f \u043a\u043b\u043e\u043d\u044e: \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0437, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0437 &#8212; \u044d\u0442\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0442\u043e Dockerfile &#8212; \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043e\u0431\u0440\u0430\u0437\u0430. \u0415\u0433\u043e-\u0442\u043e \u0438 \u043d\u0430\u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u0439 \u043f\u0430\u043f\u043a\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c. \u042f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e Dockerfile, \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0438.<\/p>\n<pre><code># \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439. # \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435, # \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f linux \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a FROM rocker\/tidyverse  # \u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f # \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043b\u043e\u0433\u0438\u043d\u043e\u0432 \u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 ARG VERY_SECRET_VARIABLE  # \u0422\u0443\u0442 \u043c\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f # \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 \u043b\u044e\u0431\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 ENV VERY_SECRET_VARIABLE=$VERY_SECRET_VARIABLE  # \u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0437\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 \u043b\u0438\u043d\u0443\u043a\u0441 # \u0417\u0434\u0435\u0441\u044c \u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e \u043f\u0430\u043a\u0435\u0442\u044b RUN R -e \"install.packages(\u0441('lgr', 'gt'))\"  # \u0415\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434, \u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e RUN # \u0417\u0434\u0435\u0441\u044c \u044f \u0441\u043e\u0437\u0434\u0430\u044e \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u043e\u0431\u0440\u0430\u0437\u0435 RUN mkdir \/home\/my_cool_r_project  # \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0445\u043e\u0441\u0442\u0430 \u0432 \u043e\u0431\u0440\u0430\u0437 # \u0422\u0443\u0442 \u044f \u043a\u043e\u043f\u0438\u0440\u0443\u044e \u043a\u043e\u0434 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 src, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0442\u043e\u0439 \u0436\u0435 \u043f\u0430\u043f\u043a\u0435, \u0447\u0442\u043e \u0438 # Dockerfile, \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u044e \u0435\u0451 \u0432 \u043e\u0431\u0440\u0430\u0437 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 COPY src \/home\/my_cool_r_project <\/code><\/pre>\n<p>\u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0437\u0434\u0435\u0441\u044c \u043a\u0430\u0441\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0439 \u0432\u0440\u043e\u0434\u0435 ENTRYPOINT \u0438 CMD. \u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u0430 &#8212; \u0441\u043e\u0437\u0434\u0430\u0442\u044c Docker \u043e\u0431\u0440\u0430\u0437 \u0441 \u043d\u0430\u0448\u0438\u043c \u043a\u043e\u0434\u043e\u043c. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0442\u044e\u0433\u0430.<\/p>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 docker build. \u0424\u043b\u0430\u0433 -t \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u0430 (my_cool_r_project). \u0422\u043e\u0447\u043a\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 &#8212; \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 \u0434\u043e\u043a\u0435\u0440\u0444\u0430\u0439\u043b\u043e\u043c (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e: \u043e\u043d \u0437\u0434\u0435\u0441\u044c \u0438 \u043b\u0435\u0436\u0438\u0442, \u0433\u0434\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f). \u0424\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f Dockerfile.<\/p>\n<pre><code class=\"bash\">docker build -t my_cool_r_project .<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u043a\u043e\u0434 \u0433\u043e\u0442\u043e\u0432 \u0438 \u0437\u0430\u043f\u0430\u043a\u043e\u0432\u0430\u043d \u0432 \u043e\u0431\u0440\u0430\u0437. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435? \u041d\u0435\u0442, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432 \u0440\u0435\u0435\u0441\u0442\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0432 \u043d\u0451\u043c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/hub.docker.com\/\">docker hub<\/a>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u0430\u043c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043b\u043e\u0433\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u0432 docker desktop (\u0430 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435).<\/p>\n<pre><code class=\"bash\">docker login docker push my_cool_r_project<\/code><\/pre>\n<p>\u0412 \u0432\u0430\u0448\u0435\u043c \u043b\u0438\u0447\u043d\u043e\u043c \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u0432 \u0434\u043e\u043a\u0435\u0440 \u0445\u0430\u0431\u0435 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437. \u0418 \u043e\u0442\u0442\u0443\u0434\u0430 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e DockerOperator \u0432 Airflow.<\/p>\n<h4>Airflow<\/h4>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Airflow \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a \u043a\u0430\u0436\u0435\u0442\u0441\u044f. \u041f\u043e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0443 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0438 DockerOperator \u0442\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041f\u043e\u0442\u043e\u043c\u0443 \u044f \u0431\u0443\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u043c docker compose \u0444\u0430\u0439\u043b\u043e\u043c \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f DockerOperator (\u0434\u0430, \u044d\u0442\u043e docker-in-docker).<\/p>\n<p>\u042f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e Airflow \u043a\u0430\u043a \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e, \u043d\u043e \u0438\u043c\u0435\u044e\u0449\u0443\u044e \u0440\u044f\u0434 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0447\u0430\u0441\u0442\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041d\u043e \u0432 \u0443\u0447\u0435\u0431\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445 \u043d\u0430\u043c \u044d\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u0440\u0430\u0437.<\/p>\n<p>\u0421\u0430\u043c\u0430 \u043f\u0430\u043f\u043a\u0430, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c, \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b97\/d6b\/1d6\/b97d6b1d673c0d38b329a9ec6926746d.png\" width=\"644\" height=\"328\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b97\/d6b\/1d6\/b97d6b1d673c0d38b329a9ec6926746d.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0430\u043f\u043a\u0443 dags \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0441\u043e\u0441\u0437\u0434\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 Dockerfile \u0438 requirements.txt. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432\u0441\u0435 python \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0442\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e <strong>apache-airflow-providers-docker<\/strong>.<\/p>\n<p>\u0422\u0435\u043a\u0441\u0442 \u0434\u043e\u043a\u0435\u0440\u0444\u0430\u0439\u043b\u0430:<\/p>\n<pre><code>FROM apache\/airflow:2.3.3  # Install Docker RUN pip install Docker  USER root ARG DOCKER_GROUP_ID  # Add permissions for running docker.sock RUN groupadd -g $DOCKER_GROUP_ID docker &amp;&amp; gpasswd -a airflow docker  USER airflow COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt <\/code><\/pre>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 airflow \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u0430\u0432 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u043a\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u043e\u043c \u043d\u0430 \u0445\u043e\u0441\u0442\u0435 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u044d\u0439\u0440\u0444\u043b\u043e\u0443 \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435.<\/p>\n<pre><code class=\"yaml\">version: '3' # \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0431\u0449\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0434\u043b\u044f \u0432\u0441\u0435\u0445 airflow-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 x-airflow-common:   &amp;airflow-common   # \u0417\u0434\u0435\u0441\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e Dockerfile   build:     context: .     args:       DOCKER_GROUP_ID: 999   environment:     &amp;airflow-common-env     AIRFLOW__CORE__EXECUTOR: CeleryExecutor     AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2:\/\/airflow:airflow@postgres\/airflow     AIRFLOW__CORE__ENABLE_XCOM_PICKLING: True     # For backward compatibility, with Airflow &lt;2.3     AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2:\/\/airflow:airflow@postgres\/airflow     AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql:\/\/airflow:airflow@postgres\/airflow     AIRFLOW__CELERY__BROKER_URL: redis:\/\/:@redis:6379\/0     AIRFLOW__CORE__FERNET_KEY: ''     AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true'     AIRFLOW__CORE__LOAD_EXAMPLES: 'false'     AIRFLOW__API__AUTH_BACKENDS: 'airflow.api.auth.backend.basic_auth'     _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-}   # \u0411\u0438\u043d\u0434\u0438\u043c \u043f\u0430\u043f\u043a\u0438 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435 \u0441 \u043f\u0430\u043f\u043a\u0430\u043c\u0438 \u0432 airflow \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445   volumes:     - .\/dags:\/opt\/airflow\/dags     - .\/logs:\/opt\/airflow\/logs     - .\/plugins:\/opt\/airflow\/plugins     # \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0438\u043d\u0430\u0447\u0435 \u0434\u043e\u043a\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u043e\u043c \u0445\u043e\u0441\u0442\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f     - \/var\/run\/docker.sock:\/var\/run\/docker.sock   user: 0:0   depends_on:     &amp;airflow-common-depends-on     redis:       condition: service_healthy     postgres:       condition: service_healthy  # \u041d\u0435 \u044d\u0439\u0440\u0444\u043b\u043e\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 services:   postgres:     image: postgres:13     environment:       POSTGRES_USER: airflow       POSTGRES_PASSWORD: airflow       POSTGRES_DB: airflow     volumes:       - postgres-db-volume:\/var\/lib\/postgresql\/data     healthcheck:       test: [\"CMD\", \"pg_isready\", \"-U\", \"airflow\"]       interval: 5s       retries: 5     restart: always    redis:     image: redis:latest     expose:       - 6379     healthcheck:       test: [\"CMD\", \"redis-cli\", \"ping\"]       interval: 5s       timeout: 30s       retries: 50     restart: always    airflow-webserver:     &lt;&lt;: *airflow-common     command: webserver     ports:       - 8080:8080     healthcheck:       test: [\"CMD\", \"curl\", \"--fail\", \"http:\/\/localhost:8080\/health\"]       interval: 10s       timeout: 10s       retries: 5     restart: always     depends_on:       &lt;&lt;: *airflow-common-depends-on       airflow-init:         condition: service_completed_successfully    airflow-scheduler:     &lt;&lt;: *airflow-common     command: scheduler     healthcheck:       test: [\"CMD-SHELL\", 'airflow jobs check --job-type SchedulerJob --hostname \"$${HOSTNAME}\"']       interval: 10s       timeout: 10s       retries: 5     restart: always     depends_on:       &lt;&lt;: *airflow-common-depends-on       airflow-init:         condition: service_completed_successfully    airflow-worker:     &lt;&lt;: *airflow-common     command: celery worker     healthcheck:       test:         - \"CMD-SHELL\"         - 'celery --app airflow.executors.celery_executor.app inspect ping -d \"celery@$${HOSTNAME}\"'       interval: 10s       timeout: 10s       retries: 5     environment:       &lt;&lt;: *airflow-common-env       # Required to handle warm shutdown of the celery workers properly       # See https:\/\/airflow.apache.org\/docs\/docker-stack\/entrypoint.html#signal-propagation       DUMB_INIT_SETSID: \"0\"     restart: always     depends_on:       &lt;&lt;: *airflow-common-depends-on       airflow-init:         condition: service_completed_successfully    airflow-triggerer:     &lt;&lt;: *airflow-common     command: triggerer     healthcheck:       test: [\"CMD-SHELL\", 'airflow jobs check --job-type TriggererJob --hostname \"$${HOSTNAME}\"']       interval: 10s       timeout: 10s       retries: 5     restart: always     depends_on:       &lt;&lt;: *airflow-common-depends-on       airflow-init:         condition: service_completed_successfully    airflow-init:     &lt;&lt;: *airflow-common     entrypoint: \/bin\/bash     # yamllint disable rule:line-length     command:       - -c       - |         function ver() {           printf \"%04d%04d%04d%04d\" $${1\/\/.\/ }         }         airflow_version=$$(AIRFLOW__LOGGING__LOGGING_LEVEL=INFO &amp;&amp; gosu airflow airflow version)         airflow_version_comparable=$$(ver $${airflow_version})         min_airflow_version=2.2.0         min_airflow_version_comparable=$$(ver $${min_airflow_version})         if (( airflow_version_comparable &lt; min_airflow_version_comparable )); then           echo           echo -e \"\\033[1;31mERROR!!!: Too old Airflow version $${airflow_version}!\\e[0m\"           echo \"The minimum Airflow version supported: $${min_airflow_version}. Only use this or higher!\"           echo           exit 1         fi         if [[ -z \"${AIRFLOW_UID}\" ]]; then           echo           echo -e \"\\033[1;33mWARNING!!!: AIRFLOW_UID not set!\\e[0m\"           echo \"If you are on Linux, you SHOULD follow the instructions below to set \"           echo \"AIRFLOW_UID environment variable, otherwise files will be owned by root.\"           echo \"For other operating systems you can get rid of the warning with manually created .env file:\"           echo \"    See: https:\/\/airflow.apache.org\/docs\/apache-airflow\/stable\/start\/docker.html#setting-the-right-airflow-user\"           echo         fi         one_meg=1048576         mem_available=$$(($$(getconf _PHYS_PAGES) * $$(getconf PAGE_SIZE) \/ one_meg))         cpus_available=$$(grep -cE 'cpu[0-9]+' \/proc\/stat)         disk_available=$$(df \/ | tail -1 | awk '{print $$4}')         warning_resources=\"false\"         if (( mem_available &lt; 4000 )) ; then           echo           echo -e \"\\033[1;33mWARNING!!!: Not enough memory available for Docker.\\e[0m\"           echo \"At least 4GB of memory required. You have $$(numfmt --to iec $$((mem_available * one_meg)))\"           echo           warning_resources=\"true\"         fi         if (( cpus_available &lt; 2 )); then           echo           echo -e \"\\033[1;33mWARNING!!!: Not enough CPUS available for Docker.\\e[0m\"           echo \"At least 2 CPUs recommended. You have $${cpus_available}\"           echo           warning_resources=\"true\"         fi         if (( disk_available &lt; one_meg * 10 )); then           echo           echo -e \"\\033[1;33mWARNING!!!: Not enough Disk space available for Docker.\\e[0m\"           echo \"At least 10 GBs recommended. You have $$(numfmt --to iec $$((disk_available * 1024 )))\"           echo           warning_resources=\"true\"         fi         if [[ $${warning_resources} == \"true\" ]]; then           echo           echo -e \"\\033[1;33mWARNING!!!: You have not enough resources to run Airflow (see above)!\\e[0m\"           echo \"Please follow the instructions to increase amount of resources available:\"           echo \"   https:\/\/airflow.apache.org\/docs\/apache-airflow\/stable\/start\/docker.html#before-you-begin\"           echo         fi         mkdir -p \/sources\/logs \/sources\/dags \/sources\/plugins         chown -R \"${AIRFLOW_UID}:0\" \/sources\/{logs,dags,plugins}         exec \/entrypoint airflow version     # yamllint enable rule:line-length     environment:       &lt;&lt;: *airflow-common-env       _AIRFLOW_DB_UPGRADE: 'true'       _AIRFLOW_WWW_USER_CREATE: 'true'       _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow}       _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow}       _PIP_ADDITIONAL_REQUIREMENTS: ''     user: 0:0     volumes:       - .:\/sources    airflow-cli:     &lt;&lt;: *airflow-common     profiles:       - debug     environment:       &lt;&lt;: *airflow-common-env       CONNECTION_CHECK_MAX_COUNT: \"0\"     # Workaround for entrypoint issue. See: https:\/\/github.com\/apache\/airflow\/issues\/16252     command:       - bash       - -c       - airflow    flower:     &lt;&lt;: *airflow-common     command: celery flower     profiles:       - flower     ports:       - 5555:5555     healthcheck:       test: [\"CMD\", \"curl\", \"--fail\", \"http:\/\/localhost:5555\/\"]       interval: 10s       timeout: 10s       retries: 5     restart: always     depends_on:       &lt;&lt;: *airflow-common-depends-on       airflow-init:         condition: service_completed_successfully  volumes:   postgres-db-volume: <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043d\u0430\u0448 DAG (\u0434\u0430\u043b\u0435\u0435 \u044f \u0431\u0443\u0434\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u0414\u0410\u0413), \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0437\u0430\u0434\u0430\u0447 airflow, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 R. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0435\u0440 \u0445\u0430\u0431\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 R \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 \u043d\u0451\u043c \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443.<\/p>\n<p><code>dags\/my_cool_r_dag.py<\/code><\/p>\n<pre><code class=\"python\">from airflow.models import DAG from airflow.providers.docker.operators.docker import DockerOperator from datetime import datetime   with DAG( # \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0414\u0410\u0413\u0430     dag_id='cool_r_dag',     # \u0414\u0430\u0442\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0414\u0410\u0413\u0430     start_date=datetime(2023, 2, 21),     # \u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0414\u0410\u0413     # \u0412 10 \u043c\u0438\u043d\u0443\u0442 \u0440\u0430\u0437 \u0432 2 \u0447\u0430\u0441\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0442\u043e\u0440\u043d\u0438\u043a     schedule_interval='10 *\/2 * * 2' ) as dag:      task = DockerOperator(     # \u041f\u0443\u0442\u044c \u043a \u0434\u043e\u043a\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0443         docker_url='unix:\/\/var\/run\/docker.sock',         api_version='auto',         # \u041a\u043e\u043c\u0430\u043d\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435         command='''R -e print\\('\"Hello, world!\"'\\)''',         # \u041e\u0431\u0440\u0430\u0437, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440         image='arm64v8\/r-base',         # \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0434\u0430\u0447\u0438 (\u0414\u0410\u0413\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447)         task_id='hello',         # \u0410\u0432\u0442\u043e\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f         auto_remove=True,         # \u0412 \u043a\u0430\u043a\u043e\u043c \u0434\u0430\u0433\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430         dag=dag,         # \u0417\u0430\u043f\u0440\u0435\u0442 \u043d\u0430 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043f\u043e\u043a \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0438 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435         mount_tmp_dir=False     ) <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<pre><code class=\"bash\">docker compose build docker compose up -d<\/code><\/pre>\n<p>\u041f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 localhost:8080 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d web UI airflow (\u043b\u043e\u0433\u0438\u043d\/\u043f\u0430\u0440\u043e\u043b\u044c: airflow\/airflow). \u041f\u043e\u0441\u043b\u0435 \u043b\u043e\u0433\u0438\u043d\u0430 \u0442\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/727\/1e2\/233\/7271e2233827c851fd51466e3e0243be.png\" width=\"3418\" height=\"334\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/727\/1e2\/233\/7271e2233827c851fd51466e3e0243be.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0414\u0410\u0413 \u0442\u0443\u043c\u0431\u043b\u0435\u0440\u043e\u043c \u0441\u043b\u0435\u0432\u0430 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 play \u0441\u043f\u0440\u0430\u0432\u0430 (\u0442\u0430\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Trigger DAG). \u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0414\u0410\u0413\u0430, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b Graph, \u0442\u0430\u043c \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u0431\u043e\u043a\u0441 \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 (hello) \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0432\u0435\u0440\u0445\u0443 \u0440\u0430\u0437\u0434\u0435\u043b Log. \u0422\u0430\u043c \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cf9\/6eb\/a8f\/cf96eba8fcb767c9bca0dace205f8d32.png\" width=\"3354\" height=\"1684\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cf9\/6eb\/a8f\/cf96eba8fcb767c9bca0dace205f8d32.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 R \u043a\u043e\u0434 \u0432 airflow. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u0432\u043e\u0438 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u043f\u0438\u0442\u043e\u043d.<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u042d\u0442\u043e \u043f\u0440\u044f\u043c\u043e \u043e\u0431\u0437\u043e\u0440\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u043d\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e. \u0412 \u043d\u0435\u0439 \u044f \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043a\u043e\u0434\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e. \u041f\u0440\u0430\u0432\u0434\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u044d\u0442\u0430\u043f\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430 (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u0435\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0437\u0432\u0435\u043d\u043e\u043c \u0432 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435), \u0435\u0433\u043e \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438. \u0418\u0442\u0430\u043a, \u044d\u0442\u0430\u043f\u044b:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 R \u043a\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p>\u0423\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0435\u0433\u043e \u0432 docker-\u043e\u0431\u0440\u0430\u0437 <\/p>\n<ol>\n<li>\n<p>\u041f\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/\">gitlab CI\/CD<\/a>. \u041c\u043d\u043e\u0433\u0438\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u0445\u0440\u0430\u043d\u044f\u0442 \u043a\u043e\u0434 \u0432 \u0433\u0438\u0442\u043b\u0430\u0431\u0435, \u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u043c \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u043c. \u0421\u0430\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0430 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 docker build -> docker push. \u0425\u043e\u0442\u044f \u0441\u0442\u043e\u0438\u0442 \u0435\u0449\u0451 \u0442\u0435\u0441\u0442\u044b \u043d\u0430\u043a\u0438\u043d\u0443\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0438\u0442\u043b\u0430\u0431\u043e\u0432\u0441\u043a\u0438\u0439 \u0436\u0435 container registry. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0432 airflow, \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0432 connections \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 container registry \u0438 \u0432 \u043a\u043e\u0434\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 (DockerOperator) \u0414\u0410\u0413\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u043d\u0435\u0439\u0442\u0435\u043d\u0435\u0440\u0430 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u0441 \u043b\u044e\u0431\u043e\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439.<\/p>\n<\/li>\n<\/ol>\n<p>\u042f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043a\u0430\u0437\u0430\u043b \u043f\u0440\u043e airflow \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u043f\u0443\u043d\u043a\u0442\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 docker \u043e\u0431\u0440\u0430\u0437 R \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n<p>\u0415\u0449\u044d \u043d\u0435 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e. \u0423 \u043c\u0435\u043d\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430 GitLab CI\/CD (self-hosted) \u0438 Airflow. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0447\u0442\u043e\u0431\u044b \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443 \u043e\u0442\u0447\u0451\u0442\u0430 \u0438\u043b\u0438 \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u0442\u044c \u0431\u0430\u0433 \u043c\u043d\u0435 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0440\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:<\/p>\n<ol>\n<li>\n<p>\u0412\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u0435\u0442\u043a\u0443 \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 gitlab.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0440\u0435\u0432\u044c\u044e (\u0435\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e) \u0438 \u0441\u043c\u0451\u0440\u0434\u0436\u0438\u0442\u044c \u0432\u0435\u0442\u043a\u0443 \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0439 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0442\u0435\u0433\u043e\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0430 Airflow \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0414\u0410\u0413\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0435\u0433\u043e, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u0438\u0442 \u0432\u0441\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434, \u0430 \u043c\u043d\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432:<\/p>\n<ol>\n<li>\n<p>\u041a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0434\u043e\u043a\u0435\u0440 \u0434\u0435\u043c\u043e\u043d (\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430).<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c &#171;\u043a\u043d\u043e\u043f\u043e\u0447\u043a\u043e\u0439&#187;.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u0434 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f, \u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0432\u0435\u0431 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 (\u0430 \u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0451 \u0438 \u0430\u043b\u0451\u0440\u0442\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c).<\/p>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438 \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c CI\/CD, \u0442\u043e \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u043b\u0435\u0433\u043a\u043e \u0438 \u043d\u0435 \u043d\u0430\u0434\u043e \u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443 \u0438 \u0432\u044b \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b \u043a \u044f\u0437\u044b\u043a\u0443, \u043f\u0438\u0448\u0438\u0442\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0432\u0430\u043c \u0438 \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0438 \u043d\u0430 \u0442\u0435\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0451 \u0436\u0435 \u0434\u0443\u043c\u0430\u044e\u0442, \u0447\u0442\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 ETL\/ELT \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 Python, \u0442\u043e \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043d\u0430 \u043d\u0451\u043c, \u0430 R \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0431\u0440\u043e\u0441\u0438\u0442\u044c. \u042f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430\u043c\u0438 \u043e\u0431\u043e\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u0418 \u043a\u0430\u043a \u0440\u0430\u0437 30 \u043c\u0430\u0440\u0442\u0430 \u0432 OTUS \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u043c\u043e\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0410\u043d\u0430\u043b\u0438\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 R. \u0422\u0430\u043c \u0432\u044b \u043d\u0430\u0443\u0447\u0438\u0442\u0435\u0441\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u043c, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0438 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u043c \u043f\u0440\u0438\u0451\u043c\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0447\u0443 \u043f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c \u0432\u0430\u0441 \u043d\u0430 <a href=\"https:\/\/otus.pw\/slzN\/\">\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0443\u0440\u043e\u043a<\/a>, \u0433\u0434\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437 \u043b\u044e\u0431\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0432 \u0441\u0435\u0442\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 httr2. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u043e \u0441\u0435\u0442\u0438.  \u0415\u0449\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432.<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/otus.pw\/slzN\/\">\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0432\u0435\u0431\u0438\u043d\u0430\u0440<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/718400\/\"> https:\/\/habr.com\/ru\/company\/otus\/blog\/718400\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<div class=\"persona\" persona=\"true\">\n<h5 class=\"persona__heading\" persona=\"true\">\u0410\u0432\u0442\u043e\u0440 \u0441\u0442\u0430\u0442\u044c\u0438: \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0412\u043e\u043b\u043e\u0434\u0438\u043d<\/h5>\n<p>Analytics Engineer \u0432 Trafficstars<\/p>\n<\/div>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0412\u043e\u043b\u043e\u0434\u0438\u043d, \u044f Analytics Engineer \u0432 Trafficstars. \u041a\u043e\u0433\u0434\u0430-\u0442\u043e \u044f, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435, \u0431\u044b\u043b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 R \u0438 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043e\u0441\u0442\u0440\u043e \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e. \u0415\u0449\u0451 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u0442\u043a\u0443\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e. \u0410 \u0443\u0436 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c &#171;\u043a\u043d\u043e\u043f\u043e\u0447\u043a\u043e\u0439 play&#187; \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0447\u0442\u043e\u0439.<\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u0430 \u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 R). \u0422\u0430\u043a\u0436\u0435 \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0438 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430\u043c. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043f\u043b\u043e\u0445\u043e \u0441 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0449\u0438\u043a\u0430\u043c\u0438 (\u0438\u043b\u0438 \u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0442 \u0443 \u0432\u0430\u0441 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438). \u042f \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442, \u043d\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c.<\/p>\n<h3>\u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043f\u0440\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442 cron. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u0438 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c \u0432\u043b\u0438\u044f\u043d\u0438\u0435\u043c. \u041d\u043e \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u0433\u0438\u0431\u043a\u0438\u0439, \u043a\u0430\u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b.<\/p>\n<p><em>Cron &#8212; \u0443\u0442\u0438\u043b\u0438\u0442\u0430 linux \u0438 macos, Windows \u0438 \u0435\u0433\u043e Task Scheduler \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0443 \u043d\u0438\u0445 \u0441 \u043a\u0440\u043e\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0435 \u0436\u0435 \u0431\u043e\u043b\u044f\u0447\u043a\u0438 \u0438 \u043d\u0435\u0434\u043e\u0431\u0441\u0442\u0432\u0430 (\u0438 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442 \u0441 \u043d\u0438\u043c \u043e\u043f\u044b\u0442\u0430). \u0412 R \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 taskscheduleR, \u0442\u0430\u043c \u0438 add-in \u0434\u043b\u044f RStudio \u0435\u0441\u0442\u044c.<\/em><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b (\u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>crontab -e<\/code>), \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u0443 \u0432\u0430\u0441 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443 (\u0447\u0430\u0441\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b):<\/p>\n<pre><code class=\"bash\">m h  dom mon dow   command<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a cron-\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u043d\u0430\u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p><strong>m<\/strong> &#8212; \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043c\u0438\u043d\u0443\u0442\u0435 (\u043e\u0442 0 \u0434\u043e 59)<\/p>\n<\/li>\n<li>\n<p><strong>h<\/strong> &#8212; \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0430\u0441 (\u043e\u0442 0 \u0434\u043e 23)<\/p>\n<\/li>\n<li>\n<p><strong>dom<\/strong> &#8212; \u0432 \u043a\u0430\u043a\u043e\u0439 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443 (1-31) \u0434\u0435\u043d\u044c \u043c\u0435\u0441\u044f\u0446\u0430<\/p>\n<\/li>\n<li>\n<p><strong>mon<\/strong> &#8212; \u0432 \u043a\u0430\u043a\u043e\u0439 \u043c\u0435\u0441\u044f\u0446 (1-12)<\/p>\n<\/li>\n<li>\n<p><strong>dow<\/strong> &#8212; \u0432 \u043a\u0430\u043a\u043e\u0439 \u0434\u0435\u043d\u044c \u043d\u0435\u0434\u0435\u043b\u0438 (0-6, \u0433\u0434\u0435 0 &#8212; \u044d\u0442\u043e \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435).<\/p>\n<\/li>\n<li>\n<p>\u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u0430\u0448\u0430 <strong>command<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u043b\u0430, \u043d\u043e \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b:<\/p>\n<ul>\n<li>\n<p>\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443 \u0438\u043b\u0438 \u043c\u0435\u0441\u044f\u0446)    <\/p>\n<\/li>\n<li>\n<p>n-m &#8212; \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0442 n \u0434\u043e m (\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\/k &#8212; \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0448\u0430\u0433 (\u043a\u0430\u0436\u0434\u044b\u0439 k-\u044b\u0439 \u0434\u0435\u043d\u044c \u043c\u0435\u0441\u044f\u0446\u0430)<\/p>\n<\/li>\n<li>\n<p>\u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u043b\u0438 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f dom \u0438 dow, \u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445. \u0422\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c <code>30 11 1 * 0<\/code> \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c &#171;\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 11:30 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0441\u044f\u0446 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0438\u043b\u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435&#187;. \u0412\u044b\u0445\u043e\u0434\u0438\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u0438\u043b\u0438, \u0430 \u043d\u0435 \u043a\u0430\u043a \u0438 (\u043d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b). \u0412\u043e\u043e\u0431\u0449\u0435 \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 <a href=\"https:\/\/crontab.guru\/\">\u0441\u0430\u0439\u0442<\/a> \u0432 \u043f\u043e\u043c\u043e\u0449\u044c, \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 cron \u0432 R \u0435\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442 cronR, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0442\u0430\u043a \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438\u0441\u044f. \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0438 add-in \u0434\u043b\u044f RStudio<\/p>\n<h3>\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 cron<\/h3>\n<p>Cron &#8212; \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043d\u043e \u043b\u0438\u0448\u0451\u043d \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0430\u043b\u0451\u0440\u0442\u0438\u043d\u0433 \u043d\u0435 \u0442\u0430\u043a \u043b\u0435\u0433\u043a\u043e \u0441\u044e\u0434\u0430 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c. \u041b\u043e\u0433\u0438 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 ELK \u0441\u0442\u0435\u043a). \u0422\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435. \u0418 \u0435\u0441\u043b\u0438 \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u043e \u0438 \u0432\u0430\u0448\u0435 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0436\u0435. \u0418 \u0435\u0449\u0451 \u043d\u0430 \u043c\u043d\u043e\u0433\u043e \u0432\u0435\u0441\u0451\u043b\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u0442\u044c\u0441\u044f (\u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0443\u0442\u0438).<\/p>\n<p>\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 cron \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432 \u0432\u0438\u0434\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442, \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/pipelines\/schedules.html\">scheduled pipelines \u0432 Gitlab<\/a>, <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/cron-jobs\/\">cronjob \u0432 Kubernetes<\/a>, <a href=\"https:\/\/airflow.apache.org\/\">Airflow<\/a>. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0439 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0434\u043b\u044f ETL \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 (\u0438 \u0434\u0430\u0442\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0445) \u0437\u0430\u0434\u0430\u0447. \u0415\u0433\u043e \u044f \u0434\u0430\u043b\u0435\u0435 \u0438 \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c. \u0425\u043e\u0442\u044f \u0438\u0441\u043a\u0443\u0448\u0451\u043d\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438 \u0443\u0434\u0438\u0432\u0438\u0442\u044c\u0441\u044f, \u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u043e \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0432\u043e\u0430\u043d\u0438\u044f, \u0442\u043e \u0432 Airflow \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e Python \u043a\u043e\u0434, \u043d\u043e \u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0451\u0439 \u044d\u0442\u043e \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0432\u0435\u043d\u0447\u0430\u044e.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0437\u043d\u0430\u043d\u0438\u044f R \u0432\u0430\u043c \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f Docker. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438\u0437 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u0442\u0430\u043a \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u043e (\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043a \u043d\u0435\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0441\u0442\u044b\u0434\u043d\u043e). \u0422\u0430\u043a\u0436\u0435 \u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 git).<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Docker desktop. \u0418 \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435 \u0438\u043c\u0435\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u043d\u0430 \u043b\u0438\u043d\u0443\u043a\u0441. \u0411\u043b\u0430\u0433\u043e \u0441 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u044d\u0442\u043e \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e. \u0410 \u043c\u043e\u0436\u043d\u043e \u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0443 \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433 \u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u0430. \u041f\u043e\u0442\u043e\u043c \u0432\u0430\u0448\u0438 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0430 \u043f\u0440\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u043b\u044c\u0441\u044b.<br \/> <a href=\"https:\/\/docs.docker.com\/get-docker\/\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 Docker desktop<\/a>.<br \/> <a href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/cli\/\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 docker<\/a><br \/> <a href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Dockerfile<\/a><br \/> <a href=\"https:\/\/docs.docker.com\/compose\/compose-file\/\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e docker-compose \u0444\u0430\u0439\u043b\u0443<\/a><\/p>\n<h3>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u0441\u0442\u0430\u0442\u044c\u0438 &#8212; \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u0434\u0430 \u0433\u0434\u0435 \u0438 \u043a\u043e\u0433\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e. \u0418 \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043a\u0430\u0436\u0443\u0442, \u043d\u0443 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0436\u0435 \u0432\u0441\u0451, \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u0434 \u0432 Docker \u043e\u0431\u0440\u0430\u0437, \u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0442\u0430\u043a \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e.<\/p>\n<p>\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043f\u0440\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b. \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0439\u0442\u0435 \u0438\u0445 \u043a\u0430\u043a \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0445\u043e\u0441\u0442\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b. \u042d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0437\u0430\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 (rocker\/tidyverse), \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0430 \u043b\u0438\u043d\u0443\u043a\u0441 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c R \u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u043c tidyverse. \u0412 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043d\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435), \u043f\u043e\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u043f\u0440\u044f\u043c\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430.<\/p>\n<pre><code class=\"bash\">docker run rocker\/tidyverse R -e print\\('\"Hello, world!\"'\\)<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0430 <code>rocker\/tidyverse<\/code>, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0438 \u0435\u0433\u043e \u0438 \u0432 \u043d\u0451\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 R <code>-e print('\"Hello, world!\"')<\/code>. \u0414\u0443\u043c\u0430\u044e, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0443\u0434\u0430 \u044f \u043a\u043b\u043e\u043d\u044e: \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0437, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0437 &#8212; \u044d\u0442\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0442\u043e Dockerfile &#8212; \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043e\u0431\u0440\u0430\u0437\u0430. \u0415\u0433\u043e-\u0442\u043e \u0438 \u043d\u0430\u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u0439 \u043f\u0430\u043f\u043a\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c. \u042f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e Dockerfile, \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0438.<\/p>\n<pre><code># \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439. # \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435, # \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f linux \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a FROM rocker\/tidyverse  # \u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f # \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043b\u043e\u0433\u0438\u043d\u043e\u0432 \u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 ARG VERY_SECRET_VARIABLE  # \u0422\u0443\u0442 \u043c\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f # \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 \u043b\u044e\u0431\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 ENV VERY_SECRET_VARIABLE=$VERY_SECRET_VARIABLE  # \u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0437\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 \u043b\u0438\u043d\u0443\u043a\u0441 # \u0417\u0434\u0435\u0441\u044c \u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e \u043f\u0430\u043a\u0435\u0442\u044b RUN R -e \"install.packages(\u0441('lgr', 'gt'))\"  # \u0415\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434, \u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e RUN # \u0417\u0434\u0435\u0441\u044c \u044f \u0441\u043e\u0437\u0434\u0430\u044e \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u043e\u0431\u0440\u0430\u0437\u0435 RUN mkdir \/home\/my_cool_r_project  # \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0445\u043e\u0441\u0442\u0430 \u0432 \u043e\u0431\u0440\u0430\u0437 # \u0422\u0443\u0442 \u044f \u043a\u043e\u043f\u0438\u0440\u0443\u044e \u043a\u043e\u0434 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 src, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0442\u043e\u0439 \u0436\u0435 \u043f\u0430\u043f\u043a\u0435, \u0447\u0442\u043e \u0438 # Dockerfile, \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u044e \u0435\u0451 \u0432 \u043e\u0431\u0440\u0430\u0437 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 COPY src \/home\/my_cool_r_project <\/code><\/pre>\n<p>\u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0437\u0434\u0435\u0441\u044c \u043a\u0430\u0441\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0439 \u0432\u0440\u043e\u0434\u0435 ENTRYPOINT \u0438 CMD. \u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u0430 &#8212; \u0441\u043e\u0437\u0434\u0430\u0442\u044c Docker \u043e\u0431\u0440\u0430\u0437 \u0441 \u043d\u0430\u0448\u0438\u043c \u043a\u043e\u0434\u043e\u043c. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0442\u044e\u0433\u0430.<\/p>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 docker build. \u0424\u043b\u0430\u0433 -t \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u0430 (my_cool_r_project). \u0422\u043e\u0447\u043a\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 &#8212; \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 \u0434\u043e\u043a\u0435\u0440\u0444\u0430\u0439\u043b\u043e\u043c (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e: \u043e\u043d \u0437\u0434\u0435\u0441\u044c \u0438 \u043b\u0435\u0436\u0438\u0442, \u0433\u0434\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f). \u0424\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f Dockerfile.<\/p>\n<pre><code class=\"bash\">docker build -t my_cool_r_project .<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u043a\u043e\u0434 \u0433\u043e\u0442\u043e\u0432 \u0438 \u0437\u0430\u043f\u0430\u043a\u043e\u0432\u0430\u043d \u0432 \u043e\u0431\u0440\u0430\u0437. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435? \u041d\u0435\u0442, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432 \u0440\u0435\u0435\u0441\u0442\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0432 \u043d\u0451\u043c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/hub.docker.com\/\">docker hub<\/a>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u0430\u043c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043b\u043e\u0433\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u0432 docker desktop (\u0430 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435).<\/p>\n<pre><code class=\"bash\">docker login docker push my_cool_r_project<\/code><\/pre>\n<p>\u0412 \u0432\u0430\u0448\u0435\u043c \u043b\u0438\u0447\u043d\u043e\u043c \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u0432 \u0434\u043e\u043a\u0435\u0440 \u0445\u0430\u0431\u0435 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437. \u0418 \u043e\u0442\u0442\u0443\u0434\u0430 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e DockerOperator \u0432 Airflow.<\/p>\n<h4>Airflow<\/h4>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Airflow \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a \u043a\u0430\u0436\u0435\u0442\u0441\u044f. \u041f\u043e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0443 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0438 DockerOperator \u0442\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041f\u043e\u0442\u043e\u043c\u0443 \u044f \u0431\u0443\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u043c docker compose \u0444\u0430\u0439\u043b\u043e\u043c \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f DockerOperator (\u0434\u0430, \u044d\u0442\u043e docker-in-docker).<\/p>\n<p>\u042f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e Airflow \u043a\u0430\u043a \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e, \u043d\u043e \u0438\u043c\u0435\u044e\u0449\u0443\u044e \u0440\u044f\u0434 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0447\u0430\u0441\u0442\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041d\u043e \u0432 \u0443\u0447\u0435\u0431\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445 \u043d\u0430\u043c \u044d\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u0440\u0430\u0437.<\/p>\n<p>\u0421\u0430\u043c\u0430 \u043f\u0430\u043f\u043a\u0430, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c, \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0430\u043f\u043a\u0443 dags \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0441\u043e\u0441\u0437\u0434\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 Dockerfile \u0438 requirements.txt. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432\u0441\u0435 python \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0442\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e <strong>apache-airflow-providers-docker<\/strong>.<\/p>\n<p>\u0422\u0435\u043a\u0441\u0442 \u0434\u043e\u043a\u0435\u0440\u0444\u0430\u0439\u043b\u0430:<\/p>\n<pre><code>FROM apache\/airflow:2.3.3  # Install Docker RUN pip install Docker  USER root ARG DOCKER_GROUP_ID  # Add permissions for running docker.sock RUN groupadd -g $DOCKER_GROUP_ID docker &amp;&amp; gpasswd -a airflow docker  USER airflow COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt <\/code><\/pre>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 airflow \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u0430\u0432 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u043a\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u043e\u043c \u043d\u0430 \u0445\u043e\u0441\u0442\u0435 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u044d\u0439\u0440\u0444\u043b\u043e\u0443 \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435.<\/p>\n<pre><code class=\"yaml\">version: '3' # \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0431\u0449\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0434\u043b\u044f \u0432\u0441\u0435\u0445 airflow-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 x-airflow-common:   &amp;airflow-common   # \u0417\u0434\u0435\u0441\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e Dockerfile   build:     context: .     args:       DOCKER_GROUP_ID: 999   environment:     &amp;airflow-common-env     AIRFLOW__CORE__EXECUTOR: CeleryExecutor     AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2:\/\/airflow:airflow@postgres\/airflow     AIRFLOW__CORE__ENABLE_XCOM_PICKLING: True     # For backward compatibility, with Airflow &lt;2.3     AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2:\/\/airflow:airflow@postgres\/airflow     AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql:\/\/airflow:airflow@postgres\/airflow     AIRFLOW__CELERY__BROKER_URL: redis:\/\/:@redis:6379\/0     AIRFLOW__CORE__FERNET_KEY: ''<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-345767","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/345767","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=345767"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/345767\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=345767"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=345767"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=345767"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}