{"id":100873,"date":"2025-03-10T07:04:49","date_gmt":"2025-03-10T03:34:49","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/"},"modified":"2025-03-10T07:04:49","modified_gmt":"2025-03-10T03:34:49","slug":"deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/","title":{"rendered":"\u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u06cc\u06a9 \u0645\u062f\u0644 R \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 API \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0634\u062f\u0647 \u0628\u0627 \u062f\u0627\u06a9\u0631 \u060c \u0644\u0648\u0644\u0647 \u06a9\u0634\u06cc \u0648 RENV"},"content":{"rendered":"<div data-article-id=\"2319813\" id=\"article-body\">\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a \u060c \u0645\u0646 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u06a9\u0644 \u0641\u0631\u0622\u06cc\u0646\u062f \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0645\u062f\u0644 R \u0642\u062f\u0645 \u0645\u06cc \u0632\u0646\u0645 \u060c \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 API \u0622\u0631\u0627\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0628\u0633\u062a\u0647 \u0644\u0648\u0644\u0647 \u06a9\u0634\u06cc \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0648\u0631\u0648\u062f \u062f\u0642\u06cc\u0642 \u0628\u0647 \u0622\u0646 \u0645\u06cc \u067e\u0631\u062f\u0627\u0632\u0645. \u0645\u0627 \u0647\u0631 \u0645\u0631\u062d\u0644\u0647 \u0631\u0627 \u067e\u0648\u0634\u0634 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f \u060c \u0627\u0632 \u062c\u0645\u0644\u0647 \u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc \u0645\u0648\u0636\u0648\u0639\u0627\u062a \u0631\u0627\u06cc\u062c (\u0645\u0627\u0646\u0646\u062f \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u06af\u0645\u0634\u062f\u0647) \u0648 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u062a\u06a9\u0631\u0627\u0631\u067e\u0630\u06cc\u0631\u06cc \u0628\u0627 RENV. \u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u060c \u0634\u0645\u0627 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 Docker \u062e\u0648\u0627\u0647\u06cc\u062f \u062f\u0627\u0634\u062a \u06a9\u0647 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u0627\u0646\u062a\u0647\u0627\u06cc\u06cc API \u062f\u0631 \u062e\u062f\u0645\u062a \u0645\u062f\u0644 \u0634\u0645\u0627 \u0627\u0633\u062a &#8211; \u0622\u0645\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u062d\u0644\u06cc \u06cc\u0627 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0628\u0647 \u062e\u062f\u0645\u0627\u062a \u0627\u0628\u0631\u06cc \u0645\u0627\u0646\u0646\u062f AWS.<\/p>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u0644 \u06a9\u062f \u0648 dockerfiles \u0631\u0627 \u062f\u0631 repo github \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#1_%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%AC%D9%85%D8%A7%D9%84%DB%8C_%D9%88_%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\" >1. \u0628\u0631\u0631\u0633\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc \u0648 \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#2_%D8%B3%D8%A7%D8%AE%D8%AA%D9%85%D8%A7%D9%86_%D9%88_%D8%B5%D8%B1%D9%81%D9%87_%D8%AC%D9%88%DB%8C%DB%8C_%D8%AF%D8%B1_%DB%8C%DA%A9_%D9%85%D8%AF%D9%84_R\" >2. \u0633\u0627\u062e\u062a\u0645\u0627\u0646 \u0648 \u0635\u0631\u0641\u0647 \u062c\u0648\u06cc\u06cc \u062f\u0631 \u06cc\u06a9 \u0645\u062f\u0644 R<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#3_%D8%B3%D8%A7%D8%AE%D8%AA%D9%86_%D8%AA%D8%B5%D9%88%DB%8C%D8%B1_%D9%BE%D8%A7%DB%8C%D9%87_%D8%A8%D8%A7_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7%DB%8C_%D8%B3%DB%8C%D8%B3%D8%AA%D9%85_%D9%88_RENV\" >3. \u0633\u0627\u062e\u062a\u0646 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647 \u0628\u0627 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u0648 RENV<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#4_%D8%AA%D8%B5%D9%88%DB%8C%D8%B1_%D9%85%D8%AF%D9%84_%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DB%8C_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%AA%D9%88%D8%B3%D8%B9%D9%87_%D8%B3%D8%B1%DB%8C%D8%B9\" >4. \u062a\u0635\u0648\u06cc\u0631 \u0645\u062f\u0644 \u062a\u06a9\u0631\u0627\u0631\u06cc \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u0633\u0631\u06cc\u0639<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#5_%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7%DB%8C_R_%D8%A8%D8%A7_RENV\" >5. \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc R \u0628\u0627 RENV<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#6_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_%D9%86%D9%82%D8%B7%D9%87_%D9%BE%D8%A7%DB%8C%D8%A7%D9%86%DB%8C_API_%D9%84%D9%88%D9%84%D9%87_%DA%A9%D8%B4%DB%8C\" >6. \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc API \u0644\u0648\u0644\u0647 \u06a9\u0634\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#7_%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%D8%B4_API\" >7. \u0622\u0632\u0645\u0627\u06cc\u0634 API<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D8%AD%D9%84%D9%82%D9%87\" >\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062d\u0644\u0642\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D9%BE%D8%B3%D8%AA%DA%86%DB%8C\" >\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u0633\u062a\u0686\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D8%A8%D8%B3%D8%AA%D9%87_HTTR_R\" >\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0628\u0633\u062a\u0647 HTTR R<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#%D8%B9%DB%8C%D8%A8_%DB%8C%D8%A7%D8%A8%DB%8C\" >\u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#1_%DA%A9%D8%A7%D9%86%D8%AA%DB%8C%D9%86%D8%B1_%D8%AF%D8%B1_%D9%86%D8%B5%D8%A8_%DB%8C%DA%A9_%D8%A8%D8%B3%D8%AA%D9%87_%D9%86%D8%A7%DA%A9%D8%A7%D9%85_%D8%A7%D8%B3%D8%AA\" >1. \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u062f\u0631 \u0646\u0635\u0628 \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u0646\u0627\u06a9\u0627\u0645 \u0627\u0633\u062a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/deploying-an-r-model-as-a-containerised-api-with-docker-plumber-and-renv-5eo4\/#2_Docker_Volume_Mount\" >2. Docker Volume Mount<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"1_%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%AC%D9%85%D8%A7%D9%84%DB%8C_%D9%88_%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\"><\/span>\n<p>  1. \u0628\u0631\u0631\u0633\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc \u0648 \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u060c \u0645\u0627 \u06cc\u06a9 \u0645\u062f\u0644 \u067e\u06cc\u0634 \u0628\u06cc\u0646\u06cc \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u06a9\u0644\u0627\u0633\u06cc\u06a9 Iris \u0645\u06cc \u0633\u0627\u0632\u06cc\u0645 \u0648 \u06cc\u06a9 \u0637\u0628\u0642\u0647 \u0628\u0646\u062f\u06cc \u06a9\u0646\u0646\u062f\u0647 \u062c\u0646\u06af\u0644\u06cc \u062a\u0635\u0627\u062f\u0641\u06cc \u0631\u0627 \u0622\u0645\u0648\u0632\u0634 \u0645\u06cc \u062f\u0647\u06cc\u0645. \u0633\u067e\u0633 \u06a9\u062f R \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 Docker \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u06cc\u06a9 API \u0627\u0633\u062a\u0631\u0627\u062d\u062a \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0644\u0648\u0644\u0647 \u06a9\u0634\u06cc \u062f\u0631 \u0645\u0639\u0631\u0636 \u062f\u06cc\u062f \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u06cc\u0645. \u0645\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0628\u0633\u062a\u0647 Logger \u060c \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627 \u0631\u0627 \u0628\u0627 RENV \u0628\u0631\u0627\u06cc \u062a\u06a9\u0631\u0627\u0631\u067e\u0630\u06cc\u0631\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u06a9\u0646\u06cc\u0645.<br \/>\u0627\u062c\u0632\u0627\u06cc \u06a9\u0644\u06cc\u062f\u06cc \u0634\u0627\u0645\u0644 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0647\u0633\u062a\u0646\u062f:<\/p>\n<ul>\n<li>\u0622\u0645\u0648\u0632\u0634 \u0645\u062f\u0644 R: \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 RandomForest \u0628\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u062f\u0631 \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc Iris.<\/li>\n<li>Containerisation: \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u062d\u06cc\u0637 R \u062a\u06a9\u0631\u0627\u0631 \u0634\u0648\u0646\u062f\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Docker.<\/li>\n<li>\u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0627\u0628\u0633\u062a\u06af\u06cc: \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 RENV \u0628\u0631\u0627\u06cc \u0642\u0641\u0644 \u06a9\u0631\u062f\u0646 \u0646\u0633\u062e\u0647 \u0647\u0627\u06cc \u0628\u0633\u062a\u0647.<\/li>\n<li>Plumber API: \u0627\u0641\u0634\u0627\u06cc A \/\u067e\u06cc\u0634 \u0628\u06cc\u0646\u06cc \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0628\u0627 \u0645\u0633\u062a\u0646\u062f\u0627\u062a Swagger.<\/li>\n<li>\u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645: \u0648\u0631\u0648\u062f \u062f\u0642\u06cc\u0642 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627 \u0648 \u067e\u0627\u0633\u062e \u0647\u0627\u06cc API \u060c \u0628\u0627 \u0633\u06cc\u0627\u0647\u0647\u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0645\u06cc\u0632\u0628\u0627\u0646.<\/li>\n<\/ul>\n<p>\u0628\u0631\u0627\u06cc \u0646\u0638\u0627\u0631\u062a \u0645\u0624\u062b\u0631 \u062f\u0631 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u0627 \u060c \u0645\u0646 \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u062f\u0648\u06af\u0627\u0646\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0647 \u0627\u0645. \u062f\u0631 <code>outside_container_logs<\/code> \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0633\u06cc\u0627\u0647\u0647\u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062a\u0648\u0633\u0639\u0647 \u0645\u062d\u0644\u06cc \u0631\u0627 \u0636\u0628\u0637 \u0645\u06cc \u06a9\u0646\u062f &#8211; \u0627\u06cc\u0646 \u0634\u0627\u0645\u0644 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc R \u060c \u0633\u0627\u062e\u062a \u0638\u0631\u0641 Docker \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0622\u06cc\u0646\u062f\u0647 \u0627\u0633\u062a. \u062f\u0631 \u0647\u0645\u06cc\u0646 \u062d\u0627\u0644 \u060c \u0633\u06cc\u0627\u0647\u0647\u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0641\u0631\u0622\u06cc\u0646\u062f\u0647\u0627\u06cc \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u062f\u0631 \u062f\u0627\u062e\u0644 \u0638\u0631\u0641 \u0628\u0647 <code>inside_container_logs<\/code>\u060c \u06a9\u0647 \u0631\u0648\u06cc \/\u0628\u0631\u0646\u0627\u0645\u0647 \/\u0633\u06cc\u0627\u0647\u0647\u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0638\u0631\u0641 \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u062c\u062f\u0627\u06cc\u06cc \u0645\u0627 \u0631\u0627 \u0642\u0627\u062f\u0631 \u0645\u06cc \u0633\u0627\u0632\u062f \u062a\u0627 \u0628\u06cc\u0646 \u0641\u0639\u0627\u0644\u06cc\u062a\u0647\u0627\u06cc \u0642\u0628\u0644 \u0627\u0632 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0648 \u0631\u0641\u062a\u0627\u0631 \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627 \u062f\u0631 \u062f\u0627\u062e\u0644 \u0638\u0631\u0641 \u0628\u0647 \u0648\u0636\u0648\u062d \u062a\u0645\u0627\u06cc\u0632 \u0642\u0627\u0626\u0644 \u0634\u0648\u06cc\u0645 \u0648 \u0628\u0647 \u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0648\u062b\u0631 \u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0647\u0631 \u062f\u0648 \u0645\u062d\u06cc\u0637 \u062a\u0648\u0633\u0639\u0647 \u0648 \u062a\u0648\u0644\u06cc\u062f \u0645\u0627 \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0627\u0646\u062a\u0638\u0627\u0631 \u0645\u06cc \u0631\u0648\u062f \u0639\u0645\u0644 \u0645\u06cc \u06a9\u0646\u0646\u062f.<\/p>\n<p><\/p>\n<h2><span class=\"ez-toc-section\" id=\"2_%D8%B3%D8%A7%D8%AE%D8%AA%D9%85%D8%A7%D9%86_%D9%88_%D8%B5%D8%B1%D9%81%D9%87_%D8%AC%D9%88%DB%8C%DB%8C_%D8%AF%D8%B1_%DB%8C%DA%A9_%D9%85%D8%AF%D9%84_R\"><\/span>\n<p>  2. \u0633\u0627\u062e\u062a\u0645\u0627\u0646 \u0648 \u0635\u0631\u0641\u0647 \u062c\u0648\u06cc\u06cc \u062f\u0631 \u06cc\u06a9 \u0645\u062f\u0644 R<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0622\u0645\u0648\u0632\u0634\u06cc (Train.R) \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u06cc\u06a9 \u0645\u062f\u0644 \u062c\u0646\u06af\u0644 \u062a\u0635\u0627\u062f\u0641\u06cc \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 Iris \u0622\u0645\u0648\u0632\u0634 \u0645\u06cc \u062f\u0647\u062f. \u062a\u0648\u062c\u0647 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0645\u062d\u06cc\u0637 (\u062f\u0631 \u062f\u0627\u062e\u0644 \u06cc\u0627 \u062e\u0627\u0631\u062c \u0627\u0632 \u0638\u0631\u0641) \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u060c \u0648 \u0646\u062d\u0648\u0647 \u0636\u0628\u0637 \u0648 \u062c\u0632\u0626\u06cc\u0627\u062a \u0645\u062f\u0644 \u0645\u062f\u0644 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<br \/><code>train.R<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight r\"><code><span class=\"c1\"># train.R<\/span><span class=\"w\">\n<\/span><span class=\"n\">library<\/span><span class=\"p\">(<\/span><span class=\"n\">randomForest<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">library<\/span><span class=\"p\">(<\/span><span class=\"n\">logger<\/span><span class=\"p\">)<\/span><span class=\"w\">\n\n<\/span><span class=\"c1\"># Choose the log directory based on whether \/app\/logs exists (inside container) or not (outside)<\/span><span class=\"w\">\n<\/span><span class=\"n\">log_dir<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"k\">if<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">dir.exists<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"\/app\/logs\"<\/span><span class=\"p\">))<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"\/app\/logs\/R_logs\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"k\">else<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"logs\/outside_container_logs\/R_logs\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n\n<\/span><span class=\"c1\"># Ensure the directory exists; create it if necessary<\/span><span class=\"w\">\n<\/span><span class=\"k\">if<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"n\">dir.exists<\/span><span class=\"p\">(<\/span><span class=\"n\">log_dir<\/span><span class=\"p\">))<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"n\">dir.create<\/span><span class=\"p\">(<\/span><span class=\"n\">log_dir<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">recursive<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"kc\">TRUE<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n\n<\/span><span class=\"c1\"># Create a timestamp for the log file name<\/span><span class=\"w\">\n<\/span><span class=\"n\">timestamp<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">Sys.time<\/span><span class=\"p\">(),<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"%Y%m%d_%H%M%S\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">log_file<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">file.path<\/span><span class=\"p\">(<\/span><span class=\"n\">log_dir<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">paste0<\/span><span class=\"p\">(<\/span><span class=\"n\">timestamp<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"_training.log\"<\/span><span class=\"p\">))<\/span><span class=\"w\">\n\n<\/span><span class=\"c1\"># Configure logger with a unique file name for each run<\/span><span class=\"w\">\n<\/span><span class=\"n\">log_appender<\/span><span class=\"p\">(<\/span><span class=\"n\">appender_file<\/span><span class=\"p\">(<\/span><span class=\"n\">log_file<\/span><span class=\"p\">))<\/span><span class=\"w\">\n\n<\/span><span class=\"n\">log_info<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Starting model training...\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n\n<\/span><span class=\"c1\"># Train a random forest model to classify iris species<\/span><span class=\"w\">\n<\/span><span class=\"n\">data<\/span><span class=\"p\">(<\/span><span class=\"n\">iris<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">model<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">randomForest<\/span><span class=\"p\">(<\/span><span class=\"n\">Species<\/span><span class=\"w\"> <\/span><span class=\"o\">~<\/span><span class=\"w\"> <\/span><span class=\"n\">.<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">data<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">iris<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">ntree<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"m\">100<\/span><span class=\"p\">)<\/span><span class=\"w\">\n\n<\/span><span class=\"n\">log_info<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Model training complete.\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n\n<\/span><span class=\"c1\"># Capture the output of print(model)<\/span><span class=\"w\">\n<\/span><span class=\"n\">model_output<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">capture.output<\/span><span class=\"p\">(<\/span><span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">model<\/span><span class=\"p\">))<\/span><span class=\"w\">\n<\/span><span class=\"c1\"># Log the captured output<\/span><span class=\"w\">\n<\/span><span class=\"n\">log_info<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Model details:\\n{paste(model_output, collapse=\"\\n\")}\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n\n<\/span><span class=\"c1\"># Save the trained model to disk<\/span><span class=\"w\">\n<\/span><span class=\"n\">saveRDS<\/span><span class=\"p\">(<\/span><span class=\"n\">model<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">file<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"data\/model.rds\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">log_info<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Model saved to model.rds.\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0628\u062e\u0634\u06cc \u0627\u0632 \u0633\u0627\u062e\u062a Docker \u062e\u0648\u062f) \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0645\u062f\u0644 \u062e\u0648\u062f \u0648 \u067e\u06cc\u0634\u0631\u0641\u062a \u067e\u06cc\u0634\u0631\u0641\u062a \u0622\u0645\u0648\u0632\u0634 \u0622\u0646.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"3_%D8%B3%D8%A7%D8%AE%D8%AA%D9%86_%D8%AA%D8%B5%D9%88%DB%8C%D8%B1_%D9%BE%D8%A7%DB%8C%D9%87_%D8%A8%D8%A7_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7%DB%8C_%D8%B3%DB%8C%D8%B3%D8%AA%D9%85_%D9%88_RENV\"><\/span>\n<p>  3. \u0633\u0627\u062e\u062a\u0646 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647 \u0628\u0627 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u0648 RENV<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u0641\u0632\u0627\u06cc\u0634 \u0633\u0646\u06af\u06cc\u0646 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u0646\u0635\u0628 \u0648 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc R \u0641\u0642\u0637 \u06cc\u06a9 \u0628\u0627\u0631 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f \u060c \u0645\u0627 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645. \u0627\u06cc\u0646 \u062a\u0635\u0648\u06cc\u0631 \u0634\u0627\u0645\u0644 R 4.4.1 \u060c \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u0644\u0627\u0632\u0645 (\u0628\u0631\u0627\u06cc \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f TextShaping \u0648 RAGG) \u0627\u0633\u062a \u0648 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc R \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 Renv.Lock \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u062f.<br \/><code>Dockerfile.base<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"c\"># Use a specific R base image<\/span>\nFROM r-base:4.4.1\n\n<span class=\"c\"># Install system dependencies required by R packages<\/span>\nRUN apt-get update <span class=\"o\">&amp;&amp;<\/span> apt-get <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> <span class=\"se\">\\<\/span>\n    libcurl4-openssl-dev <span class=\"se\">\\<\/span>\n    libssl-dev <span class=\"se\">\\<\/span>\n    libxml2 <span class=\"se\">\\<\/span>\n    libxml2-dev <span class=\"se\">\\<\/span>\n    libz-dev <span class=\"se\">\\<\/span>\n    libsodium-dev <span class=\"se\">\\<\/span>\n    libfontconfig1-dev <span class=\"se\">\\<\/span>\n    libfreetype6-dev <span class=\"se\">\\<\/span>\n    libharfbuzz-dev <span class=\"se\">\\<\/span>\n    libfribidi-dev <span class=\"se\">\\<\/span>\n    libpng-dev <span class=\"se\">\\<\/span>\n    libtiff5-dev <span class=\"se\">\\<\/span>\n    libjpeg-dev <span class=\"se\">\\<\/span>\n    build-essential <span class=\"se\">\\<\/span>\n    pkg-config <span class=\"se\">\\<\/span>\n    wget <span class=\"se\">\\<\/span>\n    apt-transport-https <span class=\"se\">\\<\/span>\n    ca-certificates <span class=\"se\">\\<\/span>\n <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm<\/span> <span class=\"nt\">-rf<\/span> \/var\/lib\/apt\/lists\/<span class=\"k\">*<\/span>\n\n<span class=\"c\"># Create a directory for your application<\/span>\nWORKDIR \/app\n\n<span class=\"c\"># Copy your renv lock file to restore R packages<\/span>\nCOPY renv.lock \/app\/renv.lock\n\n<span class=\"c\"># Install renv and restore packages using renv.lock<\/span>\nRUN R <span class=\"nt\">-e<\/span> <span class=\"s2\">\"install.packages('renv', repos=\"http:\/\/cran.rstudio.com\/\"); <\/span><span class=\"se\">\\<\/span><span class=\"s2\">\n          renv::restore(repos = c(CRAN = 'http:\/\/cran.rstudio.com\/'))\"<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u062a\u0635\u0648\u06cc\u0631 (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u0628\u0631\u0686\u0633\u0628 \u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a. <code>r-base-mlops:4.4.1<\/code>) \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u067e\u0627\u06cc\u0647 \u067e\u0627\u06cc\u062f\u0627\u0631 \u0639\u0645\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"4_%D8%AA%D8%B5%D9%88%DB%8C%D8%B1_%D9%85%D8%AF%D9%84_%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DB%8C_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%AA%D9%88%D8%B3%D8%B9%D9%87_%D8%B3%D8%B1%DB%8C%D8%B9\"><\/span>\n<p>  4. \u062a\u0635\u0648\u06cc\u0631 \u0645\u062f\u0644 \u062a\u06a9\u0631\u0627\u0631\u06cc \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u0633\u0631\u06cc\u0639<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627 \u062a\u06a9\u06cc\u0647 \u0628\u0631 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647 \u060c \u0645\u0627 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u062a\u06a9\u0631\u0627\u0631 \u0645\u062f\u0644 \u06a9\u0648\u0686\u06a9\u062a\u0631 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645 \u06a9\u0647 \u0641\u0642\u0637 \u062d\u0627\u0648\u06cc \u06a9\u062f \u0645\u062f\u0644 \u0645\u0627 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u062a\u0635\u0648\u06cc\u0631 \u0628\u0647 \u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0628\u062f\u0648\u0646 \u0646\u0635\u0628 \u0645\u062c\u062f\u062f \u0647\u0645\u0647 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u0648 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc R \u0647\u0631 \u0628\u0627\u0631 \u060c \u0628\u0647 \u0633\u0631\u0639\u062a \u062f\u0631 \u0645\u062f\u0644 (\u06cc\u0627 API) \u062e\u0648\u062f \u062a\u06a9\u0631\u0627\u0631 \u06a9\u0646\u06cc\u0645.<br \/>\u0645\u0627 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 Docker \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f \u06a9\u0647:<\/p>\n<ul>\n<li>\u0627\u0632 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647 R \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f (\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u060c \u0646\u0633\u062e\u0647 4.4.1).<\/li>\n<li>\u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627 \u0648 \u0645\u062f\u0644 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u0638\u0631\u0641 \u06a9\u067e\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>API \u0644\u0648\u0644\u0647 \u06a9\u0634\u06cc \u0631\u0627 \u062f\u0631 \u0628\u0646\u062f\u0631 8080 \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f.<\/li>\n<\/ul>\n<p><code>Dockerfile.model<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"c\"># Use the prebuilt base image that contains R 4.4.1 and all system dependencies &amp; renv packages<\/span>\nFROM r-base-mlops:4.4.1\n\n<span class=\"c\"># Set the working directory<\/span>\nWORKDIR \/app\n\n<span class=\"c\"># Create directories for logs and model data<\/span>\nRUN <span class=\"nb\">mkdir<\/span> <span class=\"nt\">-p<\/span> \/app\/logs\/docker_logs \/app\/logs\/R_logs \/app\/logs\/aws_logs\nRUN <span class=\"nb\">mkdir<\/span> <span class=\"nt\">-p<\/span> data\n\n<span class=\"c\"># Copy your model scripts into the container<\/span>\nCOPY .\/R\/train.R \/app\/train.R\nCOPY .\/R\/serve.R \/app\/serve.R\n<span class=\"c\"># Copy the runner script to start the API<\/span>\nCOPY .\/R\/run_api.R \/app\/run_api.R\n\n<span class=\"c\"># Run the training script to generate or update your model (e.g. data\/model.rds)<\/span>\nRUN Rscript train.R\n\n<span class=\"c\"># Expose the port on which your Plumber API will run<\/span>\nEXPOSE 8080\n\n<span class=\"c\"># Start the Plumber API using the runner script<\/span>\nCMD <span class=\"o\">[<\/span><span class=\"s2\">\"Rscript\"<\/span>, <span class=\"s2\">\"run_api.R\"<\/span><span class=\"o\">]<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0633\u06a9\u0631\u06cc\u067e\u062a run_api.r \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u0633\u0631\u0648\u06cc\u0633 \u0631\u0627 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u062f. R \u0631\u0627 \u0634\u0631\u0648\u0639 \u0645\u06cc \u06a9\u0646\u062f \u0648 API \u0631\u0627 \u0634\u0631\u0648\u0639 \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight r\"><code><span class=\"c1\"># run_api.R<\/span><span class=\"w\">\n<\/span><span class=\"n\">pr<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">plumber<\/span><span class=\"o\">::<\/span><span class=\"n\">plumb<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"serve.R\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">pr<\/span><span class=\"o\">$<\/span><span class=\"n\">run<\/span><span class=\"p\">(<\/span><span class=\"n\">host<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"0.0.0.0\"<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">port<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"m\">8080<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0647\u0646\u06af\u0627\u0645 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u062f \u0645\u062f\u0644 \u062e\u0648\u062f (\u062f\u0631 <code>train.R<\/code> \u06cc\u0627 <code>serve.R<\/code>) \u060c \u0634\u0645\u0627 \u0641\u0642\u0637 \u0628\u0627\u06cc\u062f \u062a\u0635\u0648\u06cc\u0631 \u0645\u062f\u0644 \u0631\u0627 \u0628\u0627\u0632\u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f &#8211; \u0646\u0647 \u06a9\u0644 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0627\u06cc\u0647.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"5_%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7%DB%8C_R_%D8%A8%D8%A7_RENV\"><\/span>\n<p>  5. \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc R \u0628\u0627 RENV<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 RENV \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0638\u0631\u0641 \u0634\u0645\u0627 \u0646\u0633\u062e\u0647 \u0647\u0627\u06cc \u062f\u0642\u06cc\u0642 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc R \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u067e\u0631\u0648\u0698\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u062f. \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0627\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code># 1. Initialise renv:\nrenv::init()\n# 2. Install any packages you use (eg. plumber, randomForest, logger, tidyverse). \n# 3. Snapshot the environment:\nrenv::snapshot()\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"6_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_%D9%86%D9%82%D8%B7%D9%87_%D9%BE%D8%A7%DB%8C%D8%A7%D9%86%DB%8C_API_%D9%84%D9%88%D9%84%D9%87_%DA%A9%D8%B4%DB%8C\"><\/span>\n<p>  6. \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc API \u0644\u0648\u0644\u0647 \u06a9\u0634\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0639\u062f \u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0644\u0648\u0644\u0647 \u06a9\u0634\u06cc API \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0645\u0627 \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f <code>\/predict<\/code> \u06a9\u0647:<\/p>\n<ul>\n<li>\u0645\u062f\u0644 \u0627\u0632 \u067e\u06cc\u0634 \u0622\u0645\u0648\u0632\u0634 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0631\u0627 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\u062f\u0631\u062e\u0648\u0627\u0633\u062a JSON \u0648\u0631\u0648\u062f\u06cc \u0631\u0627 \u062a\u062c\u0632\u06cc\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\u067e\u06cc\u0634 \u0628\u06cc\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f<\/li>\n<li>\u062c\u0632\u0626\u06cc\u0627\u062a \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648 \u062c\u0632\u0626\u06cc\u0627\u062a \u067e\u0627\u0633\u062e.<\/li>\n<\/ul>\n<p><code>serve.R<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight r\"><code><span class=\"c1\"># serve.R<\/span><span class=\"w\">\n<\/span><span class=\"n\">library<\/span><span class=\"p\">(<\/span><span class=\"n\">plumber<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">library<\/span><span class=\"p\">(<\/span><span class=\"n\">randomForest<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">library<\/span><span class=\"p\">(<\/span><span class=\"n\">logger<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">library<\/span><span class=\"p\">(<\/span><span class=\"n\">jsonlite<\/span><span class=\"p\">)<\/span><span class=\"w\">\n\n<\/span><span class=\"c1\"># Set up logging<\/span><span class=\"w\">\n<\/span><span class=\"n\">log_dir<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"k\">if<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">dir.exists<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"\/app\/logs\"<\/span><span class=\"p\">))<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"\/app\/logs\/R_logs\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"k\">else<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"logs\/outside_container_logs\/R_logs\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"k\">if<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"n\">dir.exists<\/span><span class=\"p\">(<\/span><span class=\"n\">log_dir<\/span><span class=\"p\">))<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"n\">dir.create<\/span><span class=\"p\">(<\/span><span class=\"n\">log_dir<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">recursive<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"kc\">TRUE<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"c1\"># Create a timestamp for the log file name<\/span><span class=\"w\">\n<\/span><span class=\"n\">timestamp<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">Sys.time<\/span><span class=\"p\">(),<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"%Y%m%d_%H%M%S\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">log_file<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">file.path<\/span><span class=\"p\">(<\/span><span class=\"n\">log_dir<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">paste0<\/span><span class=\"p\">(<\/span><span class=\"n\">timestamp<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"_request.log\"<\/span><span class=\"p\">))<\/span><span class=\"w\">\n<\/span><span class=\"n\">log_appender<\/span><span class=\"p\">(<\/span><span class=\"n\">appender_file<\/span><span class=\"p\">(<\/span><span class=\"n\">log_file<\/span><span class=\"p\">))<\/span><span class=\"w\">\n\n<\/span><span class=\"c1\"># Load the trained model<\/span><span class=\"w\">\n<\/span><span class=\"n\">model<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">readRDS<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"data\/model.rds\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n\n<\/span><span class=\"c1\">#* @filter log_requests<\/span><span class=\"w\">\n<\/span><span class=\"k\">function<\/span><span class=\"p\">(<\/span><span class=\"n\">req<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">res<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"n\">log_info<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Incoming request: {req$REQUEST_METHOD} {req$PATH_INFO}\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n  <\/span><span class=\"n\">log_info<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Request body: {req$postBody}\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n  <\/span><span class=\"n\">plumber<\/span><span class=\"o\">::<\/span><span class=\"n\">forward<\/span><span class=\"p\">()<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n\n<\/span><span class=\"c1\">#* @post \/predict<\/span><span class=\"w\">\n<\/span><span class=\"c1\">#* @serializer json<\/span><span class=\"w\">\n<\/span><span class=\"k\">function<\/span><span class=\"p\">(<\/span><span class=\"n\">req<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"n\">data<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">fromJSON<\/span><span class=\"p\">(<\/span><span class=\"n\">req<\/span><span class=\"o\">$<\/span><span class=\"n\">postBody<\/span><span class=\"p\">)<\/span><span class=\"w\">\n  <\/span><span class=\"n\">input_data<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">as.data.frame<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">)<\/span><span class=\"w\">\n  <\/span><span class=\"n\">pred<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">predict<\/span><span class=\"p\">(<\/span><span class=\"n\">model<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">input_data<\/span><span class=\"p\">)<\/span><span class=\"w\">\n  <\/span><span class=\"n\">log_info<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Prediction: {paste(pred, collapse=\", \")}\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n  <\/span><span class=\"nf\">list<\/span><span class=\"p\">(<\/span><span class=\"n\">prediction<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"nf\">as.character<\/span><span class=\"p\">(<\/span><span class=\"n\">pred<\/span><span class=\"p\">))<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0644\u0648\u0644\u0647 \u06a9\u0634\u06cc \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0645\u0633\u062a\u0646\u062f\u0627\u062a swagger (\u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u062f\u0631 http: \/\/ localhost: 8080\/__ \u0627\u0633\u0646\u0627\u062f __\/) \u0631\u0627 \u0627\u0632 \u0627\u06cc\u0646 \u062d\u0627\u0634\u06cc\u0647 \u0646\u0648\u06cc\u0633\u06cc \u0647\u0627 \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"7_%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%D8%B4_API\"><\/span>\n<p>  7. \u0622\u0632\u0645\u0627\u06cc\u0634 API<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D8%AD%D9%84%D9%82%D9%87\"><\/span>\n<p>  \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062d\u0644\u0642\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>curl -X POST \"http:\/\/localhost:8080\/predict\" \\\n     -H \"Content-Type: application\/json\" \\\n     -d '{\"Sepal.Length\": 5.1, \"Sepal.Width\": 3.5, \"Petal.Length\": 1.4, \"Petal.Width\": 0.2}'\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0627 \u0628\u062f\u0633\u062a \u0622\u0648\u0631\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>Prediction: setosa\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D9%BE%D8%B3%D8%AA%DA%86%DB%8C\"><\/span>\n<p>  \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u0633\u062a\u0686\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol>\n<li>\u0631\u0648\u0634 HTTP \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>URL \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f: http: \/\/ localhost: 8080\/\u067e\u06cc\u0634 \u0628\u06cc\u0646\u06cc.<\/li>\n<li>\u062f\u0631 \u0632\u06cc\u0631 \u0628\u0631\u06af\u0647 \u0647\u062f\u0631 \u060c \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>Content-Type<\/code> \u0628\u0631\u0627\u06cc <strong>\u06a9\u0644\u06cc\u062f<\/strong> \u0628\u0627 \u0627\u0631\u0632\u0634 <code>application\/json<\/code>\u0628\u0634\u0631<\/li>\n<li>\u062f\u0631 \u0628\u0631\u06af\u0647 \u0628\u062f\u0646\u0647 \u060c RAW \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0647 \u0648 JSON \u0631\u0627 \u0627\u0632 Dropdown \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>JSON \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0686\u0633\u0628\u0627\u0646\u06cc\u062f:\n<\/li>\n<\/ol>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"Sepal.Length\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"mf\">5.1<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"Sepal.Width\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"mf\">3.5<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"Petal.Length\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"mf\">1.4<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"Petal.Width\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"mf\">0.2<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ol>\n<li>\u0628\u0631\u0627\u06cc \u0645\u0634\u0627\u0647\u062f\u0647 \u067e\u0627\u0633\u062e \u060c \u0631\u0648\u06cc \u0627\u0631\u0633\u0627\u0644 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f.<\/li>\n<\/ol>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D8%A8%D8%B3%D8%AA%D9%87_HTTR_R\"><\/span>\n<p>  \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0628\u0633\u062a\u0647 HTTR R<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight r\"><code><span class=\"n\">library<\/span><span class=\"p\">(<\/span><span class=\"n\">httr<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">library<\/span><span class=\"p\">(<\/span><span class=\"n\">jsonlite<\/span><span class=\"p\">)<\/span><span class=\"w\">\n\n<\/span><span class=\"n\">url<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"http:\/\/localhost:8080\/predict\"<\/span><span class=\"w\">\n<\/span><span class=\"n\">input<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"nf\">list<\/span><span class=\"p\">(<\/span><span class=\"w\">\n  <\/span><span class=\"n\">Sepal.Length<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"m\">5.1<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"n\">Sepal.Width<\/span><span class=\"w\">  <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"m\">3.5<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"n\">Petal.Length<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"m\">1.4<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"n\">Petal.Width<\/span><span class=\"w\">  <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"m\">0.2<\/span><span class=\"w\">\n<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">response<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">POST<\/span><span class=\"p\">(<\/span><span class=\"w\">\n  <\/span><span class=\"n\">url<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"n\">body<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">toJSON<\/span><span class=\"p\">(<\/span><span class=\"n\">input<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">auto_unbox<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"kc\">TRUE<\/span><span class=\"p\">),<\/span><span class=\"w\">\n  <\/span><span class=\"n\">encode<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"raw\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"n\">add_headers<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Content-Type\"<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"application\/json\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">result<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;-<\/span><span class=\"w\"> <\/span><span class=\"n\">content<\/span><span class=\"p\">(<\/span><span class=\"n\">response<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">as<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"parsed\"<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">result<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B9%DB%8C%D8%A8_%DB%8C%D8%A7%D8%A8%DB%8C\"><\/span>\n<p>  \u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"1_%DA%A9%D8%A7%D9%86%D8%AA%DB%8C%D9%86%D8%B1_%D8%AF%D8%B1_%D9%86%D8%B5%D8%A8_%DB%8C%DA%A9_%D8%A8%D8%B3%D8%AA%D9%87_%D9%86%D8%A7%DA%A9%D8%A7%D9%85_%D8%A7%D8%B3%D8%AA\"><\/span>\n<p>  1. \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u062f\u0631 \u0646\u0635\u0628 \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u0646\u0627\u06a9\u0627\u0645 \u0627\u0633\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06af\u0631 \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u0646\u062a\u0648\u0627\u0646\u0633\u062a\u0647 \u0627\u0633\u062a \u0646\u0635\u0628 \u06a9\u0646\u062f (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c \u0645\u062a\u0646 \u06cc\u0627 ragg) \u060c \u067e\u06cc\u0627\u0645 \u062e\u0637\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc \u0633\u06cc\u0633\u062a\u0645 \u06af\u0645\u0634\u062f\u0647 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f. Dockerfile.base \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u0644\u0627\u0632\u0645 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f (\u0645\u0627\u0646\u0646\u062f Libharfbuzz-Dev \u060c Libfribidi-Dev \u060c Libpng-Dev \u060c libtiff5-Dev \u0648 libjpeg-dev).<\/p>\n<h3><span class=\"ez-toc-section\" id=\"2_Docker_Volume_Mount\"><\/span>\n<p>  2. Docker Volume Mount<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u060c \u0627\u0632 \u067e\u0631\u0686\u0645 Docker -v (\u06cc\u0627 -Volume) \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0641\u0647\u0631\u0633\u062a \u0645\u06cc\u0632\u0628\u0627\u0646 \u0631\u0627 \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0646\u0642\u0634\u0647 \u0628\u0631\u062f\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c \u0627\u06af\u0631 \u0641\u0647\u0631\u0633\u062a \u0645\u06cc\u0632\u0628\u0627\u0646 \u0634\u0645\u0627 \u062f\u0631 \u0641\u0647\u0631\u0633\u062a \u06a9\u0627\u0631 \u0641\u0639\u0644\u06cc \u0627\u0633\u062a \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>docker run -v \"$(pwd)\/logs\/inside_container_logs:\/app\/logs\" your_container_image\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u0628\u0647 Docker \u0645\u06cc \u06af\u0648\u06cc\u062f \u06a9\u0647 \u0641\u0647\u0631\u0633\u062a \u0647\u0627\u06cc \u0645\u06cc\u0632\u0628\u0627\u0646 \u062e\u0648\u062f \u0631\u0627\/inde_container_logs \u062f\u0631 \u0638\u0631\u0641 \u062f\u0631\/\u0628\u0631\u0646\u0627\u0645\u0647\/\u0633\u06cc\u0627\u0647\u0647\u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0633\u0648\u0627\u0631 \u06a9\u0646\u06cc\u062f.<br \/>\u067e\u0633 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u060c \u0627\u0632 Docker Container Inspect \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u06a9\u0648\u0647 \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a \u060c \u0648 \u067e\u0648\u0634\u0647 \u0645\u062d\u0644\u06cc \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0634\u0648\u062f \u06a9\u0647 \u0633\u06cc\u0627\u0647\u0647\u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u062f\u0631 \u0622\u0646\u062c\u0627 \u0646\u0648\u0634\u062a\u0647 \u0634\u062f\u0647 \u0627\u0646\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a \u060c \u0645\u0646 \u0634\u0645\u0627 \u0631\u0627 \u062f\u0631 \u06a9\u0644 \u0641\u0631\u0622\u06cc\u0646\u062f \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0645\u062f\u0644 R \u0642\u062f\u0645 \u0645\u06cc \u0632\u0646\u0645 \u060c \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 API \u0622\u0631\u0627\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0628\u0633\u062a\u0647 \u0644\u0648\u0644\u0647 \u06a9\u0634\u06cc \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0648\u0631\u0648\u062f \u062f\u0642\u06cc\u0642 \u0628\u0647 \u0622\u0646 \u0645\u06cc \u067e\u0631\u062f\u0627\u0632\u0645. \u0645\u0627 \u0647\u0631 \u0645\u0631\u062d\u0644\u0647 \u0631\u0627 \u067e\u0648\u0634\u0634 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f \u060c \u0627\u0632 \u062c\u0645\u0644\u0647 \u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc \u0645\u0648\u0636\u0648\u0639\u0627\u062a \u0631\u0627\u06cc\u062c (\u0645\u0627\u0646\u0646\u062f &hellip;<\/p>\n","protected":false},"author":2,"featured_media":100874,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-100873","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/100873","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=100873"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/100873\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/100874"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=100873"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=100873"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=100873"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}