Ukusebenzisa i-docker yamanqanaba amaninzi ukwakha imifanekiso yeefestile

Molweni nonke! Igama lam nguAndrey, kwaye ndisebenza njengenjineli ye-DevOps kwi-Exness kwiqela lophuhliso. Owona msebenzi wam unxulumene nokwakha, ukuthunyelwa kunye nokuxhasa izicelo kwidokhi phantsi kwenkqubo yokusebenza yeLinux (emva koku kubhekiselwa kuyo njenge-OS). Kungekudala ndandinomsebenzi ngemisebenzi efanayo, kodwa i-OS ekujoliswe kuyo yeprojekthi yayiyiWindows Server kunye nesethi yeeprojekthi zeC ++. Kum, le yayiyintsebenziswano yokuqala esondeleyo kunye nezikhongozeli ze-docker phantsi kwe-Windows OS kwaye, ngokubanzi, kunye ne-C ++ izicelo. Ndiyabulela koku, ndibe namava anomdla kwaye ndafunda malunga nobunye ubucukubhede bokufaka izicelo kwiWindows.

Ukusebenzisa i-docker yamanqanaba amaninzi ukwakha imifanekiso yeefestile

Kweli nqaku ndifuna ukunixelela ukuba bubuphi ubunzima ekwakufuneka ndijamelane nabo nendlela endiye ndakwazi ukubucombulula ngayo. Ndiyathemba ukuba oku kuluncedo kwimingeni yakho yangoku neyexesha elizayo. Konwabele ukufunda!

Kutheni izitya?

Inkampani inamaziko akhoyo e-Hashicorp Nomad ye-orchestrator yeekhonteyina kunye namacandelo anxulumeneyo - i-Consul kunye neVault. Ke ngoko, ukufakwa kwesingxobo sesicelo kwakhethwa njengendlela edityanisiweyo yokuzisa isisombululo esipheleleyo. Ekubeni isiseko seprojekthi siqulethe i-docker hosts kunye ne-Windows Server Core OS versions 1803 kunye ne-1809, kuyimfuneko ukwakha iinguqulelo ezahlukeneyo zemifanekiso ye-docker ye-1803 kunye ne-1809. kufuneka ithelekise inani lohlaziyo lomfanekiso wedocker esisiseko kunye nenginginya apho isikhongozeli esivela kulo mfanekiso sizakusungulwa. Inguqulo ye-1803 ayinayo i-drawback enjalo. Unokufunda ngakumbi apha.

Kutheni izigaba ezininzi?

Iinjineli zeqela lophuhliso azinalo okanye zinofikelelo olulinganiselweyo lokwakha iinginginya; akukho ndlela yokulawula ngokukhawuleza iseti yamacandelo okwakha isicelo kule mikhosi, umzekelo, fakela isixhobo esongezelelweyo okanye umthwalo womsebenzi weVisual Studio. Ke ngoko, senze isigqibo sokufaka onke amacandelo ayimfuneko ukwakha isicelo kumfanekiso weDocker. Ukuba kuyimfuneko, unokutshintsha ngokukhawuleza kuphela ifayile ye-docker kwaye uqalise umbhobho wokudala lo mfanekiso.

Ukusuka kwithiyori ukuya kwisenzo

Kwisakhiwo esifanelekileyo somfanekiso weDocker onamanqanaba amaninzi, imeko-bume yokwakha isicelo ilungiswa kwiskripthi esifanayo seDockerfile njengoko isicelo ngokwaso sakhiwe. Kodwa kwimeko yethu, ikhonkco eliphakathi longezwa, oko kukuthi, inyathelo lokuqala lokudala umfanekiso we-docker nayo yonke into eyimfuneko yokwakha isicelo. Oku kwenziwa kuba bendifuna ukusebenzisa inqaku le-docker cache ukunciphisa ixesha lofakelo lwabo bonke abaxhomekeke.

Makhe sijonge amanqaku aphambili eskripthi se-dockerfile sokwenza lo mfanekiso.

Ukudala imifanekiso yeenguqulelo ezahlukeneyo ze-OS, unokuchaza ingxabano kwi-dockerfile apho inombolo yenguqulo idluliswa ngexesha lokwakha, kwaye ikwayithegi yomfanekiso wesiseko.

Uluhlu olupheleleyo lweethegi zemifanekiso ye-Microsoft Windows Server inokufunyanwa apha.

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

Ngokungagqibekanga imiyalelo kwimiyalelo RUN ngaphakathi kwifayile yedocker kwiWindows OS ziyenziwa kwi cmd.exe console. Ukwenza lula ukubhala izikripthi kunye nokwandisa ukusebenza kwemiyalelo esetyenzisiweyo, siya kuchaza kwakhona i-console yophumezo yomyalelo kwi-Powershell ngomyalelo. SHELL.

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

Inyathelo elilandelayo kukufaka umphathi wepakethe yechocolatey kunye neepakethe eziyimfuneko:

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'

Ukufakela iipakethi usebenzisa itshokolethi, unokuzidlulisa nje njengoluhlu, okanye uzifake ibe nye ngexesha ukuba ufuna ukudlula iiparamitha ezizodwa kwiphakheji nganye. Kwimeko yethu, sisebenzise ifayile ye-manifest kwifomathi ye-XML, equlethe uluhlu lweepakethe ezifunekayo kunye neeparitha zazo. Imixholo yayo ibonakala ngolu hlobo:

<?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>

Emva koko, sifaka indawo yokwakha isicelo, oko kukuthi, i-MS Build Tools 2019 - le yinguqulelo ekhaphukhaphu ye-Visual Studio 2019, equlethe isethi encinci efunekayo yamacandelo okudibanisa ikhowudi.
Ukuze sisebenze ngokupheleleyo kunye neprojekthi yethu ye-C ++, siya kufuna izinto ezongezelelweyo, ezizezi:

  • Umsebenzi weC ++ izixhobo
  • Iseti yesixhobo v141
  • Windows 10 SDK (10.0.17134.0)

Unokufakela isethi eyandisiweyo yezixhobo ngokuzenzekelayo usebenzisa ifayile yoqwalaselo kwifomathi ye-JSON. Imixholo yefayile yoqwalaselo:

Uluhlu olupheleleyo lwamacandelo akhoyo lunokufumaneka kwisiza samaxwebhu 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"
  ]
}

Ifayile yedocker iqhuba ushicilelo lofakelo, kwaye ukwenzela lula, yongeza umendo kwizixhobo zokwakha iifayile eziphunyeziweyo kuguquguquko lwemekobume. PATH. Kukwacetyiswa ukuba ususe iifayile ezingeyomfuneko kunye nezalathisi zokunciphisa ubungakanani bomfanekiso.

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)

Kweli nqanaba, umfanekiso wethu wokudibanisa isicelo se-C ++ ulungile, kwaye sinokuqhubeka ngokuthe ngqo ekudaleni i-docker yamanqanaba amaninzi esicelo.

Amanqanaba amaninzi kwintshukumo

Siza kusebenzisa umfanekiso owenziweyo kunye nazo zonke izixhobo ezisebhodini njengomfanekiso wokwakha. Njengoko kwiskripthi sefayile ye-docker yangaphambili, siya kongeza ukukwazi ukucacisa ngokuguquguqukayo inombolo yoguqulelo/ithegi yomfanekiso ukuze kube lula ukusebenzisa ikhowudi kwakhona. Kubalulekile ukongeza ileyibhile as builder kumfanekiso wendibano kwimiyalelo FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Ngoku lixesha lokwakha isicelo. Yonke into elapha ilula kakhulu: khuphela ikhowudi yemvelaphi kunye nayo yonke into ehambelana nayo, kwaye uqalise inkqubo yokuqokelela.

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

Inqanaba lokugqibela lokudala umfanekiso wokugqibela kukucacisa umfanekiso osisiseko wesicelo, apho zonke izinto zokudibanisa kunye neefayile zoqwalaselo ziya kufumaneka. Ukukhuphela iifayile eziqokelelweyo kumfanekiso wendibano ephakathi, kufuneka ucacise iparameter --from=builder kwimiyalelo COPY.

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

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

Ngoku konke okuseleyo kukongeza ukuxhomekeka okuyimfuneko ukuze isicelo sethu sisebenze kwaye sicacise umyalelo wokuqaliswa ngemiyalelo ENTRYPOINT okanye CMD.

isiphelo

Kweli nqaku, ndithethe malunga nendlela yokwenza indawo egcweleyo yokuhlanganiswa kwezicelo ze-C ++ ngaphakathi kwesitya esiphantsi kweWindows kunye nendlela yokusebenzisa ubuchule be-docker multi-stage builds to create full-fledged images of our application.

umthombo: www.habr.com

Yongeza izimvo