Docker daudzpakāpju izmantoÅ”ana, lai izveidotu Windows attēlus

Sveiki visiem! Mani sauc Andrejs, un es strādāju par DevOps inženieri Exness izstrādes komandā. Mana galvenā darbÄ«ba ir saistÄ«ta ar lietojumprogrammu izveidi, izvietoÅ”anu un atbalstÄ«Å”anu docker operētājsistēmā Linux (turpmāk tekstā ā€“ OS). Pirms neilga laika man bija uzdevums ar tādām paŔām darbÄ«bām, bet projekta mērÄ·a OS bija Windows Server un C++ projektu komplekts. Man Ŕī bija pirmā cieŔā mijiedarbÄ«ba ar docker konteineriem operētājsistēmā Windows un kopumā ar C++ lietojumprogrammām. Pateicoties tam, es guvu interesantu pieredzi un uzzināju par dažām Windows lietojumprogrammu konteinerizÄ“Å”anas sarežģītÄ«bām.

Docker daudzpakāpju izmantoÅ”ana, lai izveidotu Windows attēlus

Å ajā rakstā es vēlos jums pastāstÄ«t, ar kādām grÅ«tÄ«bām man bija jāsaskaras un kā man tās izdevās atrisināt. Es ceru, ka tas noderēs jÅ«su paÅ”reizējiem un turpmākajiem izaicinājumiem. Izbaudi lasÄ«Å”anu!

Kāpēc konteineri?

Uzņēmumam ir esoŔā infrastruktÅ«ra Hashicorp Nomad konteineru orÄ·estrim un ar to saistÄ«tajām sastāvdaļām - Consul un Vault. Tāpēc lietojumprogrammu konteinerizācija tika izvēlēta kā vienota metode pilnÄ«ga risinājuma piegādei. Tā kā projekta infrastruktÅ«rā ir docker hosts ar Windows Server Core OS versijām 1803 un 1809, ir nepiecieÅ”ams izveidot atseviŔķas docker attēlu versijas 1803 un 1809. Versijā 1803 ir svarÄ«gi atcerēties, ka build Docker resursdatora versijas numurs jāatbilst pamata docker attēla un resursdatora versijas numuram, kurā tiks palaists konteiners no Ŕī attēla. Versijai 1809 Ŕādu trÅ«kumu nav. JÅ«s varat lasÄ«t vairāk Å”eit.

Kāpēc daudzpakāpju?

Izstrādes komandas inženieriem nav vai ir ļoti ierobežota piekļuve saimniekdatoru izveidei; nav iespējams ātri pārvaldÄ«t komponentu kopu lietojumprogrammas izveidei Å”ajos resursdatoros, piemēram, instalēt papildu rÄ«ku kopu vai darba slodzi programmai Visual Studio. Tāpēc mēs pieņēmām lēmumu instalēt visus komponentus, kas nepiecieÅ”ami, lai izveidotu lietojumprogrammu Buil Docker attēlā. Ja nepiecieÅ”ams, varat ātri mainÄ«t tikai dockerfailu un palaist Ŕī attēla izveides cauruļvadu.

No teorijas līdz darbībai

Ideālā Docker daudzpakāpju attēla bÅ«vējumā vide lietojumprogrammas izveidei tiek sagatavota tajā paŔā Dockerfile skriptā, kurā tiek veidota pati lietojumprogramma. Bet mÅ«su gadÄ«jumā tika pievienota starpsaite, proti, dokera attēla sākotnējās izveides solis ar visu nepiecieÅ”amo lietojumprogrammas izveidoÅ”anai. Tas tika darÄ«ts, jo es vēlējos izmantot docker keÅ”atmiņas funkciju, lai samazinātu visu atkarÄ«bu instalÄ“Å”anas laiku.

ApskatÄ«sim galvenos dockerfile skripta punktus Ŕī attēla izveidei.

Lai izveidotu dažādu OS versiju attēlus, docker failā varat definēt argumentu, caur kuru versijas numurs tiek nodots būves laikā, un tas ir arī pamata attēla tags.

Pilns Microsoft Windows Server attēlu tagu saraksts ir atrodams Å”eit.

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

Pēc noklusējuma komandas instrukcijās RUN Docker failā operētājsistēmā Windows OS tie tiek izpildÄ«ti konsolē cmd.exe. Skriptu rakstÄ«Å”anas ērtÄ«bai un izmantoto komandu funkcionalitātes paplaÅ”ināŔanai mēs no jauna definēsim komandu izpildes konsoli programmā Powershell, izmantojot instrukciju SHELL.

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

Nākamais solis ir Å”okolādes pakotņu pārvaldnieka un nepiecieÅ”amo pakotņu instalÄ“Å”ana:

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'

Lai instalētu pakotnes, izmantojot chocolatey, varat tās vienkārÅ”i nodot kā sarakstu vai instalēt pa vienai, ja katrai pakotnei ir jānodod unikāli parametri. MÅ«su situācijā mēs izmantojām manifesta failu XML formātā, kurā ir saraksts ar nepiecieÅ”amajām pakotnēm un to parametriem. Tās saturs izskatās Ŕādi:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="python" version="3.8.2"/>
  <package id="nuget.commandline" version="5.5.1"/>
  <package id="git" version="2.26.2"/>
</packages>

Tālāk mēs instalējam lietojumprogrammu veidoÅ”anas vidi, proti, MS Build Tools 2019 - Ŕī ir Visual Studio 2019 vieglā versija, kurā ir minimāli nepiecieÅ”amais komponentu komplekts koda kompilÄ“Å”anai.
Lai pilnībā strādātu ar mūsu C++ projektu, mums būs nepiecieŔami papildu komponenti, proti:

  • Darba slodze C++ rÄ«ki
  • RÄ«ku kopa v141
  • Windows 10 SDK (10.0.17134.0)

Varat automātiski instalēt paplaÅ”inātu rÄ«ku komplektu, izmantojot konfigurācijas failu JSON formātā. Konfigurācijas faila saturs:

Pilns pieejamo komponentu saraksts ir atrodams dokumentācijas vietnē 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"
  ]
}

Dockerfile palaiž instalācijas skriptu un ērtÄ«bas labad pievieno ceļu uz veidoÅ”anas rÄ«ku izpildāmajiem failiem vides mainÄ«gajam PATH. Vēlams arÄ« noņemt nevajadzÄ«gos failus un direktorijus, lai samazinātu attēla izmēru.

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)

Å ajā posmā mÅ«su attēls C++ lietojumprogrammas kompilÄ“Å”anai ir gatavs, un mēs varam pāriet tieÅ”i uz lietojumprogrammas docker daudzpakāpju bÅ«vējuma izveidi.

Daudzpakāpju darbībā

Izveidoto attēlu ar visiem uz klāja esoÅ”ajiem rÄ«kiem izmantosim kā bÅ«ves attēlu. Tāpat kā iepriekŔējā dockerfile skriptā, mēs pievienosim iespēju dinamiski norādÄ«t versijas numuru/attēla tagu, lai atvieglotu koda atkārtotu izmantoÅ”anu. Ir svarÄ«gi pievienot etiÄ·eti as builder uz montāžas attēlu instrukcijās FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Tagad ir pienācis laiks izveidot lietojumprogrammu. Å eit viss ir pavisam vienkārÅ”i: nokopējiet avota kodu un visu, kas ar to saistÄ«ts, un sāciet kompilācijas procesu.

COPY myapp .
RUN nuget restore myapp.sln ;
    msbuild myapp.sln /t:myapp /p:Configuration=Release

GalÄ«gā attēla izveides pēdējais posms ir lietojumprogrammas bāzes attēla norādÄ«Å”ana, kurā atradÄ«sies visi kompilācijas artefakti un konfigurācijas faili. Lai kopētu apkopotos failus no starpposma montāžas attēla, jānorāda parametrs --from=builder instrukcijās COPY.

FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION

COPY --from=builder C:/x64/Release/myapp/ ./
COPY ./configs ./

Tagad atliek tikai pievienot nepiecieŔamās atkarības, lai mūsu lietojumprogramma darbotos, un norādīt palaiŔanas komandu, izmantojot instrukcijas ENTRYPOINT vai CMD.

Secinājums

Šajā rakstā es runāju par to, kā izveidot pilnvērtīgu kompilācijas vidi C++ lietojumprogrammām konteinerā sistēmā Windows un kā izmantot docker daudzpakāpju būvējumu iespējas, lai izveidotu pilnvērtīgus mūsu lietojumprogrammas attēlus.

Avots: www.habr.com

Pievieno komentāru