Tere kĂ”igile! Minu nimi on Andrei ja ma töötan DevOps insenerina ettevĂ”ttes Exness arendustiimis. Minu peamine tegevus on seotud rakenduste kokkupaneku, juurutamise ja toe pakkumisega Dockeris Linuxi operatsioonisĂŒsteemis. Hiljuti sain ĂŒlesande, kus tuli tegeleda samade tegevustega, kuid sihiks valiti Windows Server ja komplekt projekte C++ keeles. See oli minu esimene tihe koostöö Windowsi operatsioonisĂŒsteemis olevate Docker konteineritega ja ĂŒldiselt C++ rakendustega. TĂ€nu sellele omandasin huvitava kogemuse ja sain teada mĂ”ningatest rakenduste konteineriseerimise nĂŒanssidest Windowsi operatsioonisĂŒsteemis.

Selles artiklis tahan rÀÀkida, milliste raskustega ma kokku puutusin ja kuidas me need lahendasime. Loodan, et see osutub kasulikuks teie praeguste ja tulevaste ĂŒlesannete lahendamisel. Head lugemist!
Miks konteinerid?
EttevĂ”ttes on olemasolev konteinerite orkestri infrastruktuur Hashicorp Nomad ning seotud komponendid â Consul ja Vault. SeetĂ”ttu valiti rakenduste konteineriseerimine kui standardiseeritud meetod valmis lahenduse tarnimiseks. Kuna projekti infrastruktuuris on Docker hostid Windows Server Core 1803 ja 1809 versioonidega, tuleb erinevate versioonide Docker piltide eraldi kokkupanek. Versioonis 1803 on oluline meeles pidada, et Docker hosti koostamise versioon peab ĂŒhtima baaspildi nummeriga ja hostiga, kus konteiner sellest pildist kĂ€ivitatakse. Versioon 1809 on sellisest puudusest vabastatud. Lisainfot saab lugeda .
Miks multi-stage?
Arendustiimide inseneridel ei ole juurdepÀÀsu koostamishostidele vĂ”i see on vĂ€ga piiratud, neil puudub vĂ”imalus kiiresti hallata rakenduse koostamiseks vajalikku komponentide komplekti, nĂ€iteks paigaldada tĂ€iendavat tööriistakomplekti vĂ”i töökoormust Visual Studio jaoks. SeetĂ”ttu otsustasime â kĂ”ik rakenduse koostamiseks vajalikud komponendid paigaldada koostamis Docker pildile. Vajadusel on piisavalt kiire ainult Dockerfile'i muutmine ja selle pildi lĂ€htestamise torujuhtme kĂ€ivitamine.
Teooriast praktikasse
Ideaalne Docker multi-stage pildi koostamisel toimub rakenduse koostamiseks keskkonna ettevalmistamine samas dockerfile skriptis, kus toimub ka rakenduse koostamine. Kuid meie juhul lisati vahe etapp, nimelt Docker-pildi eelne loomine, millel on kÔik vajalik rakenduse koostamiseks. See tehti, kuna sooviti kasutada Docker cache'i, et vÀhendada kÔigi sÔltuvuste installimise aega.
Vaatame selle pildi loomise Dockerfile skripti pÔhielemente.
Erinevate opsĂŒsteemide versioonide piltide loomiseks Dockerfile'is saab mÀÀrata argumendi, mille kaudu edastatakse ehitamisel versiooni number, ja see on ka pĂ”hiala tegg.
Microsoft Windows Server piltide tÀislitade loendi leiate .
ARG WINDOWS_OS_VERSION=1809
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSIONVaikimisi kĂ€sklused juhises KĂIVITA Dockerfile'is Windowsis tĂ€idetakse cmd.exe konsoolis. Skriptide kirjutamise mugavuse ja kasutatavate kĂ€skude funktsionaalsuse laiendamiseks muudame kĂ€skude tĂ€itmise konsooli Powershelliks juhise kaudu SHELL.
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]JĂ€rgmise sammuna installime pakihalduri Chocolatey ja vajalikud paketid:
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'Pakettide installimiseks Chocolatey abil saab lihtsalt edastada need loetelu kujul vĂ”i paigaldada ĂŒkshaaval, kui on vajalik edastada iga paketi jaoks unikaalsed parameetrid. Meie olukorras kasutasime XML-vormingus manifestifaili, milles on mĂ€rgitud vajalikud paketid ja nende parameetrid. Selle sisu nĂ€eb vĂ€lja jĂ€rgmine:
SeejĂ€rel installime rakenduse koostamiseks keskkonna, nimelt MS Build Tools 2019 â see on Visual Studio 2019 kerge versioon, mis sisaldab minimaalset vajalikku komponentide kogumit koodi kompileerimiseks.
Meie C++ projekti tÀielikuks tööks on vaja tÀiendavaid komponente, nimelt:
- C++ tööriistakomplekt
- Tööriistakomplekt v141
- Windows 10 SDK (10.0.17134.0)
TĂ€pse tööriistakomplekti paigaldamine automaatreĆŸiimis on vĂ”imalik JSON-formaadis konfiguratsioonifaili abil. Konfiguratsioonifaili sisu:
TĂ€ieliku saadaval olevate komponentide nimekirja leiate dokumentatsiooni veebisaidilt .
{
"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'is kÀivitatakse installiskeem ja mugavuse huvides lisatakse build tools'i kÀivitatavate failide tee keskkonnamuutujasse PATH. Samuti on soovitatav eemaldada kÔik pÔletamata failid ja kaustad, et vÀhendada pildi suurust.
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)Selles etapis on meie C++ rakenduse kompileerimiseks mÔeldud pilt valmis ja saame liikuda rakenduse docker multi-stage ehitamise juurde.
Multi-stage tegevuses
Kuna kogumispilti kasutame loodud pilti kĂ”igi tööriistadega pardal. Nagu eelnevas dockerfile'i skriptis, lisame vĂ”imaluse dĂŒnaamiliselt nĂ€idata pildi versiooni/ mĂ€rgist. Oluline on lisada silt kui builder kogumispildile kasutusjuhendis KUST.
ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builderOn jĂ€rjekord rakenduse ĂŒlesehitamiseks. Siin on kĂ”ik ĂŒsna lihtne: kopeerida allikakood ja kĂ”ik sellega seotud failid, ning alustada kompileerimisprotsessi.
COPY myapp .
RUN nuget restore myapp.sln ;
msbuild myapp.sln /t:myapp /p:Configuration=ReleaseLĂ”ppfaasi loomine lĂ”pptootepildiks â aluskuvandi mÀÀramine, kuhu asetatakse kĂ”ik kompileerimisartefaktid ja konfiguratsioonifailid. Kompileeritud failide kopeerimiseks vahekogumispildilt tuleb mĂ€rkida parameeter --from=builder kasutaja juhendis COPY.
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION
COPY --from=builder C:/x64/Release/myapp/ ./
COPY ./configs ./NĂŒĂŒd jÀÀb veel lisada vajalikud sĂ”ltuvused meie rakenduse jaoks ja mÀÀrata kĂ€ivitamise kĂ€sk juhiste kaudu ENTRYPOINT vĂ”i CMD.
KokkuvÔte
Selles artiklis rÀÀgin, kuidas luua tÀielikku C++ rakenduste kompileerimise keskkonda Windowsi konteineris ning kuidas kasutada docker multi-stage ehitamise vÔimalusi meie rakenduse tÀispiltide loomiseks.
Allikas: habr.com
