Defnyddio aml-gam docwr i adeiladu delweddau ffenestri

Helo pawb! Fy enw i yw Andrey, ac rwy'n gweithio fel peiriannydd DevOps yn Exness yn y tîm datblygu. Mae fy mhrif weithgaredd yn ymwneud ag adeiladu, defnyddio a chefnogi cymwysiadau mewn docwyr o dan system weithredu Linux (y cyfeirir ati o hyn ymlaen fel yr OS). Ddim yn bell yn ôl roedd gen i dasg gyda'r un gweithgareddau, ond yr OS targed y prosiect oedd Windows Server a set o brosiectau C ++. I mi, hwn oedd y rhyngweithio agos cyntaf â chynwysyddion docwyr o dan Windows OS ac, yn gyffredinol, gyda chymwysiadau C ++. Diolch i hyn, cefais brofiad diddorol a dysgais am rai o gymhlethdodau cynhwysyddio cymwysiadau yn Windows.

Defnyddio aml-gam docwr i adeiladu delweddau ffenestri

Yn yr erthygl hon rwyf am ddweud wrthych pa anawsterau y bu'n rhaid i mi eu hwynebu a sut y llwyddais i'w datrys. Rwy'n gobeithio y bydd hyn yn ddefnyddiol ar gyfer eich heriau presennol ac yn y dyfodol. Mwynhewch ddarllen!

Pam cynwysyddion?

Mae gan y cwmni seilwaith presennol ar gyfer cerddorfa cynhwysydd Hashicorp Nomad a chydrannau cysylltiedig - Consul and Vault. Felly, dewiswyd cynhwysydd y cais fel dull unedig ar gyfer darparu datrysiad cyflawn. Gan fod seilwaith y prosiect yn cynnwys gwesteiwyr docwyr gyda fersiynau Windows Server Core OS 1803 a 1809, mae angen adeiladu fersiynau ar wahân o ddelweddau docwr ar gyfer 1803 a 1809. Yn fersiwn 1803, mae'n bwysig cofio bod rhif adolygu'r gwesteiwr docwr adeiladu rhaid iddo gyd-fynd â rhif adolygu delwedd sylfaen y docwr a'r gwesteiwr lle bydd y cynhwysydd o'r ddelwedd hon yn cael ei lansio. Nid oes gan fersiwn 1809 anfantais o'r fath. Gallwch ddarllen mwy yma.

Pam aml-gam?

Nid oes gan beirianwyr tîm datblygu unrhyw fynediad neu fynediad cyfyngedig iawn i westeion adeiladu; nid oes unrhyw ffordd i reoli'r set o gydrannau ar gyfer adeiladu cymhwysiad ar y gwesteiwyr hyn yn gyflym, er enghraifft, gosod set offer neu lwyth gwaith ychwanegol ar gyfer Visual Studio. Felly, gwnaethom y penderfyniad i osod yr holl gydrannau angenrheidiol i ymgorffori'r cais yn ddelwedd adeiladu Docker. Os oes angen, dim ond y dockerfile y gallwch chi ei newid yn gyflym a lansio'r biblinell ar gyfer creu'r ddelwedd hon.

O theori i weithredu

Mewn adeiladu delwedd aml-gam Docker delfrydol, mae'r amgylchedd ar gyfer adeiladu'r cais yn cael ei baratoi yn yr un sgript Dockerfile ag y mae'r cais ei hun yn cael ei adeiladu. Ond yn ein hachos ni, ychwanegwyd cyswllt canolradd, sef, y cam rhagarweiniol o greu delwedd docwr gyda phopeth angenrheidiol i adeiladu'r cais. Gwnaethpwyd hyn oherwydd fy mod eisiau defnyddio'r nodwedd cache docker i leihau amser gosod pob dibyniaeth.

Edrychwn ar brif bwyntiau'r sgript dockerfile ar gyfer creu'r ddelwedd hon.

I greu delweddau o wahanol fersiynau OS, gallwch ddiffinio dadl yn y dockerfile y mae rhif y fersiwn yn cael ei basio trwyddo yn ystod y cyfnod adeiladu, a dyma hefyd dag y ddelwedd sylfaenol.

Gellir dod o hyd i restr gyflawn o dagiau delwedd Microsoft Windows Server yma.

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

Yn ddiofyn y gorchmynion yn y cyfarwyddiadau RUN y tu mewn i'r dockerfile ar Windows OS cânt eu gweithredu yn y consol cmd.exe. Er hwylustod ysgrifennu sgriptiau ac ehangu ymarferoldeb y gorchmynion a ddefnyddir, byddwn yn ailddiffinio'r consol gweithredu gorchymyn yn Powershell trwy'r cyfarwyddyd SHELL.

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

Y cam nesaf yw gosod y rheolwr pecyn siocledi a'r pecynnau angenrheidiol:

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'

I osod pecynnau gan ddefnyddio chocolatey, gallwch chi eu pasio fel rhestr, neu eu gosod un ar y tro os oes angen i chi basio paramedrau unigryw ar gyfer pob pecyn. Yn ein sefyllfa ni, fe wnaethom ddefnyddio ffeil maniffest mewn fformat XML, sy'n cynnwys rhestr o becynnau gofynnol a'u paramedrau. Mae ei gynnwys yn edrych fel hyn:

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

Nesaf, rydym yn gosod yr amgylchedd adeiladu cymwysiadau, sef, MS Build Tools 2019 - fersiwn ysgafn yw hon o Visual Studio 2019, sy'n cynnwys y set leiaf o gydrannau gofynnol ar gyfer llunio cod.
Er mwyn gweithio'n llawn gyda'n prosiect C++, bydd angen cydrannau ychwanegol arnom, sef:

  • Llwyth gwaith C++ offer
  • Set offer v141
  • Windows 10 SDK (10.0.17134.0)

Gallwch osod set estynedig o offer yn awtomatig gan ddefnyddio ffeil ffurfweddu mewn fformat JSON. Cynnwys ffeil ffurfweddu:

Mae rhestr gyflawn o'r cydrannau sydd ar gael i'w gweld ar y wefan ddogfennaeth 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"
  ]
}

Mae'r dockerfile yn rhedeg y sgript gosod, ac er hwylustod, yn ychwanegu'r llwybr at y ffeiliau gweithredadwy offer adeiladu i'r newidyn amgylchedd PATH. Fe'ch cynghorir hefyd i gael gwared ar ffeiliau a chyfeiriaduron diangen i leihau maint y ddelwedd.

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)

Ar y cam hwn, mae ein delwedd ar gyfer llunio'r cais C ++ yn barod, a gallwn symud ymlaen yn uniongyrchol i greu adeilad aml-gam docwr o'r cais.

Aml-gam ar waith

Byddwn yn defnyddio'r ddelwedd a grëwyd gyda'r holl offer ar y bwrdd fel delwedd adeiladu. Fel yn y sgript dockerfile flaenorol, byddwn yn ychwanegu'r gallu i nodi rhif y fersiwn / tag delwedd yn ddeinamig er mwyn hwyluso ailddefnyddio cod. Mae'n bwysig ychwanegu label as builder i ddelwedd y cynulliad yn y cyfarwyddiadau FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Nawr mae'n bryd adeiladu'r cais. Mae popeth yma yn eithaf syml: copïwch y cod ffynhonnell a phopeth sy'n gysylltiedig ag ef, a dechreuwch y broses lunio.

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

Y cam olaf wrth greu'r ddelwedd derfynol yw nodi delwedd sylfaenol y cais, lle bydd yr holl arteffactau casglu a'r ffeiliau ffurfweddu wedi'u lleoli. I gopïo ffeiliau wedi'u crynhoi o ddelwedd y cynulliad canolradd, rhaid i chi nodi'r paramedr --from=builder yn y cyfarwyddiadau COPY.

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

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

Nawr y cyfan sydd ar ôl yw ychwanegu'r dibyniaethau angenrheidiol i'n cais weithio a nodi'r gorchymyn lansio trwy'r cyfarwyddiadau ENTRYPOINT neu CMD.

Casgliad

Yn yr erthygl hon, siaradais am sut i greu amgylchedd crynhoi llawn ar gyfer cymwysiadau C ++ y tu mewn i gynhwysydd Windows a sut i ddefnyddio galluoedd adeiladau aml-gam docwyr i greu delweddau llawn o'n cymhwysiad.

Ffynhonnell: hab.com

Ychwanegu sylw