Uża docker f'diversi stadji biex tibni immaġini tat-twieqi

Hi kollha! Jisimni Andrey, u naħdem bħala inġinier DevOps f'Exness fit-tim tal-iżvilupp. L-attività ewlenija tiegħi hija relatata mal-bini, l-iskjerament u l-appoġġ ta' applikazzjonijiet fid-docker taħt is-sistema operattiva Linux (minn hawn 'il quddiem imsejħa l-OS). Ftit ilu kelli kompitu bl-istess attivitajiet, iżda l-OS fil-mira tal-proġett kien Windows Server u sett ta 'proġetti C++. Għalija, din kienet l-ewwel interazzjoni mill-qrib ma 'kontenituri docker taħt Windows OS u, b'mod ġenerali, ma' applikazzjonijiet C++. Grazzi għal dan, kelli esperjenza interessanti u tgħallimt dwar xi wħud mill-intricacies ta 'kontenituri applikazzjonijiet fil-Windows.

Uża docker f'diversi stadji biex tibni immaġini tat-twieqi

F’dan l-artiklu rrid ngħidilkom x’diffikultajiet kelli niffaċċja u kif irnexxieli nsolvihom. Nittama li dan ikun ta' għajnuna għall-isfidi attwali u futuri tiegħek. Igawdu l-qari!

Għaliex kontenituri?

Il-kumpanija għandha infrastruttura eżistenti għall-orkestratur tal-kontejners Hashicorp Nomad u komponenti relatati - Consul and Vault. Għalhekk, il-kontejners tal-applikazzjoni ntgħażlet bħala metodu unifikat għat-twassil ta 'soluzzjoni sħiħa. Peress li l-infrastruttura tal-proġett fiha docker hosts bil-verżjonijiet tal-Windows Server Core OS 1803 u 1809, huwa meħtieġ li jinbnew verżjonijiet separati tal-immaġini docker għall-1803 u 1809. Fil-verżjoni 1803, huwa importanti li wieħed jiftakar li n-numru tar-reviżjoni tal-build docker host irid jaqbel man-numru tar-reviżjoni tal-immaġni bażi tad-docker u l-host fejn se jitnieda l-kontenitur minn din l-immaġni. Verżjoni 1809 m'għandha l-ebda żvantaġġ bħal dan. Tista' taqra aktar hawn.

Għaliex f'diversi stadji?

L-inġiniera tat-tim ta 'żvilupp m'għandhom l-ebda aċċess jew aċċess limitat ħafna biex jibnu hosts; m'hemm l-ebda mod kif timmaniġġja malajr is-sett ta' komponenti għall-bini ta 'applikazzjoni fuq dawn l-hosts, pereżempju, tinstalla sett ta' għodda jew ammont ta' xogħol addizzjonali għal Visual Studio. Għalhekk, ħadna d-deċiżjoni li ninstallaw il-komponenti kollha meħtieġa biex nibnu l-applikazzjoni fl-immaġni Docker tal-bini. Jekk meħtieġ, tista 'malajr tibdel biss id-dockerfile u tniedi l-pipeline għall-ħolqien ta' din l-immaġni.

Mit-teorija għall-azzjoni

F'bini ideali ta 'immaġni Docker f'diversi stadji, l-ambjent għall-bini tal-applikazzjoni huwa ppreparat fl-istess skript Dockerfile kif tinbena l-applikazzjoni nnifisha. Iżda fil-każ tagħna, ġiet miżjuda rabta intermedja, jiġifieri, il-pass tal-ħolqien preliminari ta 'immaġni ta' docker b'dak kollu meħtieġ biex tinbena l-applikazzjoni. Dan sar għaliex ridt nuża l-karatteristika docker cache biex tnaqqas il-ħin ta 'installazzjoni tad-dipendenzi kollha.

Ejja nħarsu lejn il-punti ewlenin tal-iskrittura dockerfile għall-ħolqien ta 'din l-immaġni.

Biex toħloq immaġini ta 'verżjonijiet tal-OS differenti, tista' tiddefinixxi argument fid-dockerfile li minnu jgħaddi n-numru tal-verżjoni waqt il-bini, u hija wkoll it-tikketta tal-immaġni bażi.

Tista' tinstab lista kompluta ta' tikketti tal-immaġni tal-Microsoft Windows Server hawn.

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

B'mod awtomatiku l-kmandi fl-istruzzjonijiet RUN ġewwa l-dockerfile fuq Windows OS huma esegwiti fil-console cmd.exe. Għall-konvenjenza tal-kitba ta' skripts u tespandi l-funzjonalità tal-kmandi użati, aħna se niddefinixxu mill-ġdid il-console tal-eżekuzzjoni tal-kmand f'Powershell permezz tal-istruzzjoni SHELL.

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

Il-pass li jmiss huwa li tinstalla l-maniġer tal-pakkett taċ-ċikkulata u l-pakketti meħtieġa:

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'

Biex tinstalla pakketti bl-użu taċ-ċikkulata, tista 'sempliċement tgħaddihom bħala lista, jew tinstallahom wieħed kull darba jekk ikollok bżonn tgħaddi parametri uniċi għal kull pakkett. Fis-sitwazzjoni tagħna, użajna fajl manifest f'format XML, li fih lista ta 'pakketti meħtieġa u l-parametri tagħhom. Il-kontenut tiegħu jidher bħal dan:

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

Sussegwentement, aħna ninstallaw l-ambjent tal-bini tal-applikazzjoni, jiġifieri, MS Build Tools 2019 - din hija verżjoni ħafifa ta 'Visual Studio 2019, li fiha s-sett minimu meħtieġ ta' komponenti għall-kompilazzjoni tal-kodiċi.
Biex naħdmu bis-sħiħ mal-proġett C++ tagħna, ser ikollna bżonn komponenti addizzjonali, jiġifieri:

  • Għodda ta' xogħol C++
  • Toolset v141
  • Windows 10 SDK (10.0.17134.0)

Tista 'tinstalla sett estiż ta' għodod awtomatikament billi tuża fajl ta 'konfigurazzjoni f'format JSON. Kontenut tal-fajl tal-konfigurazzjoni:

Lista kompluta ta' komponenti disponibbli tista' tinstab fuq is-sit tad-dokumentazzjoni 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"
  ]
}

Id-dockerfile imexxi l-iskrittura tal-installazzjoni, u għall-konvenjenza, iżid il-mogħdija għall-fajls eżekutibbli tal-għodod tal-bini mal-varjabbli tal-ambjent PATH. Huwa wkoll rakkomandabbli li jitneħħew fajls u direttorji mhux meħtieġa biex jitnaqqas id-daqs tal-immaġni.

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)

F'dan l-istadju, l-immaġni tagħna għall-kompilazzjoni tal-applikazzjoni C++ hija lesta, u nistgħu nipproċedu direttament biex noħolqu bini ta 'docker f'diversi stadji tal-applikazzjoni.

F'diversi stadji fl-azzjoni

Se nużaw l-immaġni maħluqa bl-għodda kollha abbord bħala immaġni tal-bini. Bħal fl-iskript ta 'dockerfile preċedenti, aħna se nżidu l-abbiltà li jispeċifikaw b'mod dinamiku n-numru tal-verżjoni/tikketta tal-immaġni għal faċilità ta' użu mill-ġdid tal-kodiċi. Huwa importanti li żżid tikketta as builder għall-immaġni tal-assemblaġġ fl-istruzzjonijiet FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Issa wasal iż-żmien li tibni l-applikazzjoni. Kollox hawnhekk huwa pjuttost sempliċi: ikkopja l-kodiċi tas-sors u dak kollu assoċjat miegħu, u ibda l-proċess ta 'kumpilazzjoni.

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

L-istadju finali tal-ħolqien tal-immaġni finali huwa li tispeċifika l-immaġni bażi tal-applikazzjoni, fejn se jkunu jinsabu l-artifacts kollha tal-kumpilazzjoni u l-fajls tal-konfigurazzjoni. Biex tikkopja fajls ikkumpilati mill-immaġni tal-assemblaġġ intermedju, trid tispeċifika l-parametru --from=builder fl-istruzzjonijiet COPY.

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

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

Issa dak kollu li jibqa 'huwa li żżid id-dipendenzi meħtieġa biex l-applikazzjoni tagħna taħdem u tispeċifika l-kmand tat-tnedija permezz tal-istruzzjonijiet ENTRYPOINT jew CMD.

Konklużjoni

F'dan l-artikolu, tkellimt dwar kif toħloq ambjent ta 'kumpilazzjoni sħiħ għal applikazzjonijiet C++ ġewwa kontenitur taħt il-Windows u kif tuża l-kapaċitajiet ta' bini f'diversi stadji docker biex toħloq immaġini sħiħa tal-applikazzjoni tagħna.

Sors: www.habr.com

Żid kumment