Usebenzisa i-docker enezigaba eziningi ukwakha izithombe zeWindows

Sanibonani nonke! Igama lami ngingu-Andrey, futhi ngisebenza njengonjiniyela we-DevOps kwa-Exness eqenjini lokuthuthukisa. Umsebenzi wami oyinhloko uhlobene nokwakha, ukuphakela kanye nokusekela izinhlelo zokusebenza kudokhu ngaphansi kwesistimu yokusebenza ye-Linux (kamuva ebizwa ngokuthi i-OS). Esikhathini esingeside esidlule ngibe nomsebenzi onemisebenzi efanayo, kodwa i-OS ehlosiwe yephrojekthi kwakuyi-Windows Server kanye nesethi yamaphrojekthi we-C ++. Kimi, lokhu bekuwukusebenzelana kokuqala okusondelene neziqukathi ze-docker ngaphansi kwe-Windows OS futhi, ngokuvamile, nezinhlelo zokusebenza ze-C++. Ngenxa yalokhu, ngibe nesipiliyoni esithokozisayo futhi ngafunda ngezinye zezingqinamba zokuhlanganisa izinhlelo zokusebenza ku-Windows.

Usebenzisa i-docker enezigaba eziningi ukwakha izithombe zeWindows

Kulesi sihloko ngifuna ukukutshela ukuthi yiziphi izinkinga okwadingeka ngibhekane nazo nokuthi ngakwazi kanjani ukuzixazulula. Ngethemba ukuthi lokhu kuwusizo ezinseleleni zakho zamanje nezesikhathi esizayo. Kujabulele ukufunda!

Kungani iziqukathi?

Le nkampani inengqalasizinda ekhona ye-orchestrator ye-Hashicorp Nomad kanye nezingxenye ezihlobene - i-Consul and Vault. Ngakho-ke, ukufakwa kwesiqukathi sohlelo lokusebenza kwakhethwa njengendlela ebumbene yokuletha isisombululo esiphelele. Njengoba ingqalasizinda yephrojekthi iqukethe abasingathi be-docker abanezinguqulo ze-Windows Server Core OS 1803 kanye ne-1809, kuyadingeka ukwakha izinguqulo ezihlukene zezithombe ze-docker ze-1803 ne-1809. kufanele ifane nenombolo yokubuyekeza yesithombe sedokha eyisisekelo kanye nomsingathi lapho isiqukathi esisuka kulesi sithombe sizokwethulwa khona. Inguqulo ye-1803 ayinakho ukuhlehliswa okunjalo. Ungafunda okwengeziwe lapha.

Kungani kunezigaba eziningi?

Onjiniyela bethimba labathuthukisi abakwazi noma abanakho ukufinyelela okulinganiselwe ekwakheni ababungazi; ayikho indlela yokuphatha ngokushesha isethi yezingxenye zokwakha uhlelo lokusebenza kulaba basingathi, isibonelo, faka isethi yamathuluzi eyengeziwe noma umthwalo wokusebenza we-Visual Studio. Ngakho-ke, senze isinqumo sokufaka zonke izakhi ezidingekayo ukwakha uhlelo lokusebenza esithombeni se-Docker yokwakha. Uma kunesidingo, ungashintsha ngokushesha i-dockerfile kuphela futhi uqalise ipayipi lokudala lesi sithombe.

Kusukela kumbono kuya esenzweni

Esakhiweni esihle sesithombe se-Docker esinezigaba eziningi, indawo yokwakha uhlelo ilungiswa ngeskripthi esifanayo se-Dockerfile njengoba kwakhiwa uhlelo ngokwalo. Kodwa kithi, isixhumanisi esiphakathi sengeziwe, okungukuthi, isinyathelo sokuqala sokudala isithombe se-docker nakho konke okudingekayo ukwakha uhlelo lokusebenza. Lokhu kwenziwa ngoba bengifuna ukusebenzisa isici se-cache ye-docker ukunciphisa isikhathi sokufakwa kwakho konke okuncikile.

Ake sibheke amaphuzu asemqoka weskripthi se-dockerfile sokudala lesi sithombe.

Ukuze udale izithombe zezinguqulo ezihlukile ze-OS, ungachaza ingxabano kufayela le-docker lapho inombolo yenguqulo idluliswa khona ngesikhathi sokwakhiwa, futhi iphinde ibe umaka wesithombe esiyisisekelo.

Uhlu oluphelele lomaka bezithombe ze-Microsoft Windows Server lungatholakala lapha.

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

Ngokuzenzakalelayo imiyalo emiyalweni RUN ngaphakathi kwefayela le-docker ku-Windows OS babulawa kukhonsoli ye-cmd.exe. Ukuze kube lula ukubhala izikripthi nokwandisa ukusebenza kwemiyalo esetshenzisiwe, sizochaza kabusha ikhonsoli yokukhipha umyalo ku-Powershell ngomyalo. SHELL.

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

Isinyathelo esilandelayo ukufaka umphathi wephakheji le-chocolatey namaphakheji adingekayo:

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'

Ukufaka amaphakheji usebenzisa i-chocolatey, ungamane uwadlulise njengohlu, noma uwafake ngesikhathi esisodwa uma udinga ukudlula amapharamitha ahlukile wephakheji ngalinye. Esimeni sethu, sisebenzise ifayela le-manifest ngefomethi ye-XML, equkethe uhlu lwamaphakheji adingekayo kanye nemingcele yawo. Okuqukethwe kuyo kubukeka kanje:

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

Okulandelayo, sifaka imvelo yokwakha uhlelo lokusebenza, okungukuthi, Amathuluzi Okwakha we-MS 2019 - lena inguqulo engasindi ye-Visual Studio 2019, equkethe isethi encane edingekayo yezingxenye zokuhlanganiswa kwekhodi.
Ukuze sisebenze ngokugcwele nephrojekthi yethu ye-C++, sizodinga izingxenye ezengeziwe, okuyilezi:

  • Amathuluzi we-C++ womthwalo wokusebenza
  • Isethi yamathuluzi v141
  • Windows 10 SDK (10.0.17134.0)

Ungakwazi ukufaka isethi enwetshiwe yamathuluzi ngokuzenzakalela usebenzisa ifayela lokumisa ngefomethi ye-JSON. Okuqukethwe kwefayela lokucushwa:

Uhlu oluphelele lwezingxenye ezitholakalayo lungatholakala esizeni semibhalo I-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"
  ]
}

I-dockerfile isebenzisa iskripthi sokufaka, futhi ukuze kube lula, yengeza indlela kumathuluzi wokwakha amafayela asebenzisekayo ekuguquguqukeni kwemvelo. PATH. Kuyatuseka futhi ukususa amafayela angadingekile nezinkomba ukuze unciphise usayizi wesithombe.

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)

Kulesi sigaba, isithombe sethu sokuhlanganisa uhlelo lwe-C++ sesilungile, futhi singaqhubeka ngokuqondile ekwakheni i-docker enezigaba eziningi zohlelo.

Izigaba eziningi zisebenza

Sizosebenzisa isithombe esidaliwe nawo wonke amathuluzi asebhodini njengesithombe sokwakha. Njengakuskripthi sangaphambilini se-dockerfile, sizongeza ikhono lokucacisa inombolo yenguqulo/umaka wesithombe ukuze kube lula ukusebenzisa ikhodi. Kubalulekile ukwengeza ilebula as builder esithombeni somhlangano emiyalweni FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Manje sekuyisikhathi sokwakha uhlelo lokusebenza. Konke lapha kulula kakhulu: kopisha ikhodi yomthombo nakho konke okuhlotshaniswa nayo, bese uqala inqubo yokuhlanganisa.

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

Isigaba sokugcina sokudala isithombe sokugcina ukucacisa isithombe esiyisisekelo sohlelo lokusebenza, lapho zonke izinto zokwenziwa kokuhlanganiswa namafayela okumisa azotholakala. Ukuze ukopishe amafayela ahlanganisiwe emfanekisweni womhlangano omaphakathi, kufanele ucacise ipharamitha --from=builder emiyalweni COPY.

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

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

Manje okusele nje ukwengeza ukuncika okudingekayo ukuze isicelo sethu sisebenze futhi sicacise umyalo wokwethulwa ngemiyalo ENTRYPOINT noma CMD.

isiphetho

Kulesi sihloko, ngikhulume ngendlela yokudala indawo egcwele yokuhlanganisa yezinhlelo zokusebenza ze-C++ ngaphakathi kwesitsha se-Windows nokuthi ungasebenzisa kanjani amandla okwakhiwa kwe-docker multi-stage ukwakha izithombe ezigcwele zohlelo lwethu lokusebenza.

Source: www.habr.com

Engeza amazwana