Notkun docker fjölþrepa til að búa til Windows myndir

Hæ allir! Ég heiti Andrey og ég vinn sem DevOps verkfræðingur hjá Exness í þróunarteymi. Aðalstarfsemi mín tengist því að byggja, dreifa og styðja forrit í docker undir Linux stýrikerfinu (hér eftir nefnt stýrikerfið). Ekki er langt síðan ég hafði verkefni með sömu starfsemi, en markmiðsstýrikerfi verkefnisins var Windows Server og sett af C++ verkefnum. Fyrir mig var þetta fyrsta nána samskiptin við docker gáma undir Windows OS og almennt með C++ forritum. Þökk sé þessu varð ég fyrir áhugaverðri reynslu og lærði um nokkrar af ranghala gámaforrita í Windows.

Notkun docker fjölþrepa til að búa til Windows myndir

Í þessari grein vil ég segja þér hvaða erfiðleika ég þurfti að takast á við og hvernig mér tókst að leysa þá. Ég vona að þetta sé gagnlegt fyrir núverandi og framtíðaráskoranir þínar. Njóttu þess að lesa!

Hvers vegna gámar?

Fyrirtækið hefur núverandi innviði fyrir Hashicorp Nomad gámasveitarmanninn og tengda íhluti - Consul og Vault. Þess vegna var gámavæðing forrita valin sem sameinuð aðferð til að skila heildarlausn. Þar sem innviði verkefnisins inniheldur hýsingarvélar með Windows Server Core OS útgáfum 1803 og 1809, er nauðsynlegt að smíða aðskildar útgáfur af hýsilmyndum fyrir 1803 og 1809. Í útgáfu 1803 er mikilvægt að muna að endurskoðunarnúmer byggingarhýsilsins. verður að passa við endurskoðunarnúmer grunnskjalsmyndarinnar og hýsilsins þar sem ílátið frá þessari mynd verður ræst. Útgáfa 1809 hefur enga slíka galla. Þú getur lesið meira hér.

Hvers vegna fjölþrepa?

Verkfræðingar þróunarteymis hafa engan eða mjög takmarkaðan aðgang að því að smíða vélar; það er engin leið til að stjórna íhlutunum á fljótlegan hátt til að smíða forrit á þessum hýslum, til dæmis setja upp viðbótarverkfærasett eða vinnuálag fyrir Visual Studio. Þess vegna tókum við ákvörðun um að setja upp alla íhluti sem nauðsynlegir eru til að byggja forritið inn í byggingu Docker myndina. Ef nauðsyn krefur geturðu fljótt breytt aðeins dockerskránni og ræst leiðsluna til að búa til þessa mynd.

Frá kenningu til athafna

Í fullkominni Docker fjölþrepa myndbyggingu er umhverfið til að byggja forritið útbúið í sama Dockerfile skriftu og forritið sjálft er byggt. En í okkar tilviki var millitengli bætt við, þ.e. skrefinu að búa til bryggjumynd með öllu sem þarf til að byggja upp forritið. Þetta var gert vegna þess að ég vildi nota docker skyndiminni eiginleikann til að draga úr uppsetningartíma allra ósjálfstæðna.

Við skulum skoða helstu atriðin í dockerfile handritinu til að búa til þessa mynd.

Til að búa til myndir af mismunandi stýrikerfisútgáfum geturðu skilgreint rök í dockerskránni sem útgáfunúmerið fer í gegnum meðan á smíði stendur og það er einnig merki grunnmyndarinnar.

Hægt er að finna heildarlista yfir Microsoft Windows Server myndmerki hér.

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

Sjálfgefið er að skipanirnar í leiðbeiningunum RUN inni í dockerfile á Windows OS eru þær keyrðar í cmd.exe stjórnborðinu. Til þæginda við að skrifa forskriftir og auka virkni skipananna sem notaðar eru munum við endurskilgreina stjórnborðið fyrir framkvæmd stjórna í Powershell með leiðbeiningunum SHELL.

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

Næsta skref er að setja upp súkkulaðipakkastjórann og nauðsynlega pakka:

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'

Til að setja upp pakka með súkkulaði geturðu einfaldlega sent þá sem lista eða sett þá upp einn í einu ef þú þarft að senda einstaka breytur fyrir hvern pakka. Í okkar aðstæðum notuðum við upplýsingaskrá á XML sniði, sem inniheldur lista yfir nauðsynlega pakka og færibreytur þeirra. Innihald þess lítur svona út:

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

Næst setjum við upp forritabyggingarumhverfið, nefnilega MS Build Tools 2019 - þetta er létt útgáfa af Visual Studio 2019, sem inniheldur lágmarks nauðsynleg sett af íhlutum til að setja saman kóða.
Til að vinna að fullu með C++ verkefninu okkar þurfum við viðbótaríhluti, þ.e.

  • Vinnuálag C++ verkfæri
  • Verkfærasett v141
  • Windows 10 SDK (10.0.17134.0)

Þú getur sett upp aukið sett af verkfærum sjálfkrafa með því að nota stillingarskrá á JSON sniði. Innihald stillingarskrár:

Heildarlista yfir tiltæka íhluti er að finna á skjalasíðunni 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"
  ]
}

Dockerskráin keyrir uppsetningarforskriftina og til hægðarauka bætir slóðinni að keyrsluskrám byggingarverkfæra við umhverfisbreytuna PATH. Einnig er ráðlegt að fjarlægja óþarfa skrár og möppur til að minnka stærð myndarinnar.

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)

Á þessu stigi er myndin okkar til að setja saman C++ forritið tilbúin og við getum haldið áfram beint í að búa til fjölþrepa byggingu forritsins.

Fjölþrepa í aðgerð

Við munum nota tilbúna myndina með öllum verkfærum um borð sem byggingarmynd. Eins og í fyrra dockerfile handritinu, munum við bæta við möguleikanum á að tilgreina útgáfunúmerið/myndarmerkið á virkan hátt til að auðvelda endurnotkun kóðans. Mikilvægt er að bæta við merkimiða as builder á samsetningarmyndina í leiðbeiningunum FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Nú er kominn tími til að byggja upp forritið. Allt hér er frekar einfalt: afritaðu frumkóðann og allt sem honum tengist og byrjaðu samansafnið.

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

Lokastigið við að búa til lokamyndina er að tilgreina grunnmynd forritsins, þar sem allir safngripir og stillingarskrár verða staðsettar. Til að afrita samsettar skrár úr millisamsetningarmyndinni verður þú að tilgreina færibreytuna --from=builder í leiðbeiningunum COPY.

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

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

Nú er allt sem eftir er að bæta við nauðsynlegum ósjálfstæðum til að forritið okkar virki og tilgreina ræsingarskipunina með leiðbeiningunum ENTRYPOINT eða CMD.

Ályktun

Í þessari grein talaði ég um hvernig á að búa til fullbúið söfnunarumhverfi fyrir C++ forrit inni í gámi undir Windows og hvernig á að nota möguleika fjölþrepa bygginga í Docker til að búa til fullgildar myndir af forritinu okkar.

Heimild: www.habr.com

Bæta við athugasemd