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

PĂ«rshĂ«ndetje tĂ« gjithĂ«ve! UnĂ« quhem Andrey dhe punoj si inxhinier DevOps nĂ« kompaninĂ« Exness nĂ« ekipin e zhvillimit. Aktiviteti im kryesor lidhet me ndĂ«rtimin, shpĂ«rndarjen dhe mbĂ«shtetje pĂ«r aplikacione nĂ« docker nĂ«n sistemin operativ Linux (mĂ« pas — SO). Disa kohĂ« mĂ« parĂ«, mĂ« erdhi njĂ« detyrĂ« me aktivitete tĂ« ngjashme, por si SO e projektit u zgjodh Windows Server dhe njĂ« grup projektesh nĂ« C++. PĂ«r mua, kjo ishte ndĂ«rveprimi i parĂ« i ngushtĂ« me kontenierĂ«t docker nĂ« SO Windows dhe nĂ« pĂ«rgjithĂ«si me aplikacionet e C++. FalĂ« kĂ«saj, fitova njĂ« pĂ«rvojĂ« interesante dhe mĂ«sova disa hollĂ«si rreth kontenierizimit tĂ« aplikacioneve nĂ« SO Windows.

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

Në këtë artikull do të flas për sfidat me të cilat u përballa dhe si arrita t'i zgjidh. Shpresoj se kjo do të jetë e dobishme për zgjidhjen e detyrave tuaja aktuale dhe të ardhshme. Lexim të këndshëm!

Pse kontenierët?

NĂ« kompani ekziston njĂ« infrastrukturĂ« e orkestratorit tĂ« kontenierĂ«ve Hashicorp Nomad dhe pĂ«rbĂ«rĂ«sit pĂ«rkatĂ«s — Consul dhe Vault. Prandaj, kontenierizimi i aplikacioneve u zgjodh si njĂ« metodĂ« e unifikuar pĂ«r shpĂ«rndarjen e zgjidhjeve tĂ« gatshme. Duke qenĂ« se nĂ« infrastrukturĂ«n e projektit ka docker-host me versione tĂ« Windows Server Core 1803 dhe 1809, Ă«shtĂ« e nevojshme tĂ« ndahen veçmas versionet e docker-images pĂ«r 1803 dhe 1809. NĂ« versionin 1803, Ă«shtĂ« e rĂ«ndĂ«sishme tĂ« mbani mend se numri i rishikimit tĂ« docker-hostit duhet tĂ« pĂ«rputhet me numrin e rishikimit tĂ« docker-image bazĂ« dhe hostit ku do tĂ« nisĂ« kontenieri nga ky imazh. Versioni 1809 Ă«shtĂ« pa kĂ«tĂ« mangĂ«si. MĂ« shumĂ« mund tĂ« lexoni kĂ«tu.

Pse multi-stage?

InxhinierĂ«t e ekipeve tĂ« zhvillimit nuk kanĂ« akses nĂ« docker-host pĂ«r ndĂ«rtim ose ky akses Ă«shtĂ« shumĂ« i kufizuar, nuk kanĂ« mundĂ«si pĂ«r tĂ« menaxhuar shpejt grupin e pĂ«rbĂ«rĂ«sve pĂ«r ndĂ«rtimin e aplikacionit nĂ« kĂ«to host, pĂ«r shembull, pĂ«r tĂ« instaluar njĂ« toolset ose workload shtesĂ« pĂ«r Visual Studio. Prandaj, ne morĂ«m vendimin — tĂ« instalojmĂ« tĂ« gjithĂ« komponentĂ«t e nevojshĂ«m pĂ«r ndĂ«rtimin e aplikacionit nĂ« docker-image ndĂ«rtimi. Kur Ă«shtĂ« e nevojshme, mund tĂ« ndryshohet mjaft shpejt vetĂ«m dockerfile dhe tĂ« nisĂ«t pipeline pĂ«r krijimin e kĂ«tij imazhi.

Nga teoria në praktikë

Në ndërtimin ideal të një docker multi-stage, përgatitja e mjedisit për ndërtimin e aplikacionit ndodh në të njëjtin skript dockerfile si dhe ndërtimi i aplikacionit vetë. Por në rastin tonë është shtuar një element ndërmjetës, konkretisht, një hap paraprak për krijimin e docker-image me gjithçka të nevojshme për ndërtimin e aplikacionit. Kjo është bërë sepse dëshironim të shfrytëzonim mundësinë e cache-it të docker, në mënyrë që të zvogëlojmë kohën e instalimit 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, nëpërmjet të cilit gjatë ndërtimit përcillet numri i versionit, dhe ai është gjithashtu etiketa e imazhit bazë.

Lista e plotë e etiketeve të imazheve të Microsoft Windows Server mund të gjendet këtu.

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

Me default, komandat në udhëzim RUN brenda dockerfile në OS Windows ekzekutohen në konsolën cmd.exe. Për lehtësimin e shkruarjes së skripteve dhe zgjerimin e funksionalitetit të komandave të përdorura, do të rindezim konsolën e ekzekutimit të komandave në Powershell përmes udhëzimit SHELL.

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]

Hapi tjetër është të instalojmë menaxherin e paketave chocolatey dhe paketat 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ë përcillni thjesht ato si një listë ose ta instaloni një nga një në rast se nevojitet të jepen parametra unikë për secilën paketë. Në situatën tonë, ne përdorëm një skedë manifesti në formatin XML, në të cilin është përfshirë një listë e paketave të nevojshme dhe parametrit e tyre. Pjesa e saj duket kështu:

NĂ« vazhdim, ne instalojmĂ« mjedisin 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 nĂ« vetvete grupin minimal tĂ« komponentĂ«ve tĂ« nevojshĂ«m pĂ«r pĂ«rpilimin e kodit.
Për një funksionim të plotë me projektin tonë C++, do të na nevojiten komponentë të tjerë, konkretisht:

  • Workload C++ tools
  • Toolset v141
  • Windows 10 SDK (10.0.17134.0)

Mundësi për të instaluar grupin e avancuar të mjeteve automatikisht është e mundur përmes një skedari konfigurimi në formatin JSON. Përmbajtja e skedarit të konfigurimit:

Lista e plotë e komponentëve të disponueshëm 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"
  ]
}

Në dockerfile ekzekutohet skripti i instalimit, dhe për lehtësi shtohet rruga për skedarët ekzekutivë të mjeteve të ndërtimit në variablin e mjedisit për. Gjithashtu, është e dëshirueshme të fshihen skedarët dhe direktoritë e panevojshme 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 ndërtimin e aplikacionit C++ është gati, dhe mund të kalojmë direkt në krijimin e ndërtimit multi-stage të aplikacionit.

Multi-stage në veprim

Si imazh ndĂ«rtimi do tĂ« pĂ«rdorim imazhin e krijuar me tĂ« gjitha mjetet nĂ« bord. Si nĂ« skriptin e mĂ«parshĂ«m tĂ« dockerfile, do tĂ« shtojmĂ« mundĂ«sinĂ« pĂ«r tĂ« caktuar dinamikisht numrin e versionit/tag-ut tĂ« imazhit pĂ«r lehtĂ«si nĂ« ripĂ«rdorimin e kodit. ËshtĂ« e rĂ«ndĂ«sishme tĂ« shtohet etiketĂ« as builder nĂ« imazhin e ndĂ«rtimit nĂ« udhĂ«zimin FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Ka ardhur momenti për ndërtimin e aplikacionit. Këtu gjithçka është mjaft e thjeshtë: kopjoni kodin burimor dhe gjithçka që lidhet 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 — caktimi i imazhit bazĂ« tĂ« aplikacionit, ku do tĂ« vendosen tĂ« gjitha artefaktet e kompilimit dhe skedarĂ«t e konfigurimit. PĂ«r tĂ« kopjuar skedarĂ«t e kompiluar nga imazhi ndĂ«rtimor ndĂ«rmjetĂ«sor, duhet tĂ« caktohet parametri --from=builder nĂ« manualin 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ë caktojmë komandën e nisjes përmes udhëzimeve ENTRYPOINT ose CMD.

Përfundim

Në këtë artikull, t'u tregoj se si të krijoni një mjedis të plotë për kompilimin e aplikacioneve C++ brenda një kontejneri në Windows dhe se si të shfrytëzoni mundësitë e ndërtimit multi-stage të docker për të krijuar imazhe të plota të aplikacionit tonë.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster