Bikaranîna docker-a pir-qonaxa ji bo avakirina wêneyên Windows-ê

Silav hemû! Navê min Andrey e, û ez wekî endezyarek DevOps li Exness di tîmê pêşkeftinê de dixebitim. Çalakiya min a sereke bi avakirina, bicîhkirin û piştgirîkirina serîlêdanên li docker-ê di bin pergala xebitandina Linux-ê de (li vir wekî OS-ê tê binav kirin) ve girêdayî ye. Demek berê bi heman çalakiyan re peywirek min hebû, lê OS-ya mebesta projeyê Windows Server û komek projeyên C++ bû. Ji bo min, ev yekem pêwendiya nêzîk bi konteynerên docker ên di bin OS-ya Windows-ê de û, bi gelemperî, bi serîlêdanên C++ re bû. Bi saya vê yekê, min ezmûnek balkêş bû û li ser hin hûrguliyên serîlêdanên konteynirkirina Windows-ê fêr bûm.

Bikaranîna docker-a pir-qonaxa ji bo avakirina wêneyên Windows-ê

Di vê gotarê de ez dixwazim ji we re bibêjim ku ez bi çi zehmetiyan re rû bi rû bûm û min çawa kar kir ku wan çareser bikim. Ez hêvî dikim ku ev ji bo pirsgirêkên we yên heyî û pêşerojê alîkar be. Ji xwendinê kêfxweş bibin!

Çima konteynir?

Pargîdanî ji bo orkestratorê konteynerê Hashicorp Nomad û pêkhateyên têkildar - Konsul û Vault binesaziya heyî heye. Ji ber vê yekê, konteynera serîlêdanê wekî rêbazek yekgirtî ji bo peydakirina çareseriyek bêkêmasî hate hilbijartin. Ji ber ku binesaziya projeyê mêvandarên dokerê yên bi guhertoyên Windows Server Core OS 1803 û 1809 hene, pêdivî ye ku ji bo 1803 û 1809 guhertoyên cûda yên wêneyên docker werin çêkirin. Di guhertoya 1803-an de, girîng e ku ji bîr mekin ku jimara revîzyonê ya hosteya dokerê ya çêkirî Pêdivî ye ku jimara guhertoya wêneya dokera bingehîn û mêvandarê ku dê konteynerê ji vê wêneyê were destpêkirin bi hev re were hev. Guhertoya 1809 kêmasiyek wusa tune. Hûn dikarin bêtir bixwînin vir.

Çima pir-qonaxa?

Endezyarên tîmê pêşkeftinê ji bo avakirina hosteyan gihêştina wan tune an pir tixûbdar e; Rêyek tune ku meriv zû komek pêkhateyan ji bo avakirina serîlêdanek li ser van mêvandaran bi rê ve bibe, mînakî, ji bo Visual Studio amûrek an bargiranek zêde saz bike. Ji ber vê yekê, me biryar da ku em hemî hêmanên ku ji bo avakirina serîlêdanê di nav wêneya çêkirinê ya Docker de hewce ne saz bikin. Ger hewce be, hûn dikarin bi lez tenê pelê docker biguhezînin û ji bo afirandina vê wêneyê boriyê bidin destpêkirin.

Ji teoriyê berbi çalakiyê

Di avakirina wêneyek pir-qonaxa îdeal a Docker de, hawîrdora avakirina serîlêdanê di heman skrîpta Dockerfile de tête amadekirin ku serîlêdan bixwe hatî çêkirin. Lê di doza me de, girêdanek navîn hate zêdekirin, ango, gava pêşîn a afirandina wêneyek dokerê bi her tiştê ku ji bo avakirina serîlêdanê hewce dike. Ev hate kirin ji ber ku min dixwest taybetmendiya cache docker bikar bînim da ku dema sazkirinê ya hemî pêwendiyan kêm bikim.

Ka em ji bo afirandina vê wêneyê li xalên sereke yên skrîpta dockerfile binêrin.

Ji bo afirandina wêneyên guhertoyên cihêreng ên OS-ê, hûn dikarin di pelê docker de argumanek diyar bikin ku tê de hejmara guhertoyê di dema çêkirinê de derbas dibe, û ew jî nîşana wêneya bingehîn e.

Navnîşek bêkêmasî ya nîşaneyên wêneya Microsoft Windows Server dikare were dîtin vir.

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

Ji hêla xwerû emrên di talîmatan de RUN di hundurê dockerfile ya li ser Windows OS-ê de ew di konsolê cmd.exe de têne darve kirin. Ji bo rehetiya nivîsandina senaryoyan û berfirehkirina fonksiyona fermanên ku hatine bikar anîn, em ê bi rêwerzê ve konsolê înfaza fermanê li Powershell ji nû ve pênase bikin. SHELL.

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

Pêngava paşîn ev e ku meriv rêveberê pakêtê çîkolata û pakêtên pêwîst saz bike:

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'

Ji bo sazkirina pakêtan bi karanîna çîkolatayê, hûn dikarin wan bi tenê wekî navnîşek derbas bikin, an heke hûn hewce ne ku ji bo her pakêtê pîvanên bêhempa derbas bikin, wan yek bi yek saz bikin. Di rewşa me de, me pelek eşkere ya di forma XML de bikar anî, ku navnîşek pakêtên pêwîst û pîvanên wan vedigire. Naveroka wê wiha xuya dike:

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

Dûv re, em hawîrdora avakirina serîlêdanê saz dikin, ango, MS Build Tools 2019 - ev guhertoyek sivik a Visual Studio 2019-ê ye, ku ji bo berhevkirina kodê herî kêm komek pêkhateyên pêwîst dihewîne.
Ji bo ku bi projeya xweya C ++ re bi tevahî bixebitin, em ê hewceyê hêmanên din bin, bi navî:

  • Amûrên Karkeriya C ++
  • Toolset v141
  • Windows 10 SDK (10.0.17134.0)

Hûn dikarin bi karanîna pelek vesazkirinê ya di formata JSON de komek amûrek dirêjkirî bixweber saz bikin. Naveroka pelê veavakirinê:

Navnîşek bêkêmasî ya pêkhateyên berdest dikare li ser malpera belgekirinê were dîtin 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"
  ]
}

Dockerfile skrîpta sazkirinê dimeşîne, û ji bo rehetiyê, rê li pelên îcrakar ên amûrên çêkirinê li guhêrbara jîngehê zêde dike. PATH. Di heman demê de tê pêşniyar kirin ku pel û peldankên nepêwist jêbirin da ku mezinahiya wêneyê kêm bikin.

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)

Di vê qonaxê de, wêneya me ya ji bo berhevkirina serîlêdana C++ amade ye, û em dikarin rasterast ji bo çêkirina avahiyek pir-qonaxa docker a serîlêdanê bimeşin.

Pir-qonaxa di çalakiyê de

Em ê wêneya çêkirî digel hemî amûrên li ser sifrê wekî wêneyek çêkirinê bikar bînin. Mîna ku di skrîpta dockerfile ya berê de, em ê kapasîteya ku bi dînamîk jimareya guhertoyê / nîşana wêneyê diyar bikin ji bo hêsankirina ji nû ve karanîna kodê zêde bikin. Girîng e ku labelek lê zêde bike as builder di talîmatan de wêneyê civînê FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Niha dema avakirina serîlêdanê ye. Li vir her tişt pir hêsan e: koda çavkaniyê û her tiştê ku pê re têkildar e kopî bikin, û pêvajoya berhevkirinê dest pê bikin.

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

Qonaxa paşîn a afirandina wêneya paşîn ev e ku hûn wêneya bingehîn a serîlêdanê destnîşan bikin, ku dê hemî hunerên berhevkirinê û pelên vesazkirinê li wir bin. Ji bo kopîkirina pelên berhevkirî ji wêneya civîna navîn, divê hûn pîvanê diyar bikin --from=builder di talîmatan de COPY.

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

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

Naha ya ku dimîne ev e ku em girêdanên pêwîst lê zêde bikin da ku serlêdana me bixebite û bi rêwerzan fermana destpêkirinê diyar bike. ENTRYPOINT an CMD.

encamê

Di vê gotarê de, min qala çawaniya afirandina jîngehek berhevokê ya bêkêmasî ji bo serîlêdanên C++ di hundurê konteynirek di bin Windows-ê de kir û meriv çawa kapasîteyên avahiyên pir-qonaxa docker bikar tîne da ku wêneyên bêkêmasî yên serîlêdana me biafirîne.

Source: www.habr.com

Add a comment