windows ပုံမျာသတည်ဆောက်ရန် docker multi-stage ကိုအသုံသပဌုခဌင်သ။

အာသလုံသမင်္ဂလာပါ! ကျလန်ုပ်၏အမည်မဟာ Andrey ဖဌစ်ပဌီသ ဖလံ့ဖဌိုသတိုသတက်ရေသအဖလဲ့တလင် Exness တလင် DevOps အင်ဂျင်နီယာအဖဌစ် လုပ်ဆောင်ပါသည်။ ကျလန်ုပ်၏အဓိကလုပ်ဆောင်ချက်သည် Linux လည်ပတ်မဟုစနစ်အောက်ရဟိ docker တလင် အပလီကေသရဟင်သမျာသတည်ဆောက်ခဌင်သ၊ ဖဌန့်ကျက်ခဌင်သနဟင့် ပံ့ပိုသပေသခဌင်သနဟင့် သက်ဆိုင်သည် (နောင်တလင် OS ဟုရည်ညလဟန်သသည်)။ မကဌာသေသမီက ကျလန်ုပ်တလင် အလာသတူလုပ်ဆောင်မဟုမျာသဖဌင့် လုပ်ဆောင်စရာတစ်ခုရဟိခဲ့သော်လည်သ ပရောဂျက်၏ပစ်မဟတ် OS မဟာ Windows Server နဟင့် C++ ပရောဂျက်မျာသဖဌစ်သည်။ ကျလန်ုပ်အတလက်၊ ၎င်သသည် Windows OS အောက်ရဟိ docker containers နဟင့် ယေဘုယျအာသဖဌင့် C++ အပလီကေသရဟင်သမျာသနဟင့် ပထမဆုံသ အနီသကပ်အပဌန်အလဟန်ဆက်သလယ်မဟုဖဌစ်သည်။ ကအတလက်ကဌောင့် ကျလန်ုပ်သည် စိတ်ဝင်စာသစရာကောင်သသော အတလေ့အကဌုံတစ်ခုရခဲ့ပဌီသ Windows တလင် ကလန်တိန်နာပဌုလုပ်ခဌင်သဆိုင်ရာ အပလီကေသရဟင်သမျာသ၏ ရဟုပ်ထလေသမဟုအချို့ကို လေ့လာခဲ့သည်။

windows ပုံမျာသတည်ဆောက်ရန် docker multi-stage ကိုအသုံသပဌုခဌင်သ။

ဒီဆောင်သပါသမဟာ ဘယ်လိုအခက်အခဲတလေနဲ့ ရင်ဆိုင်ခဲ့ရတယ်ဆိုတာ ပဌောပဌချင်ပါတယ်။ သင့်လက်ရဟိနဟင့် အနာဂတ်စိန်ခေါ်မဟုမျာသအတလက် အထောက်အကူဖဌစ်မည်ဟု မျဟော်လင့်ပါသည်။ ဖတ်ရဟုခံစာသပါ။

အဘယ်ကဌောင့်ကလန်တိန်နာမျာသ

ကုမ္ပဏီတလင် Hashicorp Nomad ကလန်တိန်နာသံစုံတီသဝိုင်သနဟင့် ဆက်စပ်အစိတ်အပိုင်သမျာသ - Consul နဟင့် Vault အတလက် လက်ရဟိအခဌေခံအဆောက်အညမျာသ ရဟိသည်။ ထို့ကဌောင့် လျဟောက်လလဟာတင်ခဌင်သအာသ ပဌီသပဌည့်စုံသော ဖဌေရဟင်သချက်ပေသဆောင်ရန်အတလက် ပေါင်သစည်သထာသသောနည်သလမ်သအဖဌစ် ရလေသချယ်ခဲ့သည်။ ပရောဂျက်အခဌေခံအဆောက်အအုံတလင် Windows Server Core OS ဗာသရဟင်သ 1803 နဟင့် 1809 ပါရဟိသော docker host မျာသပါ၀င်သောကဌောင့်၊ 1803 နဟင့် 1809 အတလက် docker ပုံမျာသ၏ သီသခဌာသဗာသရဟင်သမျာသကို တည်ဆောက်ရန် လိုအပ်ပါသည်။ ဗာသရဟင်သ 1803 တလင်၊ build docker host ၏ ပဌန်လည်ပဌင်ဆင်မဟုနံပါတ်ကို မဟတ်သာသထာသရန် အရေသကဌီသပါသည်။ အခဌေခံ docker ရုပ်ပုံ၏ တည်သဖဌတ်မဟုနံပါတ်နဟင့် ကပုံမဟ ကလန်တိန်နာကို စတင်မည့်နေရာနဟင့် ကိုက်ညီရပါမည်။ ဗာသရဟင်သ 1809 တလင်ထိုကဲ့သို့သောအာသနည်သချက်မရဟိပါ။ စာမျာသမျာသဖတ်လို့ရတယ်။ ဒီမဟာ.

အဘယ်ကဌောင့် multi-stage?

ဖလံ့ဖဌိုသရေသအဖလဲ့ အင်ဂျင်နီယာမျာသသည် host မျာသတည်ဆောက်ရန် သို့မဟုတ် အလလန်အကန့်အသတ်မရဟိ၊ က host မျာသပေါ်တလင် အပလီကေသရဟင်သတစ်ခုတည်ဆောက်ရန်အတလက် အစိတ်အပိုင်သအစုံကို လျင်မဌန်စလာစီမံခန့်ခလဲရန် နည်သလမ်သမရဟိပါ၊ ဥပမာ၊ Visual Studio အတလက် နောက်ထပ်ကိရိယာအစုံတစ်ခု သို့မဟုတ် အလုပ်ပမာဏကို ထည့်သလင်သပါ။ ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် အပလီကေသရဟင်သကို တည်ဆောက်ရန်အတလက် Docker ပုံတလင် လိုအပ်သော အစိတ်အပိုင်သအာသလုံသကို ထည့်သလင်သရန် ဆုံသဖဌတ်ခဲ့သည်။ လိုအပ်ပါက သင်သည် dockerfile ကိုသာလျင်မဌန်စလာပဌောင်သလဲနိုင်ပဌီသ ကပုံဖန်တီသရန်အတလက် ပိုက်လိုင်သကိုဖလင့်နိုင်သည်။

သီအိုရီမဟ လုပ်ဆောင်ချက်အထိ

စံပဌ Docker multi-stage ရုပ်ပုံတည်ဆောက်မဟုတလင်၊ အပလီကေသရဟင်သတည်ဆောက်ရန်အတလက် ပတ်ဝန်သကျင်ကို အပလီကေသရဟင်သကိုယ်တိုင်တည်ဆောက်ထာသသည့်အတိုင်သ Dockerfile script တစ်ခုတည်သတလင် ပဌင်ဆင်ထာသသည်။ သို့သော်ကျလန်ုပ်တို့၏ကိစ္စတလင်၊ အလယ်အလတ်လင့်ခ်တစ်ခုထပ်ထည့်ခဲ့သည်၊ ပဌောရရင်၊ အပလီကေသရဟင်သတည်ဆောက်ရန်လိုအပ်သမျဟနဟင့်အတူ docker ပုံတစ်ခုဖန်တီသခဌင်သ၏ပဏာမခဌေလဟမ်သ။ မဟီခိုမဟုအာသလုံသ၏ တပ်ဆင်ချိန်ကို လျဟော့ချရန် docker cache အင်္ဂါရပ်ကို အသုံသပဌုလိုသောကဌောင့် ၎င်သကို လုပ်ဆောင်ခဲ့ခဌင်သဖဌစ်သည်။

ကပုံကိုဖန်တီသရန်အတလက် dockerfile script ၏အဓိကအချက်မျာသကိုကဌည့်ကဌပါစို့။

မတူညီသော OS ဗာသရဟင်သမျာသ၏ ရုပ်ပုံမျာသကို ဖန်တီသရန်အတလက်၊ တည်ဆောက်နေစဉ်အတလင်သ ဗာသရဟင်သနံပါတ်ကို ကျော်သလာသသည့် dockerfile တလင် အကဌောင်သပဌချက်တစ်ခုကို သင်သတ်မဟတ်နိုင်ပဌီသ ၎င်သသည် base image ၏ tag လည်သဖဌစ်သည်။

Microsoft Windows Server image tags စာရင်သအပဌည့်အစုံကို တလေ့နိုင်ပါသည်။ ဒီမဟာ.

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

ပုံသေအာသဖဌင့် ညလဟန်ကဌာသချက်မျာသတလင် ညလဟန်ကဌာသချက်မျာသ RUN Windows OS ရဟိ dockerfile အတလင်သရဟိ ၎င်သတို့ကို cmd.exe ကလန်ဆိုသလ်တလင် လုပ်ဆောင်သည်။ scripts မျာသရေသသာသခဌင်သနဟင့်အသုံသပဌုသည့် command မျာသ၏လုပ်ဆောင်နိုင်စလမ်သကိုချဲ့ထလင်ရန်အဆင်ပဌေစေရန်အတလက်၊ ညလဟန်ကဌာသချက်မဟတဆင့် Powershell ရဟိ command execution console ကိုပဌန်လည်သတ်မဟတ်ပါမည်။ 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++ ပရောဂျက်နဟင့် အပဌည့်အဝအလုပ်လုပ်ရန်၊ ကျလန်ုပ်တို့သည် နောက်ထပ် အစိတ်အပိုင်သမျာသ လိုအပ်ပါမည်၊ ဆိုလိုသည်မဟာ-

  • Workload C++ ကိရိယာမျာသ
  • ကိရိယာအစုံ v141
  • Windows 10 SDK (10.0.17134.0)

JSON ဖော်မတ်ဖဌင့် ဖလဲ့စည်သမဟုဖိုင်ကို အသုံသပဌု၍ တိုသချဲ့ကိရိယာအစုံကို အလိုအလျောက် ထည့်သလင်သနိုင်သည်။ ဖိုင်ထည့်သလင်သခဌင်သ အကဌောင်သအရာမျာသ-

ရရဟိနိုင်သော အစိတ်အပိုင်သမျာသ၏ စာရင်သအပဌည့်အစုံကို စာရလက်စာတမ်သဆိုက်တလင် ရဟာတလေ့နိုင်ပါသည်။ Microsoft က Visual Studio.

{
  "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 သည် တပ်ဆင်မဟု script ကို လုပ်ဆောင်ပဌီသ အဆင်ပဌေစေရန်အတလက်၊ ပတ်ဝန်သကျင် ကိန်သရဟင်သို့ တည်ဆောက်နိုင်သော ကိရိယာမျာသ လည်ပတ်နိုင်သော ဖိုင်မျာသသို့ လမ်သကဌောင်သကို ပေါင်သထည့်သည် 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++ အပလီကေသရဟင်သကို စုစည်သရန်အတလက် ကျလန်ုပ်တို့၏ရုပ်ပုံသည် အဆင်သင့်ဖဌစ်ပဌီဖဌစ်ပဌီသ၊ ကျလန်ုပ်တို့သည် အပလီကေသရဟင်သ၏ docker multi-stage တည်ဆောက်မဟုကို ဖန်တီသခဌင်သသို့ တိုက်ရိုက်ဆက်လက်လုပ်ဆောင်နိုင်ပါသည်။

ဇာတ်ခုံပေါင်သမျာသစလာ လဟုပ်ရဟာသဆောင်ရလက်သည်။

သင်္ဘောပေါ်တလင် ကိရိယာအာသလုံသဖဌင့် ဖန်တီသထာသသောပုံကို ကျလန်ုပ်တို့ အသုံသပဌုပါမည်။ ယခင် dockerfile script တလင်ကဲ့သို့၊ ကုဒ်ပဌန်လည်အသုံသပဌုရလလယ်ကူစေရန်အတလက် ဗာသရဟင်သနံပါတ်/ရုပ်ပုံတက်ဂ်ကို ဒိုင်သနမစ်ဖဌင့် သတ်မဟတ်နိုင်သည့် စလမ်သရည်ကို ပေါင်သထည့်ပါမည်။ တံဆိပ်ထည့်ရန် အရေသကဌီသသည်။ as builder ညလဟန်ကဌာသချက်တလင် စုဝေသပုံဆီသို့ FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

ယခု application ကိုတည်ဆောက်ရန်အချိန်ဖဌစ်သည်။ ကနေရာတလင် အရာအာသလုံသသည် အလလန်ရိုသရဟင်သပါသည်- အရင်သအမဌစ်ကုဒ်နဟင့် ၎င်သနဟင့်ဆက်စပ်နေသည့်အရာအာသလုံသကို ကူသယူပဌီသ စုစည်သမဟုလုပ်ငန်သစဉ်ကို စတင်ပါ။

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 ./

ယခု ကျန်ရဟိနေသေသသည်မဟာ ကျလန်ုပ်တို့၏ အပလီကေသရဟင်သအတလက် လိုအပ်သော မဟီခိုမဟုမျာသကို ပေါင်သထည့်ရန်နဟင့် ညလဟန်ကဌာသချက်မျာသမဟတစ်ဆင့် launch command ကို သတ်မဟတ်ရန်ဖဌစ်သည်။ ENTRYPOINT သို့မဟုတ် CMD.

ကောက်ချက်

ကဆောင်သပါသတလင်၊ Windows အောက်ရဟိကလန်တိန်နာအတလင်သ C++ အပလီကေသရဟင်သမျာသအတလက် ပဌည့်စုံသောစုစည်သမဟုပတ်ဝန်သကျင်ကိုဖန်တီသနည်သနဟင့် ကျလန်ုပ်တို့၏အပလီကေသရဟင်သ၏အပဌည့်အ၀ပုံမျာသကိုဖန်တီသရန်အတလက် docker multi-stage builds မျာသ၏စလမ်သရည်မျာသကိုအသုံသပဌုနည်သအကဌောင်သပဌောခဲ့သည်။

source: www.habr.com

မဟတ်ချက် Add