﻿
{"id":14722,"date":"2020-03-30T19:57:32","date_gmt":"2020-03-30T19:57:32","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=14722"},"modified":"2020-03-30T19:57:32","modified_gmt":"2020-03-30T19:57:32","slug":"docker-best-practice-ekstra-katmanla-image-build-surecindeki-performansi-arttirma","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/docker-best-practice-ekstra-katmanla-image-build-surecindeki-performansi-arttirma\/","title":{"rendered":"Docker Best Practice &#8211; Ekstra Katmanla Image Build S\u00fcrecindeki Performans\u0131 Artt\u0131rma"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/net-core-docker-yazi-dizisi\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker yaz\u0131 serisinde<\/a> \u015fu ana kadar ele ald\u0131\u011f\u0131m\u0131z konular \u00e7er\u00e7evesinde image build s\u00fcrecindeki maliyeti d\u00fc\u015f\u00fcrmek i\u00e7in bir ipucu verecek ve best practice bir y\u00f6ntem ile de\u011ferlendirme yapaca\u011f\u0131z.<\/p>\n<p><strong>Peki neyi de\u011ferlendirece\u011fiz?<\/strong><br \/>\nDockerfile dosyas\u0131nda verilen talimatlar aras\u0131nda &#8216;COPY&#8217; talimat\u0131n\u0131n \u00e7al\u0131\u015fma mant\u0131\u011f\u0131 \u00fczerine konu\u015facak ve genellikle ilgili dosya i\u00e7eri\u011fini tasarlarken yap\u0131lan yanl\u0131\u015f olmayan ama pekte do\u011fru say\u0131lmayan bir durumdan bahsedecek ve nihayetinde d\u00fczeltici birka\u00e7 \u00f6neride bulunaca\u011f\u0131z.<\/p>\n<p><strong>&#8216;COPY&#8217; talimat\u0131n\u0131n \u00e7al\u0131\u015fma mant\u0131\u011f\u0131 nas\u0131ld\u0131r?<\/strong><br \/>\nBunun i\u00e7in Dockerfile dosyas\u0131n\u0131n build edilirken nas\u0131l derlendi\u011fini de\u011ferlendirmek gerekmektedir. Dockerfile dosyas\u0131, <code style=\"color:red;\"><strong><em>docker build -t &lt;image_name&gt; &lt;dockerfile&gt;<\/em><\/strong><\/code> komutuyla derlenerek nihayetinde bir image \u00fcretilmektedir. Build i\u015flemi esnas\u0131nda &#8216;COPY&#8217; talimat\u0131 ilk tetiklendi\u011finde t\u00fcm kopyalanacak dosyalar\u0131 cache&#8217;lemekte(\u00f6nbelleklemekte) ve sonraki build i\u015flemlerinde bu dosyalarda herhangi bir de\u011fi\u015fiklik olmad\u0131\u011f\u0131 taktirde cache \u00fczerinden i\u015flemleri ger\u00e7ekle\u015ftirmektedir. B\u00f6ylece sonraki build i\u015fleminin s\u00fcrecini h\u0131zland\u0131rm\u0131\u015f olmakta lakin ilgili dosyalar aras\u0131nda bir de\u011fi\u015fiklik oldu\u011fu taktirde t\u00fcm kopyalama i\u015flemin<br \/>\n fiziksel olarak ger\u00e7ekle\u015ftirmektedir.<\/p>\n<p>E\u011fer ki &#8216;COPY&#8217; i\u015flevinde cache&#8217;i etkisiz b\u0131rakmak ve t\u00fcm kopyalamay\u0131 fiziksel olarak tekrar ger\u00e7ekle\u015ftirmek istiyorsan\u0131z build ederken <span style=\"color:blue;\">&#8211;no-cache<\/span> parametresini belirtmeniz yeterlidir.<br \/>\n<code style=\"color:red;\"><strong><em>docker build <span style=\"color:blue;\">--no-cache<\/span> -t &lt;image_name&gt; &lt;dockerfile&gt;<\/em><\/strong><\/code><\/p>\n<p>\u015eimdi \u00f6rnek olarak i\u00e7eri\u011fi a\u015fa\u011f\u0131daki gibi bir web uygulamas\u0131na \u00f6zel olarak talimatlar bar\u0131nd\u0131ran Dockerfile dosyas\u0131n\u0131 ele al\u0131rsak;<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nFROM mcr.microsoft.com\/dotnet\/core\/sdk:3.1 as sdkimage\r\nWORKDIR \/app\r\nCOPY . .\r\nRUN dotnet restore\r\nRUN dotnet publish DockerizeWebExample.csproj -c Release -o out\r\n\r\nFROM mcr.microsoft.com\/dotnet\/core\/aspnet:3.1\r\nWORKDIR \/app\r\nCOPY --from=sdkimage \/app\/out .\r\n\r\nENV ASPNETCORE_URLS=&quot;http:\/\/*:1453&quot;\r\nENTRYPOINT &#x5B;&quot;dotnet&quot;, &quot;DockerizeWebExample.dll&quot;]\r\n<\/pre>\n<p>3. sat\u0131rdaki &#8216;COPY&#8217; talimat\u0131 mevcut uygulama dizinindeki t\u00fcm dosyalar\u0131 o andaki image i\u00e7erisinde a\u00e7\u0131lm\u0131\u015f(WORDKIR) klas\u00f6re kopyalamaktad\u0131r. Her build i\u015fleminde bu &#8216;COPY&#8217; talimat\u0131 mevcut dosyalarda yahut uygulaman\u0131n kulland\u0131\u011f\u0131 referanslarda bir de\u011fi\u015fiklik s\u00f6z konusu oldu\u011funda fiziksel olarak tetiklenmekte ve dosyalar\u0131 tekrar kopyalamaktad\u0131r. Halbuki bir web uygulamas\u0131nda k\u0131sa aral\u0131kla bir\u00e7ok de\u011fi\u015fiklik s\u00f6z konusu olmakta ve genellikle bu de\u011fi\u015fiklikler dosyalarda olsa da \u00e7ok nadir referanslardan da kaynaklanabilmektedir.<\/p>\n<p>Dolay\u0131s\u0131yla image&#8217;i olu\u015fturulan uygulamada k\u00fct\u00fcphane eklenmesi ve \u00e7\u0131kar\u0131lmas\u0131 durumlar\u0131nda koca uygulaman\u0131n tekrar fiziksel olarak kopyalanmas\u0131 build s\u00fcresi a\u00e7\u0131s\u0131ndan olduk\u00e7a maliyet do\u011furmakta ve b\u00f6ylece makalemizin ilk paragraflar\u0131nda bahsedilen yanl\u0131\u015f olmayan ama pekte do\u011fru say\u0131lmayan durum s\u00f6z konusu olmaktad\u0131r. \u0130\u015fte handikap buradad\u0131r.<\/p>\n<p><strong>Peki \u00e7\u00f6z\u00fcm nas\u0131ld\u0131r?<\/strong><br \/>\n\u00c7\u00f6z\u00fcm, k\u00fct\u00fcphanelerle dosyalar\u0131n birbirlerinden ayr\u0131 kopyalanmas\u0131ndad\u0131r. B\u00f6ylece uygumada herhangi bir k\u00fct\u00fcphanenin eklenmesi yahut \u00e7\u0131kar\u0131lmas\u0131 t\u00fcm dosyalar \u00fczerinde fiziksel bir kopyalamaya mahal vermeyecek ve ayn\u0131 durum dosya g\u00fcncellemesinde k\u00fct\u00fcphaneler i\u00e7inde ge\u00e7erli olacakt\u0131r. Tabi ki de burada anlat\u0131lan senaryoya g\u00f6re bizler sadece k\u00fct\u00fcphane ve fiziksel dosyalara odakl\u0131 bir \u015fekilde olay\u0131 ele alm\u0131\u015f bulunmaktay\u0131z. Sizler istedi\u011finiz kadar yap\u0131lanmay\u0131 par\u00e7alayabilir ve kendi b\u00fcnyesinde de\u011fi\u015fiklik oldu\u011fu taktirde fiziksel i\u015fleme tabi tutabilirsiniz.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nFROM mcr.microsoft.com\/dotnet\/core\/sdk:3.1 as sdkimage\r\nWORKDIR \/app\r\nCOPY *.csproj .\r\nRUN dotnet restore\r\nCOPY . .\r\nRUN dotnet publish DockerizeWebExample.csproj -c Release -o out\r\n\r\nFROM mcr.microsoft.com\/dotnet\/core\/aspnet:3.1\r\nWORKDIR \/app\r\nCOPY --from=sdkimage \/app\/out .\r\n\r\nENV ASPNETCORE_URLS=&quot;http:\/\/*:1453&quot;\r\nENTRYPOINT &#x5B;&quot;dotnet&quot;, &quot;DockerizeWebExample.dll&quot;]\r\n<\/pre>\n<p>Yukar\u0131daki talimatlar\u0131 incelersek e\u011fer; 3. sat\u0131rdaki &#8216;COPY *.csproj .&#8217; talimat ile uygulamaya dair t\u00fcm k\u00fct\u00fcphane vs. bilgilerini bar\u0131nd\u0131ran &#8216;.csproj&#8217; dosyas\u0131 g\u00fcncellenmekte ve \u00fczerine restore edilmektedir. Akabinde 5. sat\u0131rda tekrar &#8216;COPY . .&#8217; talimat\u0131 verilmektedir. Buradaki mant\u0131k \u015f\u00f6yledir; e\u011fer ki k\u00fct\u00fcphanelerde bir de\u011fi\u015fiklik olursa ilk 3. sat\u0131rdaki talimat fiziksel kopyalama i\u015flemi yapacak 5.&#8217;de ki ise cache&#8217;den \u00e7ekecektir. Yok e\u011fer dosyalarda bir de\u011fi\u015fiklik olursa tam tersi olmak \u00fczere 5. sat\u0131rdaki fiziksel kopyalanacak 3. cache&#8217;den gelecektir.<\/p>\n<p>\u0130\u015fte Dockerfile i\u00e7erisindeki i\u015flemlerimizi bu \u015fekilde tasarlad\u0131\u011f\u0131m\u0131z taktirde build ile image \u00fcretimi esnas\u0131nda l\u00fczumsuz kopyalama i\u015flemlerinden ar\u0131nd\u0131rm\u0131\u015f olaca\u011f\u0131z ve en \u00f6nemlisi s\u00fcresel a\u00e7\u0131dan olduk\u00e7a maliyeti d\u00fc\u015f\u00fcrm\u00fc\u015f olaca\u011f\u0131z.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde, Docker yaz\u0131 serisinde \u015fu ana kadar ele ald\u0131\u011f\u0131m\u0131z konular \u00e7er\u00e7evesinde image build s\u00fcrecindeki maliyeti d\u00fc\u015f\u00fcrmek i\u00e7in bir ipucu verecek ve best practice bir y\u00f6ntem ile de\u011ferlendirme yapaca\u011f\u0131z. Peki neyi de\u011ferlendirece\u011fiz? Dockerfile&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":14719,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3281],"tags":[3346,3284,3345],"class_list":["post-14722","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker","tag-best-practice","tag-docker","tag-docker-best-practice"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/14722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=14722"}],"version-history":[{"count":27,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/14722\/revisions"}],"predecessor-version":[{"id":14749,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/14722\/revisions\/14749"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/14719"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=14722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=14722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=14722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}