Gebruik docker-multi-stadium om Windows-beelde te bou

Hallo almal! My naam is Andrey, en ek werk as 'n DevOps-ingenieur by Exness in die ontwikkelspan. My primêre fokus is die bou, ontplooiing en instandhouding van Docker-toepassings wat op die bedryfstelsel loop. Linux (hierna verwys as OS). Nie lank gelede nie, het ek 'n taak met dieselfde aktiwiteite gehad, maar die projek se teiken-OS het geword Windows Server en 'n stel C++-projekte. Vir my was dit die eerste noue interaksie met Docker-houers onder OS. Windows en C++-toepassings in die algemeen. Dit het my 'n interessante ervaring gegee en my van die ingewikkeldhede van die houerisering van toepassings in die bedryfstelsel geleer. Windows.

Gebruik docker-multi-stadium om Windows-beelde te bou

In hierdie artikel wil ek jou vertel watter probleme ek moes trotseer en hoe ek dit reggekry het om dit op te los. Ek hoop dit is nuttig vir jou huidige en toekomstige uitdagings. Lekker lees!

Hoekom houers?

Die maatskappy het 'n bestaande infrastruktuur van die Hashicorp Nomad-houerorkestrator en verwante komponente—Consul en Vault. Daarom is toepassingshouerisering gekies as 'n verenigde metode vir die lewering van die finale oplossing. Aangesien die projek se infrastruktuur Docker-gashere met OS-weergawes insluit Windows Server As jy Core 1803 en 1809 gebruik, moet jy aparte Docker-beeldweergawes vir 1803 en 1809 bou. In weergawe 1803 is dit belangrik om te onthou dat die hersieningsnommer van die Docker-bougasheer moet ooreenstem met die hersieningsnommer van die basiese Docker-beeld en die gasheer waar die houer van hierdie beeld gelanseer sal word. Weergawe 1809 skakel hierdie probleem uit. Jy kan meer daaroor hier lees. hier.

Hoekom multi-stadium?

Ontwikkelingspaningenieurs het geen of baie beperkte toegang om gashere te bou nie; daar is geen manier om die stel komponente vinnig te bestuur om 'n toepassing op hierdie gashere te bou nie, byvoorbeeld om 'n bykomende gereedskapstel of werklading vir Visual Studio te installeer. Daarom het ons die besluit geneem om al die komponente te installeer wat nodig is om die toepassing in die bou Docker-beeld in te bou. Indien nodig, kan u net die docker-lêer vinnig verander en die pyplyn begin om hierdie prent te skep.

Van teorie tot aksie

In 'n ideale Docker-meerfase-beeldbou, word die omgewing vir die bou van die toepassing voorberei in dieselfde Dockerfile-skrip as wat die toepassing self gebou is. Maar in ons geval is 'n tussenskakel bygevoeg, naamlik die stap van die voorlopige skep van 'n docker-beeld met alles wat nodig is om die toepassing te bou. Dit is gedoen omdat ek die docker-kasfunksie wou gebruik om die installasietyd van alle afhanklikhede te verminder.

Kom ons kyk na die hoofpunte van die dockerfile-skrip vir die skep van hierdie prent.

Om beelde van verskillende OS-weergawes te skep, kan jy 'n argument in die dockerfile definieer waardeur die weergawenommer tydens die bou geslaag word, en dit is ook die merker van die basisbeeld.

Volledige lys van Microsoft-beeldetikette Windows Server kan vind hier.

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

By verstek die opdragte in die instruksies RUN binne die dockerfile in die OS Windows word in die cmd.exe-konsole uitgevoer. Vir die gemak van skripte skryf en uitgebreide funksionaliteit van die opdragte wat gebruik word, sal ons die opdraguitvoeringskonsole na Powershell herdefinieer deur die volgende instruksie te gebruik: SHELL.

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

Die volgende stap is om die sjokolade-pakketbestuurder en die nodige pakkette te installeer:

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'

Om pakkette met sjokolade te installeer, kan jy dit eenvoudig as 'n lys deurgee, of hulle een op 'n slag installeer as jy unieke parameters vir elke pakket moet deurgee. In ons situasie het ons 'n manifeslêer in XML-formaat gebruik, wat 'n lys van vereiste pakkette en hul parameters bevat. Die inhoud daarvan lyk soos volg:

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

Vervolgens installeer ons die toepassingsbou-omgewing, naamlik MS Build Tools 2019 - dit is 'n liggewig weergawe van Visual Studio 2019, wat die minimum vereiste stel komponente vir die samestelling van kode bevat.
Om ten volle met ons C++-projek te werk, sal ons addisionele komponente benodig, naamlik:

  • Werklading C++ gereedskap
  • Gereedskapstel v141
  • Windows 10 SDK (10.0.17134.0)

U kan 'n uitgebreide stel gereedskap outomaties installeer deur 'n konfigurasielêer in JSON-formaat te gebruik. Opstelling lêer inhoud:

'n Volledige lys van beskikbare komponente kan op die dokumentasiewebwerf gevind word 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"
  ]
}

Die dockerfile loop die installasie script, en voeg gerieflikheidshalwe die pad na die bougereedskap uitvoerbare lêers by die omgewingsveranderlike PATH. Dit is ook raadsaam om onnodige lêers en gidse te verwyder om die grootte van die prent te verminder.

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)

Op hierdie stadium is ons beeld vir die samestelling van die C++-toepassing gereed, en ons kan direk voortgaan met die skep van 'n docker-multifase-bou van die toepassing.

Multi-stadium in aksie

Ons sal die geskepte prent met al die gereedskap aan boord as 'n boubeeld gebruik. Soos in die vorige dockerfile-skrip, sal ons die vermoë byvoeg om die weergawenommer/beeldmerker dinamies te spesifiseer vir gemak van kode hergebruik. Dit is belangrik om 'n etiket by te voeg as builder na die samestellingbeeld in die instruksies FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Nou is dit tyd om die toepassing te bou. Alles hier is redelik eenvoudig: kopieer die bronkode en alles wat daarmee geassosieer word, en begin die samestellingsproses.

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

Die finale stadium van die skep van die finale prent is om die basisbeeld van die toepassing te spesifiseer, waar alle samestellingsartefakte en konfigurasielêers geleë sal wees. Om saamgestelde lêers vanaf die intermediêre samestellingbeeld te kopieer, moet jy die parameter spesifiseer --from=builder in die instruksies COPY.

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

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

Al wat nou oorbly, is om die nodige afhanklikhede by te voeg sodat ons toepassing kan werk en die beginopdrag deur die instruksies te spesifiseer ENTRYPOINT of CMD.

Gevolgtrekking

In hierdie artikel het ek verduidelik hoe om 'n volwaardige kompilasie-omgewing vir C++-toepassings binne 'n houer te skep onder Windows en hoe om Docker se meerfasige bouvermoëns te gebruik om volwaardige beelde van ons toepassing te skep.

Bron: will.com

Koop betroubare hosting vir werwe met DDoS-beskerming, VPS VDS-bedieners 🔥 Koop betroubare webwerfhosting met DDoS-beskerming, VPS VDS-bedieners | ProHoster