ونڈوز امیجز بنانے کے لیے ڈوکر ملٹی اسٹیج کا استعمال

سب کو سلام! میرا نام اینڈری ہے، اور میں Exness میں ڈیو اوپس انجینئر کے طور پر ترقیاتی ٹیم میں کام کرتا ہوں۔ میری اہم سرگرمی لینکس آپریٹنگ سسٹم کے تحت ڈوکر میں ایپلی کیشنز کی تعمیر، تعیناتی اور معاونت سے متعلق ہے (اس کے بعد اسے OS کہا جاتا ہے)۔ کچھ عرصہ پہلے میرے پاس انہی سرگرمیوں کے ساتھ ایک کام تھا، لیکن پروجیکٹ کا ہدف OS ونڈوز سرور اور C++ پروجیکٹس کا ایک سیٹ تھا۔ میرے لیے یہ ونڈوز OS کے تحت ڈوکر کنٹینرز کے ساتھ اور عام طور پر C++ ایپلی کیشنز کے ساتھ پہلا قریبی تعامل تھا۔ اس کی بدولت، مجھے ایک دلچسپ تجربہ ملا اور میں نے ونڈوز میں کنٹینرائزنگ ایپلی کیشنز کی کچھ پیچیدگیوں کے بارے میں سیکھا۔

ونڈوز امیجز بنانے کے لیے ڈوکر ملٹی اسٹیج کا استعمال

اس مضمون میں میں آپ کو بتانا چاہتا ہوں کہ مجھے کن مشکلات کا سامنا کرنا پڑا اور میں نے ان کو کیسے حل کیا۔ مجھے امید ہے کہ یہ آپ کے موجودہ اور مستقبل کے چیلنجوں کے لیے مددگار ثابت ہوگا۔ پڑھنے سے لطف اندوز!

کنٹینرز کیوں؟

کمپنی کے پاس Hashicorp Nomad کنٹینر آرکیسٹریٹر اور متعلقہ اجزاء - قونصل اور والٹ کے لیے موجودہ بنیادی ڈھانچہ موجود ہے۔ لہذا، ایپلی کیشن کنٹینرائزیشن کو مکمل حل فراہم کرنے کے لیے ایک متحد طریقہ کے طور پر منتخب کیا گیا تھا۔ چونکہ پروجیکٹ کے بنیادی ڈھانچے میں ونڈوز سرور کور OS ورژن 1803 اور 1809 کے ساتھ ڈوکر ہوسٹس شامل ہیں، اس لیے 1803 اور 1809 کے لیے ڈوکر امیجز کے الگ الگ ورژن بنانا ضروری ہے۔ ورژن 1803 میں، یہ یاد رکھنا ضروری ہے کہ بلڈ ڈوکر ہوسٹ کا نظرثانی نمبر بیس ڈوکر امیج کے نظرثانی نمبر اور میزبان سے مماثل ہونا چاہیے جہاں اس تصویر سے کنٹینر لانچ کیا جائے گا۔ ورژن 1809 میں ایسی کوئی خرابی نہیں ہے۔ آپ مزید پڑھ سکتے ہیں۔ یہاں.

کثیر مرحلے کیوں؟

ڈویلپمنٹ ٹیم کے انجینئرز کو ہوسٹ بنانے کے لیے کوئی یا بہت محدود رسائی نہیں ہے؛ ان میزبانوں پر ایپلیکیشن بنانے کے لیے اجزاء کے سیٹ کو فوری طور پر منظم کرنے کا کوئی طریقہ نہیں ہے، مثال کے طور پر، بصری اسٹوڈیو کے لیے اضافی ٹول سیٹ یا کام کا بوجھ انسٹال کریں۔ لہذا، ہم نے بلڈ ڈوکر امیج میں ایپلیکیشن بنانے کے لیے ضروری تمام اجزاء انسٹال کرنے کا فیصلہ کیا۔ اگر ضروری ہو تو، آپ فوری طور پر صرف ڈاکر فائل کو تبدیل کر سکتے ہیں اور اس تصویر کو بنانے کے لیے پائپ لائن شروع کر سکتے ہیں۔

نظریہ سے عمل تک

ایک مثالی ڈوکر ملٹی اسٹیج امیج بلڈ میں، ایپلیکیشن بنانے کا ماحول اسی Dockerfile اسکرپٹ میں تیار کیا جاتا ہے جیسا کہ ایپلی کیشن خود بنایا گیا ہے۔ لیکن ہمارے معاملے میں، ایک انٹرمیڈیٹ لنک شامل کیا گیا تھا، یعنی، ایپلی کیشن بنانے کے لیے ضروری ہر چیز کے ساتھ ڈوکر امیج بنانے کا ابتدائی مرحلہ۔ یہ اس لیے کیا گیا کیونکہ میں تمام انحصار کے انسٹالیشن کے وقت کو کم کرنے کے لیے ڈاکر کیشے کی خصوصیت استعمال کرنا چاہتا تھا۔

آئیے اس تصویر کو بنانے کے لیے ڈاکر فائل اسکرپٹ کے اہم نکات کو دیکھتے ہیں۔

مختلف OS ورژن کی تصاویر بنانے کے لیے، آپ dockerfile میں ایک دلیل کی وضاحت کر سکتے ہیں جس کے ذریعے ورژن نمبر تعمیر کے دوران پاس کیا جاتا ہے، اور یہ بیس امیج کا ٹیگ بھی ہے۔

مائیکروسافٹ ونڈوز سرور امیج ٹیگز کی مکمل فہرست مل سکتی ہے۔ یہاں.

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

پہلے سے طے شدہ ہدایات میں کمانڈز RUN ونڈوز 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 فارمیٹ میں کنفیگریشن فائل کا استعمال کرتے ہوئے ٹولز کا ایک توسیعی سیٹ خود بخود انسٹال کر سکتے ہیں۔ ترتیب فائل کے مواد:

دستیاب اجزاء کی مکمل فہرست دستاویزات کی سائٹ پر مل سکتی ہے۔ مائیکروسافٹ ویژن سٹوڈیو.

{
  "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

نیا تبصرہ شامل کریں