PĂ«rshĂ«ndetje tĂ« gjithĂ«ve! UnĂ« quhem Andrei dhe punoj si inxhinier DevOps nĂ« kompaninĂ« Exness nĂ« ekipin e zhvillimit. Aktiviteti im kryesor lidhet me ndĂ«rtimin, shpĂ«rndarjen dhe mbĂ«shtetje aplikacionesh nĂ« docker nĂ«n sistemin operativ Linux (mĂ« pas â SO). KohĂ«t e fundit, mĂ« doli njĂ« detyrĂ« me aktivitete tĂ« ngjashme, por si sistem operativ i synuar pĂ«r projektin u bĂ« Windows Server dhe njĂ« grup projektesh nĂ« C++. Kjo ishte hera e parĂ« qĂ« kishim njĂ« bashkĂ«punim tĂ« ngushtĂ« me kontenierĂ«t docker nĂ«n SO Windows dhe nĂ« pĂ«rgjithĂ«si me aplikacionet nĂ« C++. FalĂ« kĂ«saj, fitova njĂ« pĂ«rvojĂ« interesante dhe mĂ«sova disa nuanca tĂ« kontenierizimit tĂ« aplikacioneve nĂ« SO Windows.

Në këtë artikull, dua të tregoj për sfidat që kam hasur, si arritëm t'i zgjidhim ato. Shpresoj se do të jetë e dobishme për zgjidhjen e detyrave tuaja aktuale dhe të ardhshme. Lexim të këndshëm!
Pse kontenierët?
Kompania ka njĂ« infrastrukturĂ« ekzistuese orkestrator container-ash Hashicorp Nomad dhe komponentĂ«ve tĂ« lidhur â Consul dhe Vault. Prandaj, kontenizimi i aplikacioneve u zgjodh si njĂ« metodĂ« e unifikuar pĂ«r dorĂ«zimin e zgjidhjeve tĂ« gatshme. Duke qenĂ« se nĂ« infrastrukturĂ«n e projektit ka docker-hosts me versione tĂ« sistemit operativ Windows Server Core 1803 dhe 1809, Ă«shtĂ« e nevojshme tĂ« mblidhen veçmas versionet e docker-images pĂ«r 1803 dhe 1809. NĂ« versionin 1803 Ă«shtĂ« e rĂ«ndĂ«sishme tĂ« kujtohet se numri i rishikimit tĂ« docker-hostit tĂ« ndĂ«rtimit duhet tĂ« pĂ«rputhet me numrin e rishikimit tĂ« docker-image bazĂ« dhe hostit, ku konteneri nga ky imazh do tĂ« startohet. Versioni 1809 e ka evituar kĂ«tĂ« mangĂ«si. Mund tĂ« lexoni mĂ« shumĂ« .
Pse multi-stage?
InxhinierĂ«t e ekipeve tĂ« zhvillimit nuk kanĂ« akses nĂ« hostet e ndĂ«rtimit ose ai Ă«shtĂ« shumĂ« i kufizuar, dhe nuk ka mundĂ«si tĂ« menaxhojnĂ« shpejt grupin e komponentĂ«ve pĂ«r ndĂ«rtimin e aplikacionit nĂ« kĂ«to hoste, pĂ«r shembull, tĂ« instalojnĂ« njĂ« toolset apo workload tĂ« shtuar pĂ«r Visual Studio. Prandaj, ne morĂ«m vendimin â tĂ« instalojmĂ« tĂ« gjitha komponentĂ«t e nevojshĂ«m pĂ«r ndĂ«rtimin e aplikacionit nĂ« imazhin docker tĂ« ndĂ«rtimit. NĂ«se Ă«shtĂ« e nevojshme, mund tĂ« ndryshohet mjaft shpejt vetĂ«m dockerfile dhe tĂ« niset pipeline pĂ«r krijimin e kĂ«tij imazhi.
Nga teoria në praktikë
Në ndërtimin ideal docker multi-stage, përgatitja e ambientit për ndërtimin e aplikacionit ndodh në të njëjtin skript dockerfile që edhe ndërtimi i vetë aplikacionit. Por në rastin tonë është shtuar një lidhje ndërmjetëse, konkretisht, një hap përgatitor për krijimin e imazhit docker me gjithçka të nevojshme për ndërtimin e aplikacionit. Kjo është bërë, sepse dëshirohej të përdorej mundësia e docker cache, për të shkurtuar kohën e instalimit të të gjitha varësive.
Le të shqyrtojmë pikat kryesore të skriptit dockerfile për formimin e këtij imazhi.
Për krijimin e imazheve të versioneve të ndryshme të OS në dockerfile, mund të përcaktohet një argument, përmes të cilit kalon numri i versionit gjatë ndërtimit, dhe ai është gjithashtu etiketa e imazhit bazë.
Lista e plotë e etiketave të imazheve të Microsoft Windows Server mund të finds .
ARG WINDOWS_OS_VERSION=1809
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSIONNga e para, komandat në instrukcionet RUN brenda dockerfile në OS Windows ekzekutohen në konsolën cmd.exe. Për lehtësimin e shkruarjes së skripteve dhe zgjerimin e funksionaliteteve të komandave të përdorura, do të ndryshojmë konsolën e ekzekutimit të komandave në Powershell përmes instrukcionit SHELL.
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]Hapi tjetër është instalimi i menaxherit të pakove chocolatey dhe pakot e nevojshme:
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'Për të instaluar paketat duke përdorur chocolatey, mund të thjesht kaloni ato si një listë ose të instaloni një nga një në rast se është e nevojshme të kaloni parametra unike për secilën paketë. Në situatën tonë ne përdorëm një skedë manifesti në formatin XML, në të cilin është e shënuar lista e paketave të nevojshme dhe parametrat e tyre. Përmbajtja e saj duket kështu:
MĂ« pas, ne instalojmĂ« ambientin e ndĂ«rtimit tĂ« aplikacionit, konkretisht, MS Build Tools 2019 â kjo Ă«shtĂ« njĂ« version i lehtĂ«suar i Visual Studio 2019, i cili pĂ«rmban setin minimal tĂ« komponentĂ«ve pĂ«r kompaktimin e kodit.
Për të punuar plotësisht me projektin tonë C++, na duhen komponentë shtesë, konkretisht:
- Workload C++ tools
- Toolset v141
- Windows 10 SDK (10.0.17134.0)
Instalimi automatik i setit të zgjeruar të gjithënve mund të bëhet nëpërmjet një skedari konfigurimi në formatin JSON. Përmbajtja e skedarit të konfigurimit:
Lista e plotë e komponenteve të disponueshme mund të gjendet në faqen e dokumentacionit .
{
"version": "1.0",
"components": [
"Microsoft.Component.MSBuild",
"Microsoft.VisualStudio.Workload.VCTools;includeRecommended",
"Microsoft.VisualStudio.Component.VC.v141.x86.x64",
"Microsoft.VisualStudio.Component.Windows10SDK.17134"
]
}Një skript i instalimentimi ekzekutohet në dockerfile, dhe për komoditet, shtohet një rrugë për skedarët ekzekutivë të build tools në variablin e ambientit PATH. Gjithashtu, është e preferueshme të hiqni skedarët dhe direktorët e panevojshëm për të zvogëluar madhësinë e imazhit.
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)Në këtë fazë, imazhi ynë për kompaktimin e aplikacioneve C++ është gati, dhe mund të fillojmë ndërtimin e aplikacionit me docker multi-stage.
Multi-stage në veprim
Si pĂ«r imazhin e ndĂ«rtimit do tĂ« pĂ«rdorim imazhin e krijuar me gjithĂ« mjetet e nevojshme nĂ« tĂ«. Ashtu si nĂ« skriptin e mĂ«parshĂ«m tĂ« dockerfile, do tĂ« shtojmĂ« mundĂ«sinĂ« pĂ«r tĂ« treguar dinamikisht numrin e versionit/tag-it tĂ« imazhit pĂ«r lehtĂ«sinĂ« e ripĂ«rdorimit tĂ« kodit. ĂshtĂ« e rĂ«ndĂ«sishme tĂ« shtohet etiketĂ« si ndĂ«rtues nĂ« imazhin e ndĂ«rtimit nĂ« udhĂ«zim FROM.
ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION si ndërtuesKa ardhur koha për të ndërtuar aplikacionin. Këtu është mjaft e thjeshtë: kopjoni kodin burimor dhe të gjitha ato që lidhen me të, dhe filloni procesin e kompilimit.
COPY myapp .
RUN nuget restore myapp.sln ;
msbuild myapp.sln /t:myapp /p:Configuration=ReleaseFaza përfundimtare e krijimit të imazhit përfundimtar është përcaktimi i imazhit bazë të aplikacionit, ku do të ndodhen të gjitha artefaktet e kompilimit dhe skedarët e konfigurimit. Për të kopjuar skedarët e kompiluara nga imazhi ndërmjetës, duhet të specifikohet parametri --from=builder në udhëzimin COPY.
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION
COPY --from=builder C:/x64/Release/myapp/ ./
COPY ./configs ./Tani mbetet të shtojmë varësitë e nevojshme për funksionimin e aplikacionit tonë dhe të specifikojmë komandën e lançimit përmes udhëzimeve ENTRYPOINT ose CMD.
Përfundimi
Në këtë artikull, kam shpjeguar se si të krijoni një ambient të plotë për kompilimin e aplikacioneve C++ brenda një konteineri në Windows dhe si të përdorni mundësitë e ndërtimit shumë-fazësh të docker për të krijuar imazhe të plota të aplikacionit tonë.
Burimi: habr.com
