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

Hi almal! My naam is Andrey, en ek werk as 'n DevOps-ingenieur by Exness in die ontwikkelingspan. My hoofaktiwiteit hou verband met die bou, ontplooi en ondersteun toepassings in docker onder die Linux-bedryfstelsel (hierna verwys as die bedryfstelsel). Nie lank gelede nie het ek 'n taak gehad met dieselfde aktiwiteite, maar die teiken-bedryfstelsel van die projek was Windows Server en 'n stel C++-projekte. Vir my was dit die eerste noue interaksie met docker-houers onder Windows OS en, in die algemeen, met C++-toepassings. Danksy hierdie het ek 'n interessante ervaring gehad en geleer oor sommige van die ingewikkeldhede van houertoepassings in 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 bestaande infrastruktuur vir die Hashicorp Nomad-houerorkeseerder en verwante komponente - Consul en Vault. Daarom is toepassingshouerisering gekies as 'n verenigde metode om 'n sleuteloplossing te lewer. Aangesien die projek-infrastruktuur koppelaargashere met Windows Server Core OS-weergawes 1803 en 1809 bevat, is dit nodig om aparte weergawes van koppelaarbeelde vir 1803 en 1809 te bou. In weergawe 1803 is dit belangrik om te onthou dat die hersieningsnommer van die boudokter-gasheer moet ooreenstem met die hersieningsnommer van die basisdokter-beeld en die gasheer waar die houer van hierdie prent geloods sal word. Weergawe 1809 het geen so 'n nadeel nie. Jy kan meer 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.

'n Volledige lys van Microsoft Windows Server-beeldmerkers kan gevind word 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 op Windows OS word hulle uitgevoer in die cmd.exe-konsole. Vir die gerief om skrifte te skryf en die funksionaliteit van die opdragte wat gebruik word uit te brei, sal ons die opdraguitvoerkonsole in Powershell herdefinieer deur die instruksie 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 gepraat oor hoe om 'n volwaardige samestellingsomgewing vir C++-toepassings binne 'n houer onder Windows te skep en hoe om die vermoëns van docker-multifase-bou te gebruik om volwaardige beelde van ons toepassing te skep.

Bron: will.com

Voeg 'n opmerking