{"id":339635,"date":"2022-10-13T09:00:37","date_gmt":"2022-10-13T09:00:37","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=339635"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=339635","title":{"rendered":"<span>JupyterHub \u0438\u043b\u0438 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u0431\u043e\u044f\u0442\u044c\u0441\u044f pip install<\/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<h3>\u2026\u0438\u043b\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e self service \u043d\u0430 JupyterHub \u0434\u043b\u044f \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u043e\u0432<\/h3>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/aad\/de0\/ee9\/aadde0ee9211ea00e8ad64007de6595d.jpg\" width=\"780\" height=\"440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aad\/de0\/ee9\/aadde0ee9211ea00e8ad64007de6595d.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0438 \u043d\u0430 \u043d\u0430\u0448 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u0432 \u0432\u0438\u0434\u0435 JupyterHub, \u0438 \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0443\u0434\u043e\u0431\u043d\u044b\u043c. \u0423 \u043d\u0430\u0441 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 ~20 \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u043e\u0432 \u0438 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e Open Source-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432: Airflow, Hadoop, Hive, Spark \u0438 \u0442.\u0434.\u00a0\u041d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e JupyterHub, \u0442\u043e\u0447\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u043e \u0431\u043e\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0438 \u043a\u0430\u043a \u043c\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0435\u0435 \u043f\u043e\u0431\u043e\u0440\u043e\u043b\u0438.<\/p>\n<h2>\u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 JupyterHub<\/h2>\n<p><a href=\"https:\/\/jupyter.org\/hub\">JupyterHub<\/a> \u2014 \u044d\u0442\u043e \u0442\u043e\u0442 \u0436\u0435 Jupyter, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u043e\u043d \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. <\/p>\n<p>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0442\u0443\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b:<\/p>\n<ul>\n<li>\n<p>\u0412\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 Jupyter\u2019\u0430 \u0438 \u0435\u0433\u043e      \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0442\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0448\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435\u0445      \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u041f\u043e \u0441\u0443\u0442\u0438 \u043a\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u2013 \u0442\u043e\u0433\u043e \u0438 \u0442\u0430\u043f\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u041e\u0434\u043d\u0430 \u0441\u0440\u0435\u0434\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445: \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f      \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c \u041f\u041e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. <\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0431\u043e\u043b\u044c. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u041f\u041e \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e <strong>\u0432\u0441\u0435\u043c\u0438<\/strong> \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 JupyterHub\u2019\u0430.    <\/p>\n<\/li>\n<\/ul>\n<p><em>\u041f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043d\u0430 \u0432\u0430\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u043d\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430. \u0410 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0431\u044e\u0440\u043e\u043a\u0440\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u041f\u041e \u0431\u0443\u0434\u0435\u0442 \u0441\u044a\u0435\u0434\u0430\u0442\u044c \u0432\u0441\u0451 \u0432\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f.<\/em><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/247\/9d5\/d8a\/2479d5d8a658f6b807ab275678a8781c.png\" width=\"548\" height=\"432\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/247\/9d5\/d8a\/2479d5d8a658f6b807ab275678a8781c.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0412 \u0438\u0433\u0440\u0443 \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 Kernel <\/h2>\n<p>\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e kernel\u2019\u043e\u0432 \u2014 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0440\u0435\u0434 (venv). \u0412\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0435 \u0432 \u043d\u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435 \u0438\u0445 \u043d\u0430 JupyterHub, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u043e\u0435 \u044f\u0434\u0440\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043b\u044d\u043f\u0442\u043e\u043f\u0430. \u0410 \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043b\u044d\u043f\u0442\u043e\u043f\u0435, \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>\u041d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e kernel\u2019\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0435\u0449\u0435 \u0431\u043e\u0301\u043b\u044c\u0448\u0435\u0439 \u0431\u0435\u0434\u043e\u0439: \u0438\u0445 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c, \u043f\u043b\u044e\u0441 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043e\u043d\u0438 \u043e\u0431\u0440\u0430\u0441\u0442\u0430\u043b\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 legacy-\u043a\u043e\u0434\u043e\u043c. \u0410 \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 kernel\u2019\u044b \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u043d\u0435\u0433\u0430\u0442\u0438\u0432 \u0441\u043e \u0432\u0441\u0435\u0445 \u0441\u0442\u043e\u0440\u043e\u043d: \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u044b \u043d\u0435 \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u041f\u041e. \u0410 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0434\u043e\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c. \u0422\u0430\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043c\u044b \u043d\u0435 \u043c\u043e\u0433\u043b\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u043e\u0432.<\/p>\n<h2>\u0427\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 <\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u043e\u0432 (\u0438 \u0430\u0434\u043c\u0438\u043d\u043e\u0432) \u043e\u0442 \u0431\u043e\u043b\u0438, \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0446\u0435\u043b\u0438:\u00a0<\/p>\n<ol>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\/\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u041f\u041e \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\/\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u041f\u041e \u043c\u043e\u0436\u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u041f\u041e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u041f\u041e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u0446\u0435\u043b\u043e\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043a\u0443 Jupyterhub + Docker, \u0430 kernel\u2019\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0432 GitLab CICD, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0442\u0435\u043c\u00a0\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Jupyterhub.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/d7f\/759\/99f\/d7f75999f5bfe35327769daab661d14f.jpg\" width=\"762\" height=\"145\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d7f\/759\/99f\/d7f75999f5bfe35327769daab661d14f.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<details class=\"spoiler\">\n<summary>\u0421\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 GitLab \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0438, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 kernel, \u043e\u043d:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0432 \u0441\u0432\u043e\u0435\u0439 \u043f\u0430\u043f\u043a\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 (\u043f\u0430\u043f\u043a\u0443);<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0444\u0430\u0439\u043b requirements.json \u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 \u043d\u0435\u043c:<\/p>\n<p>2.1 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 kernel\u2019\u0430<\/p>\n<p>2.2 \u0418\u043c\u044f docker-\u043e\u0431\u0440\u0430\u0437\u0430 (\u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 DockerHub\u2019\u0430, \u043b\u0438\u0431\u043e \u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043d\u0430\u0448\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b).<\/p>\n<p>2.3 Python-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 Dockerfile;<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 CICD-\u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c:<\/p>\n<p>4.1 \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u044f\u0434\u0440\u043e;<\/p>\n<p>4.2 \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u0437 Dockerfile.<\/p>\n<p>4.3 \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0437 requirements.json.<\/p>\n<p>4.4 \u042f\u0434\u0440\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 JupyterHub.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3b3\/3ee\/d7e\/3b33eed7e572888de74cc312b83fc837.png\" width=\"1381\" height=\"320\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3b3\/3ee\/d7e\/3b33eed7e572888de74cc312b83fc837.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u043e\u0432\u043e\u0435 \u044f\u0434\u0440\u043e \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 JupyterHub\u2019\u0435. \u0410 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0432\u043e\u0435\u0433\u043e \u044f\u0434\u0440\u0430 \u0438 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0435\u0433\u043e.<\/p>\n<\/div>\n<\/details>\n<h2>\u0427\u0442\u043e \u044d\u0442\u043e \u043d\u0430\u043c \u0434\u0430\u043b\u043e<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u0430\u043c\u0438 \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u041f\u043e\u0441\u043b\u0435 10 \u0442\u044b\u0441\u044f\u0447 \u0441\u0431\u043e\u0440\u043e\u043a kernel\u2019\u043e\u0432 \u043c\u044b \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u0445 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0439 \u0438 \u0441\u0430\u043c\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435. <\/p>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043e\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c, \u0430 \u0430\u0434\u043c\u0438\u043d\u044b \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u0434\u043a\u043e \u2014\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432. \u0426\u0435\u043b\u0438 1 \u0438 2 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b.<\/p>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u043e\u043a\u0441\u0438-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e pip. \u0412\u0441\u0435 \u041f\u041e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0427\u0442\u043e \u0431\u044b \u0442\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u2014 \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0422\u0430\u043a \u043c\u044b \u0437\u0430\u043a\u0440\u044b\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0446\u0435\u043b\u044f\u043c\u0438 3 \u0438 4.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0430\u0440\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u044f\u0434\u0440\u0430<\/h2>\n<details class=\"spoiler\">\n<summary>kernel.json<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>{   \"argv\": [     \"\/usr\/bin\/docker\",     \"run\",     \"--network=host\",     \"--rm\",     \"-v\",     \"{connection_file}:\/connection-spec\",     \"-v\",     \"\/home\/anikishin\/work:\/root\/work\",     \"************\/docker\/registry\/anikishin_dataflow:latest\",     \"python\",     \"-m\",     \"ipykernel_launcher\",     \"-f\",     \"\/connection-spec\"   ],   \"display_name\": \"anikishin_dataflow\",   \"language\": \"python\",   \"env\": {} }<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 &#8212;network=host \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b pyspark \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Hadoop \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043b\u0438\u0435\u043d\u0442\u0443.\u00a0<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0431\u043e\u0440\u043a\u0438 \u044f\u0434\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>$ LOGIN=`echo \"${GITLAB_USER_LOGIN}\" | awk '{print tolower($0)}'`  $ echo -e \"export PATH_TO_KERNEL=\/${LOGIN}\/${KERNEL}\\nLOGIN=${LOGIN}\\nKERNEL=${KERNEL}\" >.env  $ source .\/.env  $ PYTHON_VERSION=`\/bin\/python3 ${CI_PROJECT_DIR}\/parser.py ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/requirements.json python_version`  $ sed \"s\/PYTHON_VERSION\/${PYTHON_VERSION}\/g\" ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/Dockerfile  FROM python:3.8-slim  WORKDIR \/root\/work  COPY requirements.txt \/tmp\/requirements.txt  RUN  pip install --upgrade -r \/tmp\/requirements.txt$ sed -i \"s\/PYTHON_VERSION\/${PYTHON_VERSION}\/g\" ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/Dockerfile  $ \/bin\/python3 ${CI_PROJECT_DIR}\/parser.py ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/requirements.json libs > ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/requirements.txt  $ echo \"IMAGE_NAME=`\/bin\/python3 ${CI_PROJECT_DIR}\/parser.py ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/requirements.json image_name`\" >> .\/.env  $ echo \"IMAGE_VERSION=`\/bin\/python3 ${CI_PROJECT_DIR}\/parser.py ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/requirements.json image_version`\" >> .\/.env  $ source .\/.env  $ docker build --no-cache -t ************:5005\/docker\/registry\/${LOGIN}_${IMAGE_NAME}:${IMAGE_VERSION} ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/  Step 1\/4 : FROM python:3.8-slim  3.8-slim: Pulling from library\/python  42c077c10790: Already exists  f63e77b7563a: Pulling fs layer  5215613c2da8: Pulling fs layer  9ca2d4523a14: Pulling fs layer  e97cee5830c4: Pulling fs layer  e97cee5830c4: Waiting  9ca2d4523a14: Verifying Checksum  9ca2d4523a14: Download complete  f63e77b7563a: Verifying Checksum  f63e77b7563a: Download complete  5215613c2da8: Verifying Checksum  5215613c2da8: Download complete  f63e77b7563a: Pull complete  5215613c2da8: Pull complete  9ca2d4523a14: Pull complete  e97cee5830c4: Verifying Checksum  e97cee5830c4: Download complete  e97cee5830c4: Pull complete  Digest: sha256:0e07cc072353e6b10de910d8acffa020a42467112ae6610aa90d6a3c56a74911  Status: Downloaded newer image for python:3.8-slim   ---> 61c56c60bb49  Step 2\/4 : WORKDIR \/root\/work   ---> Running in 4baf6a21fb37  Removing intermediate container 4baf6a21fb37   ---> 0f5165f4c567  Step 3\/4 : COPY requirements.txt \/tmp\/requirements.txt   ---> 40490bed96d2  Step 4\/4 : RUN  pip install --upgrade -r \/tmp\/requirements.txt   ---> Running in a79389decbc4  Collecting ipykernel    Downloading ipykernel-6.13.1-py3-none-any.whl (133 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 133.2\/133.2 KB 1.4 MB\/s eta 0:00:00  Collecting ipython    Downloading ipython-8.4.0-py3-none-any.whl (750 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 750.8\/750.8 KB 7.4 MB\/s eta 0:00:00  Collecting numpy    Downloading numpy-1.22.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.9 MB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 16.9\/16.9 MB 50.1 MB\/s eta 0:00:00  Collecting psutil    Downloading psutil-5.9.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (284 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 284.7\/284.7 KB 24.1 MB\/s eta 0:00:00  Collecting tornado>=6.1    Downloading tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl (427 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 427.5\/427.5 KB 38.0 MB\/s eta 0:00:00  Collecting packaging    Downloading packaging-21.3-py3-none-any.whl (40 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 40.8\/40.8 KB 5.0 MB\/s eta 0:00:00  Collecting matplotlib-inline>=0.1    Downloading matplotlib_inline-0.1.3-py3-none-any.whl (8.2 kB)  Collecting nest-asyncio    Downloading nest_asyncio-1.5.5-py3-none-any.whl (5.2 kB)  Collecting debugpy>=1.0    Downloading debugpy-1.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.8 MB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 1.8\/1.8 MB 71.2 MB\/s eta 0:00:00  Collecting traitlets>=5.1.0    Downloading traitlets-5.2.2.post1-py3-none-any.whl (106 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 106.8\/106.8 KB 18.8 MB\/s eta 0:00:00  Collecting jupyter-client>=6.1.12    Downloading jupyter_client-7.3.3-py3-none-any.whl (131 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 132.0\/132.0 KB 18.9 MB\/s eta 0:00:00  Collecting pygments>=2.4.0    Downloading Pygments-2.12.0-py3-none-any.whl (1.1 MB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 1.1\/1.1 MB 68.7 MB\/s eta 0:00:00  Collecting backcall    Downloading backcall-0.2.0-py2.py3-none-any.whl (11 kB)  Collecting pickleshare    Downloading pickleshare-0.7.5-py2.py3-none-any.whl (6.9 kB)  Collecting prompt-toolkit!=3.0.0,!=3.0.1,&lt;3.1.0,>=2.0.0    Downloading prompt_toolkit-3.0.29-py3-none-any.whl (381 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 381.5\/381.5 KB 41.8 MB\/s eta 0:00:00  Collecting pexpect>4.3    Downloading pexpect-4.8.0-py2.py3-none-any.whl (59 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 59.0\/59.0 KB 12.4 MB\/s eta 0:00:00  Collecting decorator    Downloading decorator-5.1.1-py3-none-any.whl (9.1 kB)  Collecting jedi>=0.16    Downloading jedi-0.18.1-py2.py3-none-any.whl (1.6 MB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 1.6\/1.6 MB 82.1 MB\/s eta 0:00:00  Requirement already satisfied: setuptools>=18.5 in \/usr\/local\/lib\/python3.8\/site-packages (from ipython->-r \/tmp\/requirements.txt (line 2)) (57.5.0)  Collecting stack-data    Downloading stack_data-0.2.0-py3-none-any.whl (21 kB)  Collecting parso&lt;0.9.0,>=0.8.0    Downloading parso-0.8.3-py2.py3-none-any.whl (100 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100.8\/100.8 KB 23.1 MB\/s eta 0:00:00  Collecting python-dateutil>=2.8.2    Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 247.7\/247.7 KB 36.0 MB\/s eta 0:00:00  Collecting jupyter-core>=4.9.2    Downloading jupyter_core-4.10.0-py3-none-any.whl (87 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 87.3\/87.3 KB 21.7 MB\/s eta 0:00:00  Collecting entrypoints    Downloading entrypoints-0.4-py3-none-any.whl (5.3 kB)  Collecting pyzmq>=23.0    Downloading pyzmq-23.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.1 MB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 1.1\/1.1 MB 68.4 MB\/s eta 0:00:00  Collecting ptyprocess>=0.5    Downloading ptyprocess-0.7.0-py2.py3-none-any.whl (13 kB)  Collecting wcwidth    Downloading wcwidth-0.2.5-py2.py3-none-any.whl (30 kB)  Collecting pyparsing!=3.0.5,>=2.0.2    Downloading pyparsing-3.0.9-py3-none-any.whl (98 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 98.3\/98.3 KB 19.7 MB\/s eta 0:00:00  Collecting executing    Downloading executing-0.8.3-py2.py3-none-any.whl (16 kB)  Collecting asttokens    Downloading asttokens-2.0.5-py2.py3-none-any.whl (20 kB)  Collecting pure-eval    Downloading pure_eval-0.2.2-py3-none-any.whl (11 kB)  Collecting six>=1.5    Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)  Installing collected packages: wcwidth, pure-eval, ptyprocess, pickleshare, executing, backcall, traitlets, tornado, six, pyzmq, pyparsing, pygments, psutil, prompt-toolkit, pexpect, parso, numpy, nest-asyncio, entrypoints, decorator, debugpy, python-dateutil, packaging, matplotlib-inline, jupyter-core, jedi, asttokens, stack-data, jupyter-client, ipython, ipykernel  Successfully installed asttokens-2.0.5 backcall-0.2.0 debugpy-1.6.0 decorator-5.1.1 entrypoints-0.4 executing-0.8.3 ipykernel-6.13.1 ipython-8.4.0 jedi-0.18.1 jupyter-client-7.3.3 jupyter-core-4.10.0 matplotlib-inline-0.1.3 nest-asyncio-1.5.5 numpy-1.22.4 packaging-21.3 parso-0.8.3 pexpect-4.8.0 pickleshare-0.7.5 prompt-toolkit-3.0.29 psutil-5.9.1 ptyprocess-0.7.0 pure-eval-0.2.2 pygments-2.12.0 pyparsing-3.0.9 python-dateutil-2.8.2 pyzmq-23.1.0 six-1.16.0 stack-data-0.2.0 tornado-6.1 traitlets-5.2.2.post1 wcwidth-0.2.5  WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https:\/\/pip.pypa.io\/warnings\/venv  WARNING: You are using pip version 22.0.4; however, version 22.1.2 is available.  You should consider upgrading via the '\/usr\/local\/bin\/python -m pip install --upgrade pip' command.  Removing intermediate container a79389decbc4   ---> 942cfb92669c  Successfully built 942cfb92669c  Successfully tagged ************:5005\/docker\/registry\/anikishin_proj3:latest  $ docker push ************:5005\/docker\/registry\/${LOGIN}_${IMAGE_NAME}:${IMAGE_VERSION}  The push refers to repository [************:5005\/docker\/registry\/anikishin_proj3]  ca238036b879: Preparing  5083b2b128f1: Preparing  92487648c84b: Preparing  9df5b2f53554: Preparing  590db2877d9d: Preparing  3d5419adeeb6: Preparing  2c9f341968bc: Preparing  ad6562704f37: Preparing  2c9f341968bc: Waiting  3d5419adeeb6: Waiting  ad6562704f37: Waiting  92487648c84b: Pushed  5083b2b128f1: Pushed  590db2877d9d: Pushed  2c9f341968bc: Pushed  9df5b2f53554: Pushed  3d5419adeeb6: Pushed  ca238036b879: Pushed  latest: digest: sha256:bc36a9bcc6be914a9b7f8ee6ea6c940409f32c57a528c521651442235309239a size: 1996 Running after_script 00:00 Saving cache 00:00 Uploading artifacts for successful job 00:00  Uploading artifacts...  Runtime platform                                    arch=amd64 os=linux pid=27359 revision=c5874a4b version=12.10.2  .\/.env: found 1 matching files                       Uploading artifacts to coordinator... ok            id=38302 responseStatus=201 Created token=************  Job succeeded <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c<\/h2>\n<p>\u0423 \u043d\u0430\u0441 \u0432\u0441\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0435 \u0441\u0440\u0430\u0437\u0443. \u041f\u043e \u043f\u0443\u0442\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0445\u0435\u043c\u0443:<\/p>\n<ol>\n<li>\n<p><strong>\u041d\u0435\u0442 \u043e\u043d\u0431\u043e\u0440\u0434\u0438\u043d\u0433\u0430<\/strong><\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0430\u043c\u0438;<\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443 \u043a\u043e\u043b\u043b\u0435\u0433 \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e. \u041f\u043b\u044e\u0441 \u0432\u0430\u0448\u0438 \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e pip install \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e: \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 Python-\u043c\u043e\u0434\u0443\u043b\u044c.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0441\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435 \u043e\u043d\u0431\u043e\u0440\u0434\u0438\u043d\u0433 \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043c\u043e\u0433\u0430\u0439\u0442\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043a\u0435\u0440\u043d\u0435\u043b\u043e\u0432.<\/p>\n<ol start=\"2\">\n<li>\n<p><strong>\u0421\u043e\u0445\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445<\/strong><\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 kernel\u2019\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0430\u0445, \u0442\u043e \u0438\u0445 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u0432\u0441\u0435\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0449\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0443 \u0438 \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u0443 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b.<\/p>\n<ol start=\"3\">\n<li>\n<p><strong>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/strong><\/p>\n<p>\u0411\u0435\u0437 \u043b\u0438\u043c\u0438\u0442\u043e\u0432 \u0438 \u0440\u044b\u0447\u0430\u0433\u043e\u0432 \u043e\u0434\u0438\u043d \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0432\u0430\u043b\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443, \u0447\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c:<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8fd\/16d\/83c\/8fd16d83c2d0ad6e73af7ad9c7412f5f.png\" width=\"1280\" height=\"274\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8fd\/16d\/83c\/8fd16d83c2d0ad6e73af7ad9c7412f5f.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u042d\u0442\u043e \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 kernel.<\/p>\n<p>\u0418 \u0442\u0430\u043a  \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2db\/84a\/f59\/2db84af5972338e6eb2c9ff9e20dfa30.png\" width=\"1280\" height=\"274\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2db\/84a\/f59\/2db84af5972338e6eb2c9ff9e20dfa30.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u044c\u0442\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043f\u043e CPU\\RAM. \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0430\u043b\u0435\u0440\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0439\u0442\u0435 \u043a\u0442\u043e \u0433\u0440\u0443\u0437\u0438\u0442 \u043c\u0430\u0448\u0438\u043d\u0443 \u0438 <s>\u0438\u0434\u0438\u0442\u0435 \u043d\u0430\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0438\u043d\u043e\u0432\u043d\u0438\u043a\u0430<\/s> \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435 \u043a\u043e\u043b\u043b\u0435\u0433\u0443 \u0441\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u043e\u0440\u043e\u0442\u044b.<\/p>\n<ol start=\"4\">\n<li>\n<p><strong>\u0412\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u043e\u0441\u0442\u044c<\/strong><\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u0430\u043a \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0442\u0435\u0433\u0443 #latest: \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u044b. \u041d\u043e \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u044b \u0441\u0442\u0430\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u0432\u043e\u0438\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u0447\u0442\u043e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 Docker registry \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u043e\u0441\u044c. <\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/p>\n<h2>\u041f\u043b\u0430\u043d\u044b \u043d\u0430 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435<\/h2>\n<p>\u0420\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u044f: \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0434\u0435\u0440\u0433\u0430\u044e\u0442 \u0430\u0434\u043c\u0438\u043d\u043e\u0432, \u043e\u043d\u0438 \u0440\u0430\u0434\u044b \u0447\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0438 kernel \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u043a \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0434\u0443\u043c\u0430\u0435\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u0438 \u0433\u0438\u0431\u043a\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/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\/rostelecom\/blog\/689596\/\"> https:\/\/habr.com\/ru\/company\/rostelecom\/blog\/689596\/<\/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<h3>\u2026\u0438\u043b\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e self service \u043d\u0430 JupyterHub \u0434\u043b\u044f \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u043e\u0432<\/h3>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0438 \u043d\u0430 \u043d\u0430\u0448 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u0432 \u0432\u0438\u0434\u0435 JupyterHub, \u0438 \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0443\u0434\u043e\u0431\u043d\u044b\u043c. \u0423 \u043d\u0430\u0441 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 ~20 \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u043e\u0432 \u0438 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e Open Source-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432: Airflow, Hadoop, Hive, Spark \u0438 \u0442.\u0434.\u00a0\u041d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e JupyterHub, \u0442\u043e\u0447\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u043e \u0431\u043e\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0438 \u043a\u0430\u043a \u043c\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0435\u0435 \u043f\u043e\u0431\u043e\u0440\u043e\u043b\u0438.<\/p>\n<h2>\u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 JupyterHub<\/h2>\n<p><a href=\"https:\/\/jupyter.org\/hub\">JupyterHub<\/a> \u2014 \u044d\u0442\u043e \u0442\u043e\u0442 \u0436\u0435 Jupyter, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u043e\u043d \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. <\/p>\n<p>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0442\u0443\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b:<\/p>\n<ul>\n<li>\n<p>\u0412\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 Jupyter\u2019\u0430 \u0438 \u0435\u0433\u043e      \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0442\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0448\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435\u0445      \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u041f\u043e \u0441\u0443\u0442\u0438 \u043a\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u2013 \u0442\u043e\u0433\u043e \u0438 \u0442\u0430\u043f\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u041e\u0434\u043d\u0430 \u0441\u0440\u0435\u0434\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445: \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f      \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c \u041f\u041e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. <\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0431\u043e\u043b\u044c. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u041f\u041e \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e <strong>\u0432\u0441\u0435\u043c\u0438<\/strong> \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 JupyterHub\u2019\u0430.    <\/p>\n<\/li>\n<\/ul>\n<p><em>\u041f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043d\u0430 \u0432\u0430\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u043d\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430. \u0410 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0431\u044e\u0440\u043e\u043a\u0440\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u041f\u041e \u0431\u0443\u0434\u0435\u0442 \u0441\u044a\u0435\u0434\u0430\u0442\u044c \u0432\u0441\u0451 \u0432\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f.<\/em><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0412 \u0438\u0433\u0440\u0443 \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 Kernel <\/h2>\n<p>\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e kernel\u2019\u043e\u0432 \u2014 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0440\u0435\u0434 (venv). \u0412\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0435 \u0432 \u043d\u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435 \u0438\u0445 \u043d\u0430 JupyterHub, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u043e\u0435 \u044f\u0434\u0440\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043b\u044d\u043f\u0442\u043e\u043f\u0430. \u0410 \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043b\u044d\u043f\u0442\u043e\u043f\u0435, \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>\u041d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e kernel\u2019\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0435\u0449\u0435 \u0431\u043e\u0301\u043b\u044c\u0448\u0435\u0439 \u0431\u0435\u0434\u043e\u0439: \u0438\u0445 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c, \u043f\u043b\u044e\u0441 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043e\u043d\u0438 \u043e\u0431\u0440\u0430\u0441\u0442\u0430\u043b\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 legacy-\u043a\u043e\u0434\u043e\u043c. \u0410 \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 kernel\u2019\u044b \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u043d\u0435\u0433\u0430\u0442\u0438\u0432 \u0441\u043e \u0432\u0441\u0435\u0445 \u0441\u0442\u043e\u0440\u043e\u043d: \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u044b \u043d\u0435 \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u041f\u041e. \u0410 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0434\u043e\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c. \u0422\u0430\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043c\u044b \u043d\u0435 \u043c\u043e\u0433\u043b\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u043e\u0432.<\/p>\n<h2>\u0427\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 <\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u043e\u0432 (\u0438 \u0430\u0434\u043c\u0438\u043d\u043e\u0432) \u043e\u0442 \u0431\u043e\u043b\u0438, \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0446\u0435\u043b\u0438:\u00a0<\/p>\n<ol>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\/\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u041f\u041e \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\/\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u041f\u041e \u043c\u043e\u0436\u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u041f\u041e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u041f\u041e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u0446\u0435\u043b\u043e\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043a\u0443 Jupyterhub + Docker, \u0430 kernel\u2019\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0432 GitLab CICD, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0442\u0435\u043c\u00a0\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Jupyterhub.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<details class=\"spoiler\">\n<summary>\u0421\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 GitLab \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0438, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 kernel, \u043e\u043d:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0432 \u0441\u0432\u043e\u0435\u0439 \u043f\u0430\u043f\u043a\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 (\u043f\u0430\u043f\u043a\u0443);<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0444\u0430\u0439\u043b requirements.json \u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 \u043d\u0435\u043c:<\/p>\n<p>2.1 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 kernel\u2019\u0430<\/p>\n<p>2.2 \u0418\u043c\u044f docker-\u043e\u0431\u0440\u0430\u0437\u0430 (\u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 DockerHub\u2019\u0430, \u043b\u0438\u0431\u043e \u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043d\u0430\u0448\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b).<\/p>\n<p>2.3 Python-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 Dockerfile;<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 CICD-\u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c:<\/p>\n<p>4.1 \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u044f\u0434\u0440\u043e;<\/p>\n<p>4.2 \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u0437 Dockerfile.<\/p>\n<p>4.3 \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0437 requirements.json.<\/p>\n<p>4.4 \u042f\u0434\u0440\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 JupyterHub.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u043e\u0432\u043e\u0435 \u044f\u0434\u0440\u043e \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 JupyterHub\u2019\u0435. \u0410 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0432\u043e\u0435\u0433\u043e \u044f\u0434\u0440\u0430 \u0438 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0435\u0433\u043e.<\/p>\n<\/div>\n<\/details>\n<h2>\u0427\u0442\u043e \u044d\u0442\u043e \u043d\u0430\u043c \u0434\u0430\u043b\u043e<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0430\u0442\u0430 \u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u0430\u043c\u0438 \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u041f\u043e\u0441\u043b\u0435 10 \u0442\u044b\u0441\u044f\u0447 \u0441\u0431\u043e\u0440\u043e\u043a kernel\u2019\u043e\u0432 \u043c\u044b \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u0445 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0439 \u0438 \u0441\u0430\u043c\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435. <\/p>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043e\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c, \u0430 \u0430\u0434\u043c\u0438\u043d\u044b \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u0434\u043a\u043e \u2014\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432. \u0426\u0435\u043b\u0438 1 \u0438 2 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b.<\/p>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u043e\u043a\u0441\u0438-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e pip. \u0412\u0441\u0435 \u041f\u041e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0427\u0442\u043e \u0431\u044b \u0442\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u2014 \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0422\u0430\u043a \u043c\u044b \u0437\u0430\u043a\u0440\u044b\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0446\u0435\u043b\u044f\u043c\u0438 3 \u0438 4.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0430\u0440\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u044f\u0434\u0440\u0430<\/h2>\n<details class=\"spoiler\">\n<summary>kernel.json<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>{   \"argv\": [     \"\/usr\/bin\/docker\",     \"run\",     \"--network=host\",     \"--rm\",     \"-v\",     \"{connection_file}:\/connection-spec\",     \"-v\",     \"\/home\/anikishin\/work:\/root\/work\",     \"************\/docker\/registry\/anikishin_dataflow:latest\",     \"python\",     \"-m\",     \"ipykernel_launcher\",     \"-f\",     \"\/connection-spec\"   ],   \"display_name\": \"anikishin_dataflow\",   \"language\": \"python\",   \"env\": {} }<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 &#8212;network=host \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b pyspark \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Hadoop \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043b\u0438\u0435\u043d\u0442\u0443.\u00a0<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0431\u043e\u0440\u043a\u0438 \u044f\u0434\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>$ LOGIN=`echo \"${GITLAB_USER_LOGIN}\" | awk '{print tolower($0)}'`  $ echo -e \"export PATH_TO_KERNEL=\/${LOGIN}\/${KERNEL}\\nLOGIN=${LOGIN}\\nKERNEL=${KERNEL}\" >.env  $ source .\/.env  $ PYTHON_VERSION=`\/bin\/python3 ${CI_PROJECT_DIR}\/parser.py ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/requirements.json python_version`  $ sed \"s\/PYTHON_VERSION\/${PYTHON_VERSION}\/g\" ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/Dockerfile  FROM python:3.8-slim  WORKDIR \/root\/work  COPY requirements.txt \/tmp\/requirements.txt  RUN  pip install --upgrade -r \/tmp\/requirements.txt$ sed -i \"s\/PYTHON_VERSION\/${PYTHON_VERSION}\/g\" ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/Dockerfile  $ \/bin\/python3 ${CI_PROJECT_DIR}\/parser.py ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/requirements.json libs > ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/requirements.txt  $ echo \"IMAGE_NAME=`\/bin\/python3 ${CI_PROJECT_DIR}\/parser.py ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/requirements.json image_name`\" >> .\/.env  $ echo \"IMAGE_VERSION=`\/bin\/python3 ${CI_PROJECT_DIR}\/parser.py ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/requirements.json image_version`\" >> .\/.env  $ source .\/.env  $ docker build --no-cache -t ************:5005\/docker\/registry\/${LOGIN}_${IMAGE_NAME}:${IMAGE_VERSION} ${CI_PROJECT_DIR}\/${PATH_TO_KERNEL}\/  Step 1\/4 : FROM python:3.8-slim  3.8-slim: Pulling from library\/python  42c077c10790: Already exists  f63e77b7563a: Pulling fs layer  5215613c2da8: Pulling fs layer  9ca2d4523a14: Pulling fs layer  e97cee5830c4: Pulling fs layer  e97cee5830c4: Waiting  9ca2d4523a14: Verifying Checksum  9ca2d4523a14: Download complete  f63e77b7563a: Verifying Checksum  f63e77b7563a: Download complete  5215613c2da8: Verifying Checksum  5215613c2da8: Download complete  f63e77b7563a: Pull complete  5215613c2da8: Pull complete  9ca2d4523a14: Pull complete  e97cee5830c4: Verifying Checksum  e97cee5830c4: Download complete  e97cee5830c4: Pull complete  Digest: sha256:0e07cc072353e6b10de910d8acffa020a42467112ae6610aa90d6a3c56a74911  Status: Downloaded newer image for python:3.8-slim   ---> 61c56c60bb49  Step 2\/4 : WORKDIR \/root\/work   ---> Running in 4baf6a21fb37  Removing intermediate container 4baf6a21fb37   ---> 0f5165f4c567  Step 3\/4 : COPY requirements.txt \/tmp\/requirements.txt   ---> 40490bed96d2  Step 4\/4 : RUN  pip install --upgrade -r \/tmp\/requirements.txt   ---> Running in a79389decbc4  Collecting ipykernel    Downloading ipykernel-6.13.1-py3-none-any.whl (133 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 133.2\/133.2 KB 1.4 MB\/s eta 0:00:00  Collecting ipython    Downloading ipython-8.4.0-py3-none-any.whl (750 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 750.8\/750.8 KB 7.4 MB\/s eta 0:00:00  Collecting numpy    Downloading numpy-1.22.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.9 MB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 16.9\/16.9 MB 50.1 MB\/s eta 0:00:00  Collecting psutil    Downloading psutil-5.9.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (284 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 284.7\/284.7 KB 24.1 MB\/s eta 0:00:00  Collecting tornado>=6.1    Downloading tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl (427 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 427.5\/427.5 KB 38.0 MB\/s eta 0:00:00  Collecting packaging    Downloading packaging-21.3-py3-none-any.whl (40 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 40.8\/40.8 KB 5.0 MB\/s eta 0:00:00  Collecting matplotlib-inline>=0.1    Downloading matplotlib_inline-0.1.3-py3-none-any.whl (8.2 kB)  Collecting nest-asyncio    Downloading nest_asyncio-1.5.5-py3-none-any.whl (5.2 kB)  Collecting debugpy>=1.0    Downloading debugpy-1.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.8 MB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 1.8\/1.8 MB 71.2 MB\/s eta 0:00:00  Collecting traitlets>=5.1.0    Downloading traitlets-5.2.2.post1-py3-none-any.whl (106 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 106.8\/106.8 KB 18.8 MB\/s eta 0:00:00  Collecting jupyter-client>=6.1.12    Downloading jupyter_client-7.3.3-py3-none-any.whl (131 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 132.0\/132.0 KB 18.9 MB\/s eta 0:00:00  Collecting pygments>=2.4.0    Downloading Pygments-2.12.0-py3-none-any.whl (1.1 MB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 1.1\/1.1 MB 68.7 MB\/s eta 0:00:00  Collecting backcall    Downloading backcall-0.2.0-py2.py3-none-any.whl (11 kB)  Collecting pickleshare    Downloading pickleshare-0.7.5-py2.py3-none-any.whl (6.9 kB)  Collecting prompt-toolkit!=3.0.0,!=3.0.1,&lt;3.1.0,>=2.0.0    Downloading prompt_toolkit-3.0.29-py3-none-any.whl (381 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 381.5\/381.5 KB 41.8 MB\/s eta 0:00:00  Collecting pexpect>4.3    Downloading pexpect-4.8.0-py2.py3-none-any.whl (59 kB)       \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 59.0\/59.0 KB 12.4 MB\/s eta 0:00:00  Collecting decorator    Downloading decorator-5.1.1-py3-none-any.whl (9.1 kB)<\/code><\/pre>\n<\/div>\n<\/details>\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-339635","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/339635","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=339635"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/339635\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=339635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=339635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=339635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}