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
