ڊاڪر ملٽي اسٽيج استعمال ڪندي ونڊوز تصويرون ٺاهڻ لاءِ

هيلو سڀ! منهنجو نالو Andrey آهي، ۽ مان ڊولپمينٽ ٽيم ۾ Exness ۾ DevOps انجنيئر طور ڪم ڪريان ٿو. منهنجي مکيه سرگرمي لينڪس آپريٽنگ سسٽم جي تحت ڊڪر ۾ ايپليڪيشنن جي تعمير، ترتيب ڏيڻ ۽ سپورٽ ڪرڻ سان لاڳاپيل آهي (هتي OS طور حوالو ڏنو ويو آهي). گهڻو وقت اڳ مون وٽ ساڳئي سرگرمين سان هڪ ڪم هو، پر منصوبي جو ٽارگيٽ OS ونڊوز سرور ۽ C++ منصوبن جو هڪ سيٽ هو. منهنجي لاءِ، هي ونڊوز او ايس تحت ڊاکر ڪنٽينرز سان پهريون ويجهو رابطو هو ۽، عام طور تي، C++ ايپليڪيشنن سان. انهي جي مهرباني، مون کي هڪ دلچسپ تجربو هو ۽ ونڊوز ۾ ڪنٽينرنگ ايپليڪيشنن جي ڪجهه پيچيدگين بابت سکيو.

ڊاڪر ملٽي اسٽيج استعمال ڪندي ونڊوز تصويرون ٺاهڻ لاءِ

هن آرٽيڪل ۾ مان توهان کي ٻڌائڻ چاهيان ٿو ته مون کي ڪهڙي مشڪلاتن کي منهن ڏيڻو پيو ۽ مون انهن کي ڪيئن حل ڪيو. مون کي اميد آهي ته هي توهان جي موجوده ۽ مستقبل جي چئلينج لاء مددگار آهي. پڙهڻ جو مزو وٺو!

ڪنٽينر ڇو؟

ڪمپني وٽ موجود زيربنا آهي Hashicorp Nomad ڪنٽينر آرڪيسٽرٽر ۽ لاڳاپيل حصن لاءِ - قونصل ۽ والٽ. تنهن ڪري، ايپليڪيشن ڪنٽينرائزيشن کي مڪمل حل پهچائڻ لاء هڪ متحد طريقو چونڊيو ويو. جيئن ته پروجيڪٽ انفراسٽرڪچر ونڊوز سرور ڪور او ايس ورزن 1803 ۽ 1809 سان گڏ ڊڪر هوسٽ تي مشتمل آهي، ان ڪري 1803 ۽ 1809 لاءِ ڊڪر تصويرن جا الڳ ورجن ٺاهڻ ضروري آهي. ورجن 1803 ۾، اهو ياد رکڻ ضروري آهي ته بلڊ ڊاڪر هوسٽ جو نظرثاني نمبر بنيادي ڊاکر تصوير جي نظرثاني نمبر ۽ ميزبان سان ملائڻ گهرجي جتي هن تصوير مان ڪنٽينر لانچ ڪيو ويندو. نسخو 1809 اهڙي ڪا خرابي ناهي. توهان وڌيڪ پڙهي سگهو ٿا هتي.

ڇو ملٽي اسٽيج؟

ڊولپمينٽ ٽيم جي انجنيئرن وٽ ھوسٽ ٺاھڻ لاءِ ڪابه يا تمام محدود پهچ نه آھي؛ انھن ھوسٽن تي ايپليڪيشن ٺاھڻ لاءِ اجزاء جي سيٽ کي تڪڙو منظم ڪرڻ جو ڪو طريقو ناھي، مثال طور، Visual Studio لاءِ اضافي ٽول سيٽ يا ڪم لوڊ انسٽال ڪريو. تنهن ڪري، اسان اهو فيصلو ڪيو ته سڀني حصن کي انسٽال ڪرڻ لاء ضروري آهي ايپليڪيشن کي تعمير ڪرڻ لاء ڊاکر تصوير ۾. جيڪڏهن ضروري هجي ته، توهان جلدي صرف ڊڪر فائل کي تبديل ڪري سگهو ٿا ۽ هن تصوير ٺاهڻ لاء پائپ لائن شروع ڪري سگهو ٿا.

نظريي کان عمل تائين

هڪ مثالي ڊڪرر ملٽي اسٽيج تصويري تعمير ۾، ايپليڪيشن کي تعمير ڪرڻ لاء ماحول ساڳئي ڊاڪر فائل اسڪرپٽ ۾ تيار ڪيو ويو آهي جيئن ايپليڪيشن پاڻ ٺاهي وئي آهي. پر اسان جي صورت ۾، هڪ وچولي لنڪ شامل ڪئي وئي، يعني، ايپليڪيشن ٺاهڻ لاء ضروري هر شيء سان گڏ هڪ ڊاکر تصوير ٺاهڻ جي شروعاتي قدم. اهو ڪيو ويو آهي ڇاڪاڻ ته مان استعمال ڪرڻ چاهيان ٿو ڊاکر ڪيش خاصيت سڀني انحصار جي تنصيب جي وقت کي گهٽائڻ لاءِ.

اچو ته هن تصوير کي ٺاهڻ لاء ڊاکرفائل اسڪرپٽ جي مکيه نقطي تي نظر رکون.

مختلف او ايس ورزن جون تصويرون ٺاهڻ لاءِ، توهان ڊڪر فائل ۾ هڪ دليل بيان ڪري سگهو ٿا جنهن جي ذريعي ورزن نمبر تعمير دوران گذريو ويو آهي، ۽ اهو پڻ بنيادي تصوير جو ٽيگ آهي.

Microsoft Windows Server تصويري ٽيگ جي مڪمل فهرست ڳولي سگھجي ٿي هتي.

ARG WINDOWS_OS_VERSION=1809
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION

ڊفالٽ طور هدايتون ۾ حڪم RUN Windows OS تي dockerfile جي اندر اهي cmd.exe ڪنسول ۾ جاري ڪيا ويا آهن. اسڪرپٽ لکڻ جي سهولت لاءِ ۽ استعمال ڪيل حڪمن جي ڪارڪردگي کي وڌائڻ لاءِ، اسان پاور شيل ۾ ڪمانڊ ايگزيڪيوشن ڪنسول کي هدايتن ذريعي ٻيهر بيان ڪنداسين. SHELL.

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]

ايندڙ قدم چاڪليٽ پيڪيج مئنيجر ۽ ضروري پيڪيجز کي انسٽال ڪرڻ آهي:

COPY chocolatey.pkg.config .
RUN Set-ExecutionPolicy Bypass -Scope Process -Force ;
    [System.Net.ServicePointManager]::SecurityProtocol = 
    [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 ;
    $env:chocolateyUseWindowsCompression = 'true' ;
    iex ((New-Object System.Net.WebClient).DownloadString( 
      'https://chocolatey.org/install.ps1')) ;
    choco install chocolatey.pkg.config -y --ignore-detected-reboot ;
    if ( @(0, 1605, 1614, 1641, 3010) -contains $LASTEXITCODE ) { 
      refreshenv; } else { exit $LASTEXITCODE; } ;
    Remove-Item 'chocolatey.pkg.config'

چاڪليٽي استعمال ڪندي پيڪيجز کي انسٽال ڪرڻ لاءِ، توھان صرف انھن کي ھڪڙي لسٽ طور پاس ڪري سگھو ٿا، يا انھن کي ھڪ وقت ۾ انسٽال ڪري سگھو ٿا جيڪڏھن توھان کي ھر پيڪيج لاءِ منفرد پيرا ميٽر پاس ڪرڻ جي ضرورت آھي. اسان جي صورتحال ۾، اسان XML فارميٽ ۾ هڪ پڌرو فائل استعمال ڪيو، جنهن ۾ گهربل پيڪيجز ۽ انهن جي پيٽرولن جي فهرست شامل آهي. ان جو مواد هن طرح نظر اچي ٿو:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="python" version="3.8.2"/>
  <package id="nuget.commandline" version="5.5.1"/>
  <package id="git" version="2.26.2"/>
</packages>

اڳيون، اسان انسٽال ڪريون ٿا ايپليڪيشن بلڊ ماحول، يعني، MS Build Tools 2019 - ھي Visual Studio 2019 جو ھلڪو ورزن آھي، جنھن ۾ ڪوڊ مرتب ڪرڻ لاءِ اجزاء جو گھٽ ۾ گھٽ گھربل سيٽ آھي.
اسان جي C ++ منصوبي سان مڪمل طور تي ڪم ڪرڻ لاء، اسان کي اضافي اجزاء جي ضرورت پوندي، يعني:

  • ڪم لوڊ C++ اوزار
  • ٽول سيٽ v141
  • Windows 10 SDK (10.0.17134.0)

توھان انسٽال ڪري سگھوٿا ٽولز جو وڌايل سيٽ خودڪار طريقي سان JSON فارميٽ ۾ ترتيب واري فائل استعمال ڪندي. ترتيب ڏيڻ واري فائل جو مواد:

دستياب اجزاء جي مڪمل فهرست دستاويزي سائيٽ تي ڳولهي سگهجي ٿي Microsoft وڊيو اسٽوڊيو.

{
  "version": "1.0",
  "components": [
    "Microsoft.Component.MSBuild",
    "Microsoft.VisualStudio.Workload.VCTools;includeRecommended",
    "Microsoft.VisualStudio.Component.VC.v141.x86.x64",
    "Microsoft.VisualStudio.Component.Windows10SDK.17134"
  ]
}

dockerfile انسٽاليشن اسڪرپٽ کي هلائي ٿو، ۽ سهولت لاء، تعميراتي اوزار تي عمل ڪندڙ فائلن کي ماحول جي متغير ڏانهن رستو شامل ڪري ٿو. PATH. اهو پڻ مشورو ڏنو ويو آهي ته غير ضروري فائلن ۽ ڊائريڪٽرن کي هٽائڻ لاء تصوير جي سائيز کي گهٽائڻ لاء.

COPY buildtools.config.json .
RUN Invoke-WebRequest 'https://aka.ms/vs/16/release/vs_BuildTools.exe' 
      -OutFile '.vs_buildtools.exe' -UseBasicParsing ;
    Start-Process -FilePath '.vs_buildtools.exe' -Wait -ArgumentList 
      '--quiet --norestart --nocache --config C:buildtools.config.json' ;
    Remove-Item '.vs_buildtools.exe' ;
    Remove-Item '.buildtools.config.json' ;
    Remove-Item -Force -Recurse 
      'C:Program Files (x86)Microsoft Visual StudioInstaller' ;
    $env:PATH = 'C:Program Files (x86)Microsoft Visual Studio2019BuildToolsMSBuildCurrentBin;' + $env:PATH; 
    [Environment]::SetEnvironmentVariable('PATH', $env:PATH, 
      [EnvironmentVariableTarget]::Machine)

هن اسٽيج تي، اسان جي تصوير C++ ايپليڪيشن کي گڏ ڪرڻ لاءِ تيار آهي، ۽ اسان سڌو سنئون اڳتي وڌائي سگهون ٿا ڊاڪر ملٽي اسٽيج بلڊ ايپليڪيشن ٺاهڻ لاءِ.

عمل ۾ ملٽي اسٽيج

اسان ٺهيل تصوير کي استعمال ڪنداسين بورڊ تي سڀني اوزارن سان گڏ هڪ تعمير تصوير جي طور تي. جيئن پوئين ڊاڪرفائل اسڪرپٽ ۾، اسان کي متحرڪ طور تي بيان ڪرڻ جي صلاحيت شامل ڪنداسين نسخي نمبر/تصوير ٽيگ ڪوڊ جي ٻيهر استعمال جي آسانيء لاء. اهو هڪ ليبل شامل ڪرڻ ضروري آهي as builder هدايتن ۾ اسيمبلي جي تصوير ڏانهن FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

هاڻي اهو ايپليڪيشن ٺاهڻ جو وقت آهي. هتي هر شي بلڪل سادو آهي: نقل ڪريو سورس ڪوڊ ۽ ان سان لاڳاپيل هر شي، ۽ گڏ ڪرڻ وارو عمل شروع ڪريو.

COPY myapp .
RUN nuget restore myapp.sln ;
    msbuild myapp.sln /t:myapp /p:Configuration=Release

حتمي تصوير ٺاهڻ جو آخري مرحلو ايپليڪيشن جي بنيادي تصوير کي بيان ڪرڻ آهي، جتي سڀني تاليف جي نموني ۽ ترتيب واري فائلون واقع ٿينديون. گڏ ڪيل فائلن کي نقل ڪرڻ لاء وچولي اسيمبلي جي تصوير مان، توهان کي وضاحت ڪرڻ گهرجي پيٽرول --from=builder هدايتن ۾ COPY.

FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION

COPY --from=builder C:/x64/Release/myapp/ ./
COPY ./configs ./

ھاڻي اھو باقي رھيو آھي اسان جي ايپليڪيشن لاءِ ضروري انحصار شامل ڪرڻ لاءِ ڪم ڪرڻ ۽ ھدايتن ذريعي لانچ ڪمان جي وضاحت ڪريو ENTRYPOINT يا CMD.

ٿڪل

هن آرٽيڪل ۾، مون انهي بابت ڳالهايو ته ڪيئن ونڊوز جي اندر هڪ ڪنٽينر اندر C++ ايپليڪيشنن لاءِ مڪمل تاليف وارو ماحول ٺاهيو وڃي ۽ اسان جي ايپليڪيشن جون مڪمل تصويرون ٺاهڻ لاءِ ڊاڪر ملٽي اسٽيج بلڊز جي صلاحيتن کي ڪيئن استعمال ڪجي.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو