{"id":454230,"date":"2025-04-01T17:18:22","date_gmt":"2025-04-01T17:18:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=454230"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=454230","title":{"rendered":"<span>\u0411\u044b\u0441\u0442\u0440\u0435\u0435, \u0432\u044b\u0448\u0435, \u0441\u0438\u043b\u044c\u043d\u0435\u0435: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 poetry, rye \u0438 uv<\/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<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0441 \u0432\u0430\u043c\u0438 \u0441\u043d\u043e\u0432\u0430 \u0415\u0433\u043e\u0440, Tech Lead \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438<a href=\"https:\/\/idaproject.com\/\"> \u0418\u0434\u0430\u041f\u0440\u043e\u0434\u0436\u0435\u043a\u0442<\/a>. \u042f \u0432\u0441\u0435 \u0435\u0449\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 backend-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \ud83d\ude42<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430-\u0442\u043e \u0434\u0430\u0432\u043d\u043e (\u043f\u043e \u043c\u0435\u0440\u043a\u0430\u043c IT), \u0448\u0435\u0441\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434, \u043c\u044b \u0441\u0445\u043e\u0434\u0438\u043b\u0438 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e \u0438 \u043f\u043e\u0441\u043b\u0443\u0448\u0430\u043b\u0438 \u043f\u0440\u043e poetry, \u043f\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b\u0438\u0441\u044c \u0438 \u0432\u043d\u0435\u0434\u0440\u0438\u043b\u0438 \u0435\u0433\u043e \u0443 \u0441\u0435\u0431\u044f \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u041d\u043e \u043d\u0438\u0447\u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u0432\u043e\u0442 \u0443\u0436\u0435 \u0434\u0432\u0430 \u0433\u043e\u0434\u0430 \u043c\u0438\u0440 \u0437\u043d\u0430\u0435\u0442 \u043e uv, \u0430 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0435\u0449\u0435 \u0438 rye. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u043e\u0441\u0432\u044f\u0442\u0438\u043b \u043f\u0430\u0440\u0443 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u044d\u0442\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0430\u0448\u0438\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043c poetry, uv \u0438 rye: \u043a\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 Docker, \u0438 \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432 2025 \u0433\u043e\u0434\u0443. \u0417\u0430\u043e\u0434\u043d\u043e \u043f\u0440\u043e\u0431\u0435\u0436\u0438\u043c\u0441\u044f \u043f\u043e \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0430\u0440\u0443 \u043d\u043e\u0432\u044b\u0445 PEP \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<h3>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p><strong>\u2192<\/strong>  <a href=\"#chtotakoerye\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 rye \u0438 \u0435\u0433\u043e \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#chtotakoepoetry\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 poetry \u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043e\u043d \u0440\u0435\u0448\u0438\u043b \u0432 2019<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#ikakoizepoetry\">\u0418 \u043a\u0430\u043a\u043e\u0439 \u0436\u0435 poetry \u0432 2025?<\/a><\/p>\n<p>\u2192  <a href=\"#nashtipichnyiproekt\">\u041d\u0430\u0448 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 Poetry, \u0438 \u043a\u0430\u043a \u043e\u043d \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 Docker<\/a>  <\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#metrikiposborke\">\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#perevedemproektdlya\">\u041f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f uv<\/a> <\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#metrikiposborke\">\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#otlichielockfaila\">\u041e\u0442\u043b\u0438\u0447\u0438\u0435 lock \u0444\u0430\u0439\u043b\u0430 \u0432 poetry \u0438 \u0432 uv<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#inaposledok\">\u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a rye&#8230;<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#zakluchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 rye \u0438 \u0435\u0433\u043e \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f<\/h3>\n<p><a class=\"anchor\" name=\"chtotakoerye\" id=\"chtotakoerye\"><\/a><\/p>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f 0.43.0) <a href=\"https:\/\/rye.astral.sh\/\">rye<\/a> \u2014 \u044d\u0442\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <strong>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438<\/strong> \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438. \u041a \u043d\u0435\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043a \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 python-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 \u0441\u0431\u043e\u0440\u043a\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, rye \u0437\u0430\u043c\u0430\u0445\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u043b\u0438\u043d\u0442\u0438\u043d\u0433 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u2014 \u043f\u0435\u0440\u0435\u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 <a href=\"https:\/\/peps.python.org\/pep-0008\/\">PEP 8<\/a>.\u00a0<\/p>\n<p>\u0412 \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 rye \u0445\u043e\u0447\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u043b\u043e\u0439\u043a\u043e\u0439, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0442\u0438 \u0432\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u0434 python.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 rye, \u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u044c \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e, \u043f\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043e \u0435\u0433\u043e <a href=\"https:\/\/rye.astral.sh\/philosophy\/\">\u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u0438<\/a>. \u0410\u0432\u0442\u043e\u0440 rye, <a href=\"https:\/\/github.com\/mitsuhiko\">Armin Ronacher<\/a> (\u0441\u043e\u0437\u0434\u0430\u043b \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <a href=\"https:\/\/palletsprojects.com\/\">\u043f\u0440\u043e\u0435\u043a\u0442\u044b Pallets<\/a>, \u043a\u0443\u0434\u0430 \u0432\u0445\u043e\u0434\u0438\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 Flask) \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u044f\u0437\u044b\u043a rust \u0438 \u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b (<a href=\"https:\/\/rust-lang.github.io\/rustup\/\">rustup<\/a> \u0438 <a href=\"https:\/\/doc.rust-lang.org\/cargo\/\">cargo<\/a>) \u043a\u0430\u043a \u043d\u0430 \u0446\u0435\u043b\u044c, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u044c\u0441\u044f python-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430.\u00a0<\/p>\n<p>\u041e\u0431\u0449\u0438\u0435 \u0446\u0435\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0441\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0443\u043d\u043a\u0442\u0430\u043c:<\/p>\n<ul>\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 python \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 <a href=\"https:\/\/peps.python.org\/pep-0711\/\">PEP 771<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u043f\u0440\u0438\u0439\u0442\u0438 \u043a <a href=\"https:\/\/habr.com\/ru\/sandbox\/228198\/\">semver<\/a> \u043a\u0430\u043a \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 Lockfiles (\u0441\u0435\u0439\u0447\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0434\u0440\u0430\u0444\u0442 <a href=\"https:\/\/peps.python.org\/pep-0751\/\">PEP 751<\/a>) \u0438 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f uv.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 virtualenv.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043b\u0430\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0435\u0435, \u043d\u043e \u043f\u043e\u043a\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a rye \u00ab\u043b\u044f\u0436\u0435\u0442\u00bb \u043d\u0430 \u043d\u0430\u0448 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0438 \u043e\u0446\u0435\u043d\u0438\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c, \u0430 \u043d\u0435 \u0441 poetry (\u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0443 \u043d\u0430\u0441 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443).<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 rye, \u043f\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c <a href=\"https:\/\/habr.com\/ru\/articles\/842134\/\">\u0432 \u043e\u0431\u0437\u043e\u0440\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/a><\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 poetry \u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043e\u043d \u0440\u0435\u0448\u0438\u043b \u0432 2019<\/h3>\n<p><a class=\"anchor\" name=\"chtotakoepoetry\" id=\"chtotakoepoetry\"><\/a><\/p>\n<p>\u0414\u043e <a href=\"https:\/\/python-poetry.org\/\">Poetry<\/a> \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 Python \u0431\u044b\u043b\u043e \u0431\u043e\u043b\u044c\u044e. \u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u0432\u0435\u0440\u0441\u0438\u0439, \u0440\u0443\u0447\u043d\u0430\u044f \u043f\u0440\u0430\u0432\u043a\u0430 requirements.txt \u2014 \u0437\u043d\u0430\u043a\u043e\u043c\u043e? Poetry \u044d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b.\u00a0<\/p>\n<p>Pyproject.toml \u0441\u0442\u0430\u043b \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0433\u0434\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. poetry.lock \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u0441\u0435\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0433\u0430\u0434\u0430\u0442\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0445 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. Poetry \u0434\u0430\u043b \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0431\u043e\u0440\u043e\u043a. Requirements.txt \u0443\u0448\u0435\u043b \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u043d \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u0443\u0441\u0442\u0443\u043f\u0438\u0432 \u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u0443 \u0441 lock-\u0444\u0430\u0439\u043b\u0430\u043c\u0438.<\/p>\n<p>\u041f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u00ab\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c\u00bb \u0432 \u0432\u0438\u0434\u0435 <strong>pyproject.toml<\/strong>, \u0433\u0434\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u0438 dev-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043b\u0438\u043d\u0442\u0438\u043d\u0433\u0430 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430. Poetry \u0441\u0430\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u0435\u0439\u0441\u0430\u0445 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0438\u0437 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 virtualenv \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439. \u0422\u0430\u043a\u0436\u0435 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u043a IDE \u0431\u0435\u0437 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439: \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. IDE \u043c\u043e\u0433\u0443\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0438 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430. \u042d\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u0438\u0440\u0443\u0435\u0442 \u0441 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0433\u0434\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u00ab\u043a\u0430\u043a \u043f\u043e\u043f\u0430\u043b\u043e\u00bb, \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u0447\u0442\u043e \u0432\u043b\u0435\u043a\u043b\u043e \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 IDE \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e, \u0442\u043e poetry \u0434\u0430\u043b \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043c\u043d\u043e\u0433\u043e\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0449\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.\u00a0<\/p>\n<h3>\u0418 \u043a\u0430\u043a\u043e\u0439 \u0436\u0435 poetry \u0432 2025?<\/h3>\n<p><a class=\"anchor\" name=\"ikakoizepoetry\" id=\"ikakoizepoetry\"><\/a><\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 poetry \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0438 \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434. \u0412 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043b\u0438\u0437\u0430\u0445 poetry \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u043e\u0441\u044c <a href=\"https:\/\/python-poetry.org\/blog\/announcing-poetry-2.1.0\/#experimental-commands-to-manage-python-installations\">\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 python<\/a>, \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0430\u0441\u044c <a href=\"https:\/\/python-poetry.org\/blog\/announcing-poetry-2.1.0\/#changed\">\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/a>.\u00a0<\/p>\n<h3>\u041d\u0430\u0448 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 Poetry, \u0438 \u043a\u0430\u043a \u043e\u043d \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 Docker<\/h3>\n<p><a class=\"anchor\" name=\"nashtipichnyiproekt\" id=\"nashtipichnyiproekt\"><\/a><\/p>\n<p>\u0414\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u2014 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043d\u0443\u0436\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.\u00a0<\/p>\n<pre><code class=\"python\">[tool.poetry.dependencies]  # core  python = \"3.12.*\"  Django = \"4.2.*\"  psycopg2-binary = \"2.9.*\"  django-redis = \"5.4.*\"  gunicorn = \"^20.1.0\"  # Models \\ Admin  phonenumbers = \"^8.12.29\"  django-phonenumber-field = \"5.2.*\"  # Rest  djangorestframework = \"3.14.*\"  drf-spectacular = \"0.24.*\"  django-filter = \"22.*\"  # Test  factory-boy = \"^3.2.0\"  pytest = \"^6.2.4\"  pytest-mock = \"^3.6.1\"  pytest-cov = \"^2.12.1\"  pytest-django = \"^4.4.0\"  pytest-sugar = \"^0.9.4\"  # Others  Pillow = \"10.0.1\"  [poetry.group.dev.dependencies]  django-debug-toolbar = \"^3.2.1\"  # linting  ruff = \"0.0.*\"  # Typehinting  mypy = \"1.*\"  mypy-extensions = \"1.*\"  django-stubs = \"1.14.*\"  djangorestframework-stubs=\"1.8.*\" <\/code><\/pre>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0442\u043e\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u0431\u0435\u0437 \u0438\u0437\u043b\u0438\u0448\u0435\u0441\u0442\u0432:<\/p>\n<pre><code class=\"vbscript\"> FROM python:3.12-alpine  # Set environment variables  ENV PYTHONUNBUFFERED 1  ENV PYTHONWARNINGS ignore  ENV CURL_CA_BUNDLE \"\"  ENV POETRY_VIRTUALENVS_CREATE true  ENV PATH \"${PATH}:\/root\/.local\/bin\"  # Expose port 8000  EXPOSE 8000\/tcp  # Set the working directory for the application  WORKDIR \/app  # Copy just the dependencies installation from the current directory to the Docker image  COPY pyproject.toml poetry.lock \/app\/  # Install necessary dependencies  RUN set -ex; \\  \u00a0\u00a0\u00a0apk update; \\  \u00a0\u00a0\u00a0apk add --no-cache --virtual build-deps \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0git \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0gcc \\  \u00a0\u00a0\u00a0&amp;&amp; rm -rf \/var\/lib\/apt\/lists\/* \\  \u00a0\u00a0\u00a0&amp;&amp; pip install --no-cache-dir --user poetry==2.1.0 \\  \u00a0\u00a0\u00a0&amp;&amp; poetry install --no-interaction --no-ansi \\  \u00a0\u00a0\u00a0&amp;&amp; pip install\u00a0 --no-cache-dir --user requests \\  \u00a0\u00a0\u00a0&amp;&amp; apk del --no-cache build-deps  # Create link python interpritator  RUN ln -sf $(poetry env info -e) \/python  # Copy wait-for script and give it necessary permissions  COPY wait-for \/usr\/bin\/  RUN chmod +x \/usr\/bin\/wait-for  # Copy the current directory contents into the container  COPY . \/app\/  # Give necessary permissions to entrypoint  RUN chmod +x entrypoint.*<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0446\u0435\u043b\u044c\u044e \u0441\u0442\u0430\u0442\u044c\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435 poetry, rue \u0438 uv, \u043c\u044b \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u0432 Docker-\u0444\u0430\u0439\u043b\u0430\u0445 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u043e\u0432.\u00a0<\/p>\n<h3>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/h3>\n<p><a class=\"anchor\" name=\"metrikiposborke\" id=\"metrikiposborke\"><\/a><\/p>\n<p>\u0414\u043b\u044f \u0437\u0430\u043c\u0435\u0440\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c Dockerfile \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"python\"># Install necessary dependencies  RUN set -ex; \\  \u00a0\u00a0\u00a0apk update; \\  \u00a0\u00a0\u00a0apk add --no-cache --virtual build-deps \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0git \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0gcc \\  \u00a0\u00a0\u00a0&amp;&amp; rm -rf \/var\/lib\/apt\/lists\/* \\  \u00a0\u00a0\u00a0&amp;&amp; pip install --no-cache-dir --user poetry==2.1.0  RUN time -v poetry lock # \u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439  RUN time -v poetry install --no-interaction --no-ansi --all-groups # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439  RUN pip install\u00a0 --no-cache-dir --user requests \\  \u00a0\u00a0\u00a0&amp;&amp; apk del --no-cache build-deps<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>docker compose -f docker-compose.yml build backend_poetry --no-cache --progress plain<\/code> \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0431\u043e\u0440\u043a\u0443. \u041e\u043f\u0446\u0438\u044f <code>--progress plain<\/code> \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u043b\u043e\u0433\u0438 \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<p>\u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0437\u0430\u043d\u044f\u043b\u043e 10 \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<pre><code class=\"vbscript\">#9 [backend_poetry\u00a0 5\/12] RUN time -v poetry lock  #9 0.944 Creating virtualenv uv,_poetry_compare-9TtSrW0h-py3.12 in \/root\/.cache\/pypoetry\/virtualenvs  #9 1.449 Resolving dependencies...  #9 10.29\u00a0 \u00a0 Command being timed: \"poetry lock\"  #9 10.29\u00a0 \u00a0 User time (seconds): 2.63  #9 10.29\u00a0 \u00a0 System time (seconds): 0.95  #9 10.29\u00a0 \u00a0 Percent of CPU this job got: 36%  #9 10.29\u00a0 \u00a0 Elapsed (wall clock) time (h:mm:ss or m:ss): 0m 9.95s  #9 10.29\u00a0 \u00a0 Average shared text size (kbytes): 0  #9 10.29\u00a0 \u00a0 Average unshared data size (kbytes): 0  #9 10.29\u00a0 \u00a0 Average stack size (kbytes): 0  #9 10.29\u00a0 \u00a0 Average total size (kbytes): 0  #9 10.29\u00a0 \u00a0 Maximum resident set size (kbytes): 88424  #9 10.29\u00a0 \u00a0 Average resident set size (kbytes): 0  #9 10.29\u00a0 \u00a0 Major (requiring I\/O) page faults: 0  #9 10.29\u00a0 \u00a0 Minor (reclaiming a frame) page faults: 138441  #9 10.29\u00a0 \u00a0 Voluntary context switches: 388  #9 10.29\u00a0 \u00a0 Involuntary context switches: 138  #9 10.29\u00a0 \u00a0 Swaps: 0  #9 10.29\u00a0 \u00a0 File system inputs: 24  #9 10.29\u00a0 \u00a0 File system outputs: 55896  #9 10.29\u00a0 \u00a0 Socket messages sent: 0  #9 10.29\u00a0 \u00a0 Socket messages received: 0  #9 10.29\u00a0 \u00a0 Signals delivered: 0  #9 10.29\u00a0 \u00a0 Page size (bytes): 4096  #9 10.29\u00a0 \u00a0 Exit status: 0  #9 DONE 10.3s<\/code><\/pre>\n<p>\u041f\u043e \u0442\u0440\u0435\u0439\u0441\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0438\u043a\u043e\u0432\u0430\u044f \u0434\u043e\u043b\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 CPU \u0437\u0430\u043d\u044f\u043b\u0430 \u0431\u044b 36%, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e 88 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442. \u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u0443\u0434\u0440\u0443\u0447\u0430\u0435\u0442.<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e poetry \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043f\u044f\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434. \u041f\u043e CPU \u0443\u0445\u043e\u0434\u0438\u043b\u043e \u0432 100%, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u0448\u043b\u043e 88 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442.<\/p>\n<pre><code class=\"vbscript\">#10 [backend_poetry\u00a0 6\/12] RUN time poetry install --no-interaction --no-ansi --all-groups  \u2026  #10 4.846 \u00a0 Command being timed: \"poetry install --no-interaction --no-ansi --all-groups\"  #10 4.846 \u00a0 User time (seconds): 2.48  #10 4.846 \u00a0 System time (seconds): 2.03  #10 4.846 \u00a0 Percent of CPU this job got: 100%  #10 4.846 \u00a0 Elapsed (wall clock) time (h:mm:ss or m:ss): 0m 4.48s  #10 4.846 \u00a0 Average shared text size (kbytes): 0  #10 4.846 \u00a0 Average unshared data size (kbytes): 0  #10 4.846 \u00a0 Average stack size (kbytes): 0  #10 4.846 \u00a0 Average total size (kbytes): 0  #10 4.846 \u00a0 Maximum resident set size (kbytes): 88844  #10 4.846 \u00a0 Average resident set size (kbytes): 0  #10 4.846 \u00a0 Major (requiring I\/O) page faults: 0  #10 4.846 \u00a0 Minor (reclaiming a frame) page faults: 166516  #10 4.846 \u00a0 Voluntary context switches: 45109  #10 4.846 \u00a0 Involuntary context switches: 229  #10 4.846 \u00a0 Swaps: 0  #10 4.846 \u00a0 File system inputs: 0  #10 4.846 \u00a0 File system outputs: 359408  #10 4.846 \u00a0 Socket messages sent: 0  #10 4.846 \u00a0 Socket messages received: 0  #10 4.846 \u00a0 Signals delivered: 0  #10 4.846 \u00a0 Page size (bytes): 4096  #10 4.846 \u00a0 Exit status: 0  #10 DONE 5.0s<\/code><\/pre>\n<h3>\u041f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f uv<\/h3>\n<p><a class=\"anchor\" name=\"perevedemproektdlya\" id=\"perevedemproektdlya\"><\/a><\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b pyproject.toml \u0438 \u0437\u0430\u043d\u043e\u0432\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0432 \u043d\u0435\u0433\u043e \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 CLI \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e uv add; \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"python\">[project]  name = \"uv_poetry_compare\"  version = \"0.1.0\"  requires-python = \"&gt;=3.12\"  dependencies = [  \u00a0\u00a0\u00a0\"django==4.2\",  \u00a0\u00a0\u00a0\"django-debug-toolbar==3.2.1\",  \u00a0\u00a0\u00a0\"django-filter==22.*\",  \u00a0\u00a0\u00a0\"django-phonenumber-field==5.2.*\",  \u00a0\u00a0\u00a0\"django-redis==5.4.*\",  \u00a0\u00a0\u00a0\"djangorestframework==3.14.*\",  \u00a0\u00a0\u00a0\"drf-spectacular==0.24.*\",  \u00a0\u00a0\u00a0\"factory-boy==3.2.0\",  \u00a0\u00a0\u00a0\"gunicorn==20.1.0\",  \u00a0\u00a0\u00a0\"phonenumbers==8.12.29\",  \u00a0\u00a0\u00a0\"pillow==10.0.1\",  \u00a0\u00a0\u00a0\"psycopg2-binary==2.9.*\",  \u00a0\u00a0\u00a0\"pytest==6.2.4\",  \u00a0\u00a0\u00a0\"pytest-cov==2.12.1\",  \u00a0\u00a0\u00a0\"pytest-django==4.4.0\",  \u00a0\u00a0\u00a0\"pytest-mock==3.6.1\",  \u00a0\u00a0\u00a0\"pytest-sugar==0.9.4\",  ]  [dependency-groups]  lint = [  \u00a0\u00a0\u00a0\"django-stubs==1.14.*\",  \u00a0\u00a0\u00a0\"djangorestframework-stubs==1.8.*\",  \u00a0\u00a0\u00a0\"mypy==1.*\",  \u00a0\u00a0\u00a0\"mypy-extensions==1.*\",  \u00a0\u00a0\u00a0\"ruff&gt;=0.9.10\",  ]<\/code><\/pre>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u043c Docker-\u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u0440\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:<\/p>\n<pre><code class=\"python\">FROM python:3.12-alpine  COPY --from=ghcr.io\/astral-sh\/uv:0.6.5 \/uv \/uvx \/bin\/  # Set environment variables  ENV PYTHONUNBUFFERED 1  ENV PYTHONWARNINGS ignore  ENV CURL_CA_BUNDLE \"\"  ENV POETRY_VIRTUALENVS_CREATE true  ENV PATH \"${PATH}:\/root\/.local\/bin\"  # Expose port 8000  EXPOSE 8000\/tcp  # Set the working directory for the application  WORKDIR \/app  # Copy just the dependencies installation from the current directory to the Docker image  COPY . \/app\/  RUN time -v uv lock  RUN time -v uv sync  # Copy wait-for script and give it necessary permissions  COPY wait-for \/usr\/bin\/  RUN chmod +x \/usr\/bin\/wait-for  # Give necessary permissions to entrypoint  RUN chmod +x entrypoint.*<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0441\u043e\u0432\u0435\u0442\u0430\u043c\u0438 \u0438\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <a href=\"https:\/\/docs.astral.sh\/uv\/guides\/integration\/docker\/#non-editable-installs\">\u043f\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e Dockerfile \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d-\u0441\u0440\u0435\u0434\u044b<\/a> \u0438 <a href=\"https:\/\/docs.astral.sh\/uv\/guides\/integration\/docker\/#developing-in-a-container\">\u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/a>.<\/p>\n<h3>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435<\/h3>\n<p><a class=\"anchor\" name=\"metrikiposborke\" id=\"metrikiposborke\"><\/a><\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u043f\u0430\u0440\u0443 \u043d\u044e\u0430\u043d\u0441\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b uv.\u00a0<\/p>\n<p>\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 uv.lock \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 4,8 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. CPU \u0432 \u043f\u0438\u043a\u0435 \u0441\u043e\u0431\u0440\u0430\u043b\u043e 50%, \u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 73 \u041c\u0411. \u041f\u043e \u0444\u0430\u043a\u0442\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u2014 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 poetry \u2014 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e uv.lock \u0444\u0430\u0439\u043b\u0430 \u0432\u044b\u0448\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438:<\/p>\n<pre><code class=\"vbscript\">#11 [backend_uv stage-0 5\/6] RUN time -v uv lock  #11 5.287 Resolved 57 packages in 4.81s  #11 5.300 \u00a0 Command being timed: \"uv lock\"  #11 5.300 \u00a0 User time (seconds): 1.64  #11 5.300 \u00a0 System time (seconds): 0.91  #11 5.300 \u00a0 Percent of CPU this job got: 50%  #11 5.300 \u00a0 Elapsed (wall clock) time (h:mm:ss or m:ss): 0m 5.08s  #11 5.300 \u00a0 Average shared text size (kbytes): 0  #11 5.300 \u00a0 Average unshared data size (kbytes): 0  #11 5.300 \u00a0 Average stack size (kbytes): 0  #11 5.300 \u00a0 Average total size (kbytes): 0  #11 5.300 \u00a0 Maximum resident set size (kbytes): 73684  #11 5.300 \u00a0 Average resident set size (kbytes): 0  #11 5.300 \u00a0 Major (requiring I\/O) page faults: 5  #11 5.300 \u00a0 Minor (reclaiming a frame) page faults: 173258  #11 5.300 \u00a0 Voluntary context switches: 3829  #11 5.300 \u00a0 Involuntary context switches: 175  #11 5.300 \u00a0 Swaps: 0  #11 5.300 \u00a0 File system inputs: 592  #11 5.300 \u00a0 File system outputs: 59472  #11 5.300 \u00a0 Socket messages sent: 0  #11 5.300 \u00a0 Socket messages received: 0  #11 5.300 \u00a0 Signals delivered: 0  #11 5.300 \u00a0 Page size (bytes): 4096  #11 5.300 \u00a0 Exit status: 0  #11 DONE 5.3s<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432\u0441\u0435 \u043a\u0443\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0435\u0441\u043b\u0438 \u043c\u044b c\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 sync, \u0442\u043e \u043f\u043e \u0442\u0440\u0435\u0439\u0441\u0443 \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0437\u0430 0.6 \u0441\u0435\u043a\u0443\u043d\u0434 \u2014 \u0447\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435\u043f\u0440\u0430\u0432\u0434\u0430.<\/p>\n<pre><code class=\"vbscript\">#12 [backend_uv stage-0 6\/6] RUN time -v uv sync  #12 0.260 Resolved 57 packages in 0.62ms  #12 0.399 Uninstalled 15 packages in 136ms  #12 0.399\u00a0 - certifi==2025.1.31  #12 0.399\u00a0 - charset-normalizer==3.4.1  #12 0.399\u00a0 - django-stubs==1.14.0  #12 0.399\u00a0 - django-stubs-ext==5.1.3  #12 0.399\u00a0 - djangorestframework-stubs==1.8.0  #12 0.399\u00a0 - idna==3.10  #12 0.399\u00a0 - mypy==1.15.0  #12 0.399\u00a0 - mypy-extensions==1.0.0  #12 0.399\u00a0 - requests==2.32.3  #12 0.399\u00a0 - ruff==0.9.10  #12 0.399\u00a0 - tomli==2.2.1  #12 0.399\u00a0 - types-pytz==2025.1.0.20250204  #12 0.399\u00a0 - types-pyyaml==6.0.12.20241230  #12 0.399\u00a0 - types-requests==2.32.0.20250306  #12 0.399\u00a0 - urllib3==2.3.0  #12 0.402 \u00a0 Command being timed: \"uv sync\"  #12 0.402 \u00a0 User time (seconds): 0.01  #12 0.402 \u00a0 System time (seconds): 0.13  #12 0.402 \u00a0 Percent of CPU this job got: 96%  #12 0.402 \u00a0 Elapsed (wall clock) time (h:mm:ss or m:ss): 0m 0.15s  #12 0.402 \u00a0 Average shared text size (kbytes): 0  #12 0.402 \u00a0 Average unshared data size (kbytes): 0  #12 0.402 \u00a0 Average stack size (kbytes): 0  #12 0.402 \u00a0 Average total size (kbytes): 0  #12 0.402 \u00a0 Maximum resident set size (kbytes): 25984  #12 0.402 \u00a0 Average resident set size (kbytes): 0  #12 0.402 \u00a0 Major (requiring I\/O) page faults: 0  #12 0.402 \u00a0 Minor (reclaiming a frame) page faults: 1777  #12 0.402 \u00a0 Voluntary context switches: 62  #12 0.402 \u00a0 Involuntary context switches: 12  #12 0.402 \u00a0 Swaps: 0  #12 0.402 \u00a0 File system inputs: 40  #12 0.402 \u00a0 File system outputs: 0  #12 0.402 \u00a0 Socket messages sent: 0  #12 0.402 \u00a0 Socket messages received: 0  #12 0.402 \u00a0 Signals delivered: 0  #12 0.402 \u00a0 Page size (bytes): 4096  #12 0.402 \u00a0 Exit status: 0  #12 DONE 0.4s<\/code><\/pre>\n<p>\u041f\u043e\u044f\u0441\u043d\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0446\u0438\u0444\u0440\u044b \u0432\u0440\u0443\u0442. Uv \u0442\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u044d\u0448\u0438 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f (\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/docs.astral.sh\/uv\/concepts\/cache\/#dependency-caching\">\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0443\u0442<\/a>). \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u0435\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b -n &#8212;reinstall \u043a uv sync, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<pre><code class=\"python\">\/app # time -v uv sync -n --reinstall  Resolved 58 packages in 0.74ms  \u00a0\u00a0Built pytest-sugar==0.9.4  Prepared 40 packages in 2.82s  Uninstalled 40 packages in 427ms  \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 [0\/40] Installing wheels... \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 warning: Failed to hardlink files; falling back to full copy. This may lead to degraded performance.  \u00a0\u00a0\u00a0\u00a0\u00a0If the cache and target directories are on different filesystems, hardlinking may not be supported.  \u00a0\u00a0\u00a0\u00a0\u00a0If this is intentional, set export UV_LINK_MODE=copy or use --link-mode=copy to suppress this warning.  Installed 40 packages in 313ms  \u00a0\u00a0\u00a0\u00a0Command being timed: \"uv sync -n --reinstall\"  \u00a0\u00a0\u00a0\u00a0User time (seconds): 1.13  \u00a0\u00a0\u00a0\u00a0System time (seconds): 2.86  \u00a0\u00a0\u00a0\u00a0Percent of CPU this job got: 99%  \u00a0\u00a0\u00a0\u00a0Elapsed (wall clock) time (h:mm:ss or m:ss): 0m 4.00s  \u00a0\u00a0\u00a0\u00a0Average shared text size (kbytes): 0  \u00a0\u00a0\u00a0\u00a0Average unshared data size (kbytes): 0  \u00a0\u00a0\u00a0\u00a0Average stack size (kbytes): 0  \u00a0\u00a0\u00a0\u00a0Average total size (kbytes): 0  \u00a0\u00a0\u00a0\u00a0Maximum resident set size (kbytes): 59764  \u00a0\u00a0\u00a0\u00a0Average resident set size (kbytes): 0  \u00a0\u00a0\u00a0\u00a0Major (requiring I\/O) page faults: 0  \u00a0\u00a0\u00a0\u00a0Minor (reclaiming a frame) page faults: 127023  \u00a0\u00a0\u00a0\u00a0Voluntary context switches: 31795  \u00a0\u00a0\u00a0\u00a0Involuntary context switches: 870  \u00a0\u00a0\u00a0\u00a0Swaps: 0  \u00a0\u00a0\u00a0\u00a0File system inputs: 0  \u00a0\u00a0\u00a0\u00a0File system outputs: 446232  \u00a0\u00a0\u00a0\u00a0Socket messages sent: 0  \u00a0\u00a0\u00a0\u00a0Socket messages received: 0  \u00a0\u00a0\u00a0\u00a0Signals delivered: 0  \u00a0\u00a0\u00a0\u00a0Page size (bytes): 4096  \u00a0\u00a0\u00a0\u00a0Exit status: 0<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0446\u0438\u0444\u0440\u044b \u0443\u0436\u0435 \u0431\u043b\u0438\u0436\u0435 \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u043d\u044f\u043b\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438 100% CPU (60\u041c\u0411 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438). \u042d\u0442\u043e \u0447\u0443\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0435\u0435, \u0447\u0435\u043c poetry, \u043d\u043e \u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u0432\u044b\u0438\u0433\u0440\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u0432\u0435\u0434\u044c \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0430\u0440\u0445\u0438\u0432\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u00ab\u043d\u0430 \u0433\u043e\u0440\u044f\u0447\u0443\u044e\u00bb, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u044d\u0448\u0438, \u0442\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u043e\u043c\u0435\u0435 (\u043a\u0430\u043a \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 uv sync).<\/p>\n<h3>\u041e\u0442\u043b\u0438\u0447\u0438\u0435 lock \u0444\u0430\u0439\u043b\u0430 \u0432 poetry \u0438 \u0432 uv<\/h3>\n<p><a class=\"anchor\" name=\"otlichielockfaila\" id=\"otlichielockfaila\"><\/a><\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443 \u2014 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 uv.lock \u0438 poetry.lock \u043d\u0435\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0438 \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 <a href=\"https:\/\/peps.python.org\/pep-0751\/\">PEP 751<\/a>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043d\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 <a href=\"https:\/\/github.com\/aquasecurity\/trivy\/pull\/8080\">trivy<\/a>.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0f4\/cb2\/c55\/0f4cb2c5544b280a76ed70bc8412f6e3.png\" width=\"1600\" height=\"300\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0f4\/cb2\/c55\/0f4cb2c5544b280a76ed70bc8412f6e3.png\"\/><\/figure>\n<h3>\u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a rye\u2026<\/h3>\n<p><a class=\"anchor\" name=\"inaposledok\" id=\"inaposledok\"><\/a><\/p>\n<p>\u2026\u043d\u043e \u0435\u0433\u043e \u043c\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u041f\u043e\u0447\u0435\u043c\u0443? \u0410 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e uv \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 rye, \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 <a href=\"https:\/\/rye.astral.sh\/guide\/docker\/#explanations\">\u043d\u0430 \u0431\u0430\u0437\u0435 uv,<\/a> \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442. \u041a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, rye, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 docker.\u00a0\u00a0<\/p>\n<p>\u041d\u043e \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e\u0434 rye. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c pyproject.toml.\u00a0<\/p>\n<pre><code class=\"python\">[tool.rye]  universal = true  virtual = true<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 rye sync. \u042d\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u0435\u0442 uv \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430 requirements.lock \u0438 requirements-dev.lock, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 virtualenv \u0432 \u043f\u0430\u043f\u043a\u0435 .venv.<\/p>\n<p>Dockerfile \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\"> FROM python:3.12-alpine  COPY --from=ghcr.io\/astral-sh\/uv:0.6.5 \/uv \/uvx \/bin\/  # Set environment variables  ENV PYTHONUNBUFFERED 1  ENV PYTHONWARNINGS ignore  ENV CURL_CA_BUNDLE \"\"  ENV POETRY_VIRTUALENVS_CREATE true  ENV PATH \"${PATH}:\/root\/.local\/bin\"  # Expose port 8000  EXPOSE 8000\/tcp  # Set the working directory for the application  WORKDIR \/app  # Copy just the dependencies installation from the current directory to the Docker image  COPY . \/app\/  RUN time -v uv pip install --no-cache --system -r requirements.lock  # Copy wait-for script and give it necessary permissions  COPY wait-for \/usr\/bin\/  RUN chmod +x \/usr\/bin\/wait-for  # Give necessary permissions to entrypoint  RUN chmod +x entrypoint.*<\/code><\/pre>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0448\u043b\u0430 \u0437\u0430 7.4 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u0412 \u0446\u0435\u043b\u043e\u043c, \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e.\u00a0<\/p>\n<pre><code class=\"vbscript\">#11 [backend_rye stage-0 5\/8] RUN time -v uv pip install --no-cache --system -r requirements.lock  \u2026  #11 7.276 \u00a0 Command being timed: \"uv pip install --no-cache --system -r requirements.lock\"  #11 7.276 \u00a0 User time (seconds): 2.03  #11 7.276 \u00a0 System time (seconds): 2.68  #11 7.276 \u00a0 Percent of CPU this job got: 66%  #11 7.276 \u00a0 Elapsed (wall clock) time (h:mm:ss or m:ss): 0m 7.04s  #11 7.276 \u00a0 Average shared text size (kbytes): 0  #11 7.276 \u00a0 Average unshared data size (kbytes): 0  #11 7.276 \u00a0 Average stack size (kbytes): 0  #11 7.276 \u00a0 Average total size (kbytes): 0  #11 7.276 \u00a0 Maximum resident set size (kbytes): 74864  #11 7.276 \u00a0 Average resident set size (kbytes): 0  #11 7.276 \u00a0 Major (requiring I\/O) page faults: 185  #11 7.276 \u00a0 Minor (reclaiming a frame) page faults: 247591  #11 7.276 \u00a0 Voluntary context switches: 33758  #11 7.276 \u00a0 Involuntary context switches: 313  #11 7.276 \u00a0 Swaps: 0  #11 7.276 \u00a0 File system inputs: 30312  #11 7.276 \u00a0 File system outputs: 259792  #11 7.276 \u00a0 Socket messages sent: 0  #11 7.276 \u00a0 Socket messages received: 0  #11 7.276 \u00a0 Signals delivered: 0  #11 7.276 \u00a0 Page size (bytes): 4096  #11 7.276 \u00a0 Exit status: 0  #11 DONE 7.4s<\/code><\/pre>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p><a class=\"anchor\" name=\"zakluchenie\" id=\"zakluchenie\"><\/a><\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 Poetry, uv \u0438 rye \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 Python. Poetry \u0432\u0441\u0435 \u0435\u0449\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0437\u0440\u0435\u043b\u043e\u0433\u043e \u0438 \u043c\u043d\u043e\u0433\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f uv \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. Rye, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u044f uv, \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u043e \u0435\u0433\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0447\u0443\u0442\u044c \u0438\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043d\u0435\u0436\u0435\u043b\u0438 \u0432 poetry \u0438 uv.<\/p>\n<p>\u0412 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043c\u044b \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u0447\u0430\u043b\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 uv, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e \u0442\u0435\u0441\u0442\u0430\u043c \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0443 \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u043d \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0441\u0435\u0431\u044f \u0441 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b.<\/p>\n<p><a href=\"https:\/\/github.com\/egor1344\/rye_poetry_compare_habr\">\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<\/p>\n<p>\u041d\u0443 \u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043b\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u0432\u0438\u0434\u0435\u043d\u0438\u0435 \u2014 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \ud83d\ude42<\/p>\n<\/p>\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\/articles\/894552\/\"> https:\/\/habr.com\/ru\/articles\/894552\/<\/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<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0441 \u0432\u0430\u043c\u0438 \u0441\u043d\u043e\u0432\u0430 \u0415\u0433\u043e\u0440, Tech Lead \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438<a href=\"https:\/\/idaproject.com\/\"> \u0418\u0434\u0430\u041f\u0440\u043e\u0434\u0436\u0435\u043a\u0442<\/a>. \u042f \u0432\u0441\u0435 \u0435\u0449\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 backend-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \ud83d\ude42<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430-\u0442\u043e \u0434\u0430\u0432\u043d\u043e (\u043f\u043e \u043c\u0435\u0440\u043a\u0430\u043c IT), \u0448\u0435\u0441\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434, \u043c\u044b \u0441\u0445\u043e\u0434\u0438\u043b\u0438 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e \u0438 \u043f\u043e\u0441\u043b\u0443\u0448\u0430\u043b\u0438 \u043f\u0440\u043e poetry, \u043f\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b\u0438\u0441\u044c \u0438 \u0432\u043d\u0435\u0434\u0440\u0438\u043b\u0438 \u0435\u0433\u043e \u0443 \u0441\u0435\u0431\u044f \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u041d\u043e \u043d\u0438\u0447\u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u0432\u043e\u0442 \u0443\u0436\u0435 \u0434\u0432\u0430 \u0433\u043e\u0434\u0430 \u043c\u0438\u0440 \u0437\u043d\u0430\u0435\u0442 \u043e uv, \u0430 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0435\u0449\u0435 \u0438 rye. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u043e\u0441\u0432\u044f\u0442\u0438\u043b \u043f\u0430\u0440\u0443 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u044d\u0442\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0430\u0448\u0438\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043c poetry, uv \u0438 rye: \u043a\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 Docker, \u0438 \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432 2025 \u0433\u043e\u0434\u0443. \u0417\u0430\u043e\u0434\u043d\u043e \u043f\u0440\u043e\u0431\u0435\u0436\u0438\u043c\u0441\u044f \u043f\u043e \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0430\u0440\u0443 \u043d\u043e\u0432\u044b\u0445 PEP \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<h3>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p><strong>\u2192<\/strong>  <a href=\"#chtotakoerye\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 rye \u0438 \u0435\u0433\u043e \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#chtotakoepoetry\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 poetry \u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043e\u043d \u0440\u0435\u0448\u0438\u043b \u0432 2019<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#ikakoizepoetry\">\u0418 \u043a\u0430\u043a\u043e\u0439 \u0436\u0435 poetry \u0432 2025?<\/a><\/p>\n<p>\u2192  <a href=\"#nashtipichnyiproekt\">\u041d\u0430\u0448 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 Poetry, \u0438 \u043a\u0430\u043a \u043e\u043d \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 Docker<\/a>  <\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#metrikiposborke\">\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#perevedemproektdlya\">\u041f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f uv<\/a> <\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#metrikiposborke\">\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#otlichielockfaila\">\u041e\u0442\u043b\u0438\u0447\u0438\u0435 lock \u0444\u0430\u0439\u043b\u0430 \u0432 poetry \u0438 \u0432 uv<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#inaposledok\">\u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a rye&#8230;<\/a><\/p>\n<p><strong>\u2192<\/strong>  <a href=\"#zakluchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 rye \u0438 \u0435\u0433\u043e \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f<\/h3>\n<p><a class=\"anchor\" name=\"chtotakoerye\" id=\"chtotakoerye\"><\/a><\/p>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f 0.43.0) <a href=\"https:\/\/rye.astral.sh\/\">rye<\/a> \u2014 \u044d\u0442\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <strong>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438<\/strong> \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438. \u041a \u043d\u0435\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043a \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 python-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 \u0441\u0431\u043e\u0440\u043a\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, rye \u0437\u0430\u043c\u0430\u0445\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u043b\u0438\u043d\u0442\u0438\u043d\u0433 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u2014 \u043f\u0435\u0440\u0435\u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 <a href=\"https:\/\/peps.python.org\/pep-0008\/\">PEP 8<\/a>.\u00a0<\/p>\n<p>\u0412 \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 rye \u0445\u043e\u0447\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u043b\u043e\u0439\u043a\u043e\u0439, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0442\u0438 \u0432\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u0434 python.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 rye, \u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u044c \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e, \u043f\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043e \u0435\u0433\u043e <a href=\"https:\/\/rye.astral.sh\/philosophy\/\">\u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u0438<\/a>. \u0410\u0432\u0442\u043e\u0440 rye, <a href=\"https:\/\/github.com\/mitsuhiko\">Armin Ronacher<\/a> (\u0441\u043e\u0437\u0434\u0430\u043b \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <a href=\"https:\/\/palletsprojects.com\/\">\u043f\u0440\u043e\u0435\u043a\u0442\u044b Pallets<\/a>, \u043a\u0443\u0434\u0430 \u0432\u0445\u043e\u0434\u0438\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 Flask) \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u044f\u0437\u044b\u043a rust \u0438 \u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b (<a href=\"https:\/\/rust-lang.github.io\/rustup\/\">rustup<\/a> \u0438 <a href=\"https:\/\/doc.rust-lang.org\/cargo\/\">cargo<\/a>) \u043a\u0430\u043a \u043d\u0430 \u0446\u0435\u043b\u044c, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u044c\u0441\u044f python-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430.\u00a0<\/p>\n<p>\u041e\u0431\u0449\u0438\u0435 \u0446\u0435\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0441\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0443\u043d\u043a\u0442\u0430\u043c:<\/p>\n<ul>\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 python \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 <a href=\"https:\/\/peps.python.org\/pep-0711\/\">PEP 771<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u043f\u0440\u0438\u0439\u0442\u0438 \u043a <a href=\"https:\/\/habr.com\/ru\/sandbox\/228198\/\">semver<\/a> \u043a\u0430\u043a \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 Lockfiles (\u0441\u0435\u0439\u0447\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0434\u0440\u0430\u0444\u0442 <a href=\"https:\/\/peps.python.org\/pep-0751\/\">PEP 751<\/a>) \u0438 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f uv.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 virtualenv.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043b\u0430\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0435\u0435, \u043d\u043e \u043f\u043e\u043a\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a rye \u00ab\u043b\u044f\u0436\u0435\u0442\u00bb \u043d\u0430 \u043d\u0430\u0448 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0438 \u043e\u0446\u0435\u043d\u0438\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c, \u0430 \u043d\u0435 \u0441 poetry (\u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0443 \u043d\u0430\u0441 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443).<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 rye, \u043f\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c <a href=\"https:\/\/habr.com\/ru\/articles\/842134\/\">\u0432 \u043e\u0431\u0437\u043e\u0440\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/a><\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 poetry \u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043e\u043d \u0440\u0435\u0448\u0438\u043b \u0432 2019<\/h3>\n<p><a class=\"anchor\" name=\"chtotakoepoetry\" id=\"chtotakoepoetry\"><\/a><\/p>\n<p>\u0414\u043e <a href=\"https:\/\/python-poetry.org\/\">Poetry<\/a> \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 Python \u0431\u044b\u043b\u043e \u0431\u043e\u043b\u044c\u044e. \u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u0432\u0435\u0440\u0441\u0438\u0439, \u0440\u0443\u0447\u043d\u0430\u044f \u043f\u0440\u0430\u0432\u043a\u0430 requirements.txt \u2014 \u0437\u043d\u0430\u043a\u043e\u043c\u043e? Poetry \u044d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b.\u00a0<\/p>\n<p>Pyproject.toml \u0441\u0442\u0430\u043b \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0433\u0434\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. poetry.lock \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u0441\u0435\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0433\u0430\u0434\u0430\u0442\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0445 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. Poetry \u0434\u0430\u043b \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0431\u043e\u0440\u043e\u043a. Requirements.txt \u0443\u0448\u0435\u043b \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u043d \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u0443\u0441\u0442\u0443\u043f\u0438\u0432 \u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u0443 \u0441 lock-\u0444\u0430\u0439\u043b\u0430\u043c\u0438.<\/p>\n<p>\u041f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u00ab\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c\u00bb \u0432 \u0432\u0438\u0434\u0435 <strong>pyproject.toml<\/strong>, \u0433\u0434\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u0438 dev-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043b\u0438\u043d\u0442\u0438\u043d\u0433\u0430 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430. Poetry \u0441\u0430\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u0435\u0439\u0441\u0430\u0445 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0438\u0437 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 virtualenv \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439. \u0422\u0430\u043a\u0436\u0435 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u043a IDE \u0431\u0435\u0437 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439: \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. IDE \u043c\u043e\u0433\u0443\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0438 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430. \u042d\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u0438\u0440\u0443\u0435\u0442 \u0441 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0433\u0434\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u00ab\u043a\u0430\u043a \u043f\u043e\u043f\u0430\u043b\u043e\u00bb, \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u0447\u0442\u043e \u0432\u043b\u0435\u043a\u043b\u043e \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 IDE \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e, \u0442\u043e poetry \u0434\u0430\u043b \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043c\u043d\u043e\u0433\u043e\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0449\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.\u00a0<\/p>\n<h3>\u0418 \u043a\u0430\u043a\u043e\u0439 \u0436\u0435 poetry \u0432 2025?<\/h3>\n<p><a class=\"anchor\" name=\"ikakoizepoetry\" id=\"ikakoizepoetry\"><\/a><\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 poetry \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0438 \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434. \u0412 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043b\u0438\u0437\u0430\u0445 poetry \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u043e\u0441\u044c <a href=\"https:\/\/python-poetry.org\/blog\/announcing-poetry-2.1.0\/#experimental-commands-to-manage-python-installations\">\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 python<\/a>, \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0430\u0441\u044c <a href=\"https:\/\/python-poetry.org\/blog\/announcing-poetry-2.1.0\/#changed\">\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/a>.\u00a0<\/p>\n<h3>\u041d\u0430\u0448 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 Poetry, \u0438 \u043a\u0430\u043a \u043e\u043d \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 Docker<\/h3>\n<p><a class=\"anchor\" name=\"nashtipichnyiproekt\" id=\"nashtipichnyiproekt\"><\/a><\/p>\n<p>\u0414\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u2014 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043d\u0443\u0436\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.\u00a0<\/p>\n<pre><code class=\"python\">[tool.poetry.dependencies]  # core  python = \"3.12.*\"  Django = \"4.2.*\"  psycopg2-binary = \"2.9.*\"  django-redis = \"5.4.*\"  gunicorn = \"^20.1.0\"  # Models \\ Admin  phonenumbers = \"^8.12.29\"  django-phonenumber-field = \"5.2.*\"  # Rest  djangorestframework = \"3.14.*\"  drf-spectacular = \"0.24.*\"  django-filter = \"22.*\"  # Test  factory-boy = \"^3.2.0\"  pytest = \"^6.2.4\"  pytest-mock = \"^3.6.1\"  pytest-cov = \"^2.12.1\"  pytest-django = \"^4.4.0\"  pytest-sugar = \"^0.9.4\"  # Others  Pillow = \"10.0.1\"  [poetry.group.dev.dependencies]  django-debug-toolbar = \"^3.2.1\"  # linting  ruff = \"0.0.*\"  # Typehinting  mypy = \"1.*\"  mypy-extensions = \"1.*\"  django-stubs = \"1.14.*\"  djangorestframework-stubs=\"1.8.*\" <\/code><\/pre>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0442\u043e\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u0431\u0435\u0437 \u0438\u0437\u043b\u0438\u0448\u0435\u0441\u0442\u0432:<\/p>\n<pre><code class=\"vbscript\"> FROM python:3.12-alpine  # Set environment variables  ENV PYTHONUNBUFFERED 1  ENV PYTHONWARNINGS ignore  ENV CURL_CA_BUNDLE \"\"  ENV POETRY_VIRTUALENVS_CREATE true  ENV PATH \"${PATH}:\/root\/.local\/bin\"  # Expose port 8000  EXPOSE 8000\/tcp  # Set the working directory for the application  WORKDIR \/app  # Copy just the dependencies installation from the current directory to the Docker image  COPY pyproject.toml poetry.lock \/app\/  # Install necessary dependencies  RUN set -ex; \\  \u00a0\u00a0\u00a0apk update; \\  \u00a0\u00a0\u00a0apk add --no-cache --virtual build-deps \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0git \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0gcc \\  \u00a0\u00a0\u00a0&amp;&amp; rm -rf \/var\/lib\/apt\/lists\/* \\  \u00a0\u00a0\u00a0&amp;&amp; pip install --no-cache-dir --user poetry==2.1.0 \\  \u00a0\u00a0\u00a0&amp;&amp; poetry install --no-interaction --no-ansi \\  \u00a0\u00a0\u00a0&amp;&amp; pip install\u00a0 --no-cache-dir --user requests \\  \u00a0\u00a0\u00a0&amp;&amp; apk del --no-cache build-deps  # Create link python interpritator  RUN ln -sf $(poetry env info -e) \/python  # Copy wait-for script and give it necessary permissions  COPY wait-for \/usr\/bin\/  RUN chmod +x \/usr\/bin\/wait-for  # Copy the current directory contents into the container  COPY . \/app\/  # Give necessary permissions to entrypoint  RUN chmod +x entrypoint.*<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0446\u0435\u043b\u044c\u044e \u0441\u0442\u0430\u0442\u044c\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435 poetry, rue \u0438 uv, \u043c\u044b \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u0432 Docker-\u0444\u0430\u0439\u043b\u0430\u0445 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u043e\u0432.\u00a0<\/p>\n<h3>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/h3>\n<p><a class=\"anchor\" name=\"metrikiposborke\" id=\"metrikiposborke\"><\/a><\/p>\n<p>\u0414\u043b\u044f \u0437\u0430\u043c\u0435\u0440\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c Dockerfile \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"python\"># Install necessary dependencies  RUN set -ex; \\  \u00a0\u00a0\u00a0apk update; \\  \u00a0\u00a0\u00a0apk add --no-cache --virtual build-deps \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0curl \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0git \\  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0gcc \\  \u00a0\u00a0\u00a0&amp;&amp; rm -rf \/var\/lib\/apt\/lists\/* \\  \u00a0\u00a0\u00a0&amp;&amp; pip install --no-cache-dir --user poetry==2.1.0  RUN time -v poetry lock # \u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439  RUN time -v poetry install --no-interaction --no-ansi --all-groups # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439  RUN pip install\u00a0 --no-cache-dir --user requests \\  \u00a0\u00a0\u00a0&amp;&amp; apk del --no-cache build-deps<\/code><\/pre>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>docker compose -f docker-compose.yml build backend_poetry --no-cache --progress plain<\/code> \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0431\u043e\u0440\u043a\u0443. \u041e\u043f\u0446\u0438\u044f <code>--progress plain<\/code> \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u043b\u043e\u0433\u0438 \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<p>\u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0437\u0430\u043d\u044f\u043b\u043e 10 \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<pre><code class=\"vbscript\">#9 [backend_poetry\u00a0 5\/12] RUN time -v poetry lock  #9 0.944 Creating virtualenv uv,_poetry_compare-9TtSrW0h-py3.12 in \/root\/.cache\/pypoetry\/virtualenvs  #9 1.449 Resolving dependencies...  #9 10.29\u00a0 \u00a0 Command being timed: \"poetry lock\"  #9 10.29\u00a0 \u00a0 User time (seconds): 2.63  #9 10.29\u00a0 \u00a0 System time (seconds): 0.95  #9 10.29\u00a0 \u00a0 Percent of CPU this job got: 36%  #9 10.29\u00a0 \u00a0 Elapsed (wall clock) time (h:mm:ss or m:ss): 0m 9.95s  #9 10.29\u00a0 \u00a0 Average shared text size (kbytes): 0  #9 10.29\u00a0 \u00a0 Average unshared data size (kbytes): 0  #9 10.29\u00a0 \u00a0 Average stack size (kbytes): 0  #9 10.29\u00a0 \u00a0 Average total size (kbytes): 0  #9 10.29\u00a0 \u00a0 Maximum resident set size (kbytes): 88424  #9 10.29\u00a0 \u00a0 Average resident set size (kbytes): 0  #9 10.29\u00a0 \u00a0 Major (requiring I\/O) page faults: 0  #9 10.29\u00a0 \u00a0 Minor (reclaiming a frame) page faults: 138441  #9 10.29\u00a0 \u00a0 Voluntary context switches: 388  #9 10.29\u00a0 \u00a0 Involuntary context switches: 138  #9 10.29\u00a0 \u00a0 Swaps: 0  #9 10.29\u00a0 \u00a0 File system inputs: 24  #9 10.29\u00a0 \u00a0 File system outputs: 55896  #9 10.29\u00a0 \u00a0 Socket messages sent: 0  #9 10.29\u00a0 \u00a0 Socket messages received: 0  #9 10.29\u00a0 \u00a0 Signals delivered: 0  #9 10.29\u00a0 \u00a0 Page size (bytes): 4096  #9 10.29\u00a0 \u00a0 Exit status: 0  #9 DONE 10.3s<\/code><\/pre>\n<p>\u041f\u043e \u0442\u0440\u0435\u0439\u0441\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0438\u043a\u043e\u0432\u0430\u044f \u0434\u043e\u043b\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 CPU \u0437\u0430\u043d\u044f\u043b\u0430 \u0431\u044b 36%, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e 88 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442. \u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u0443\u0434\u0440\u0443\u0447\u0430\u0435\u0442.<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e poetry \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043f\u044f\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434. \u041f\u043e CPU \u0443\u0445\u043e\u0434\u0438\u043b\u043e \u0432 100%, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u0448\u043b\u043e 88 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442.<\/p>\n<pre><code class=\"vbscript\">#10 [backend_poetry\u00a0 6\/12] RUN time poetry install --no-interaction --no-ansi --all-groups  \u2026  #10 4.846 \u00a0 Command being timed: \"poetry install --no-interaction --no-ansi --all-groups\"  #10 4.846 \u00a0 User time (seconds): 2.48  #10 4.846 \u00a0 System time (seconds): 2.03  #10 4.846 \u00a0 Percent of CPU this job got: 100%  #10 4.846 \u00a0 Elapsed (wall clock) time (h:mm:ss or m:ss): 0m 4.48s  #10 4.846 \u00a0 Average<\/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-454230","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/454230","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=454230"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/454230\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=454230"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=454230"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=454230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}