Përdorimi i docker multi-stage për ndërtimin e imazheve Windows

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.

Përdorimi i docker multi-stage për ndërtimin e imazheve 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ë këtu.

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 këtu.

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

Nga 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 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"
  ]
}

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ërtues

Ka 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=Release

Faza 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

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster