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

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster