Daugiapakopis „Docker“ naudojimas „Windows“ vaizdams kurti

Sveiki visi! Mano vardas Andrejus ir aš dirbu DevOps inžinieriumi Exness kūrimo komandoje. Mano pagrindinė veikla yra susijusi su programų kūrimu, diegimu ir palaikymu docker naudojant Linux operacinę sistemą (toliau – OS). Neseniai turėjau užduotį su ta pačia veikla, tačiau tikslinė projekto OS buvo Windows Server ir C++ projektų rinkinys. Man tai buvo pirmas glaudus bendravimas su docker konteineriais Windows OS ir apskritai su C++ programomis. Dėl šios priežasties turėjau įdomios patirties ir sužinojau apie kai kurias konteinerių talpinimo programas sistemoje Windows.

Daugiapakopis „Docker“ naudojimas „Windows“ vaizdams kurti

Šiame straipsnyje noriu papasakoti, su kokiais sunkumais teko susidurti ir kaip pavyko juos išspręsti. Tikiuosi, kad tai bus naudinga jūsų dabartiniams ir būsimiems iššūkiams. Mėgaukitės skaitymu!

Kodėl konteineriai?

Bendrovė turi esamą infrastruktūrą Hashicorp Nomad konteinerių orkestrui ir susijusiems komponentams - Consul ir Vault. Todėl programų konteinerizavimas buvo pasirinktas kaip vieningas būdas pateikti visą sprendimą. Kadangi projekto infrastruktūroje yra docker serveriai su Windows Server Core OS 1803 ir 1809 versijomis, būtina sukurti atskiras docker vaizdų versijas 1803 ir 1809. 1803 versijoje svarbu atsiminti, kad Build Docker pagrindinio kompiuterio versijos numeris turi atitikti pagrindinio dokerio vaizdo ir pagrindinio kompiuterio, kuriame bus paleistas konteineris iš šio vaizdo, pataisos numerį. 1809 versija neturi tokio trūkumo. Galite paskaityti daugiau čia.

Kodėl daugiapakopis?

Kūrimo komandos inžinieriai neturi arba labai ribota prieiga prie prieglobos kūrimo; nėra būdo greitai valdyti komponentų rinkinį, skirtą programos kūrimui šiuose pagrindiniuose kompiuteriuose, pavyzdžiui, įdiegti papildomą įrankių rinkinį arba „Visual Studio“ darbo krūvį. Todėl priėmėme sprendimą įdiegti visus komponentus, reikalingus programai sukurti į „Docker“ atvaizdą. Jei reikia, galite greitai pakeisti tik dockerfailą ir paleisti šio vaizdo kūrimo dujotiekį.

Nuo teorijos iki veiksmo

Idealioje „Docker“ kelių pakopų vaizdo kūrimo aplinkoje aplinka programai kurti yra paruošta tuo pačiu „Dockerfile“ scenarijumi, kaip ir pati programa. Bet mūsų atveju buvo pridėta tarpinė nuoroda, ty preliminarus dokerio vaizdo kūrimo žingsnis su viskuo, ko reikia programai sukurti. Tai buvo padaryta, nes norėjau naudoti docker talpyklos funkciją, kad sumažinčiau visų priklausomybių diegimo laiką.

Pažvelkime į pagrindinius dockerfile scenarijaus punktus kuriant šį vaizdą.

Norėdami sukurti skirtingų OS versijų vaizdus, ​​docker faile galite apibrėžti argumentą, per kurį kūrimo metu perduodamas versijos numeris, be to, tai yra pagrindinio vaizdo žyma.

Galima rasti visą Microsoft Windows Server vaizdo žymų sąrašą čia.

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

Pagal numatytuosius nustatymus instrukcijose pateiktos komandos RUN „Windows“ OS „dockerfile“ viduje jie vykdomi cmd.exe konsolėje. Kad būtų patogiau rašyti scenarijus ir išplėsti naudojamų komandų funkcionalumą, mes iš naujo apibrėžsime komandų vykdymo konsolę Powershell naudodami instrukcijas SHELL.

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

Kitas žingsnis – įdiegti šokoladinių paketų tvarkyklę ir reikiamus paketus:

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'

Norėdami įdiegti paketus naudodami šokoladą, galite tiesiog perduoti juos kaip sąrašą arba įdiegti po vieną, jei reikia perduoti unikalius kiekvieno paketo parametrus. Mūsų situacijoje mes naudojome manifesto failą XML formatu, kuriame yra reikalingų paketų sąrašas ir jų parametrai. Jo turinys atrodo taip:

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

Tada įdiegiame programos kūrimo aplinką, būtent „MS Build Tools 2019“ - tai lengva „Visual Studio 2019“ versija, kurioje yra minimalus reikalingas komponentų rinkinys kodui sudaryti.
Norėdami visiškai dirbti su mūsų C++ projektu, mums reikės papildomų komponentų, būtent:

  • Darbo krūvis C++ įrankiai
  • Įrankių rinkinys v141
  • „Windows 10“ SDK (10.0.17134.0)

Galite automatiškai įdiegti išplėstinį įrankių rinkinį naudodami konfigūracijos failą JSON formatu. Konfigūracijos failo turinys:

Visą galimų komponentų sąrašą galite rasti dokumentacijos svetainėje 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 paleidžia diegimo scenarijų ir patogumui prideda kelią į kūrimo įrankių vykdomuosius failus į aplinkos kintamąjį PATH. Taip pat patartina pašalinti nereikalingus failus ir katalogus, kad sumažintumėte vaizdo dydį.

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)

Šiame etape mūsų atvaizdas, skirtas C++ programai sudaryti, yra paruoštas, ir mes galime pradėti tiesiogiai kurti daugiapakopę programos versiją.

Daugiapakopis veiksmas

Sukurtą vaizdą su visais įrankiais naudosime kaip kūrimo vaizdą. Kaip ir ankstesniame dockerfile scenarijuje, pridėsime galimybę dinamiškai nurodyti versijos numerį / vaizdo žymą, kad būtų lengviau pakartotinai naudoti kodą. Svarbu pridėti etiketę as builder prie surinkimo paveikslėlio instrukcijose FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Dabar atėjo laikas kurti programą. Viskas čia yra gana paprasta: nukopijuokite šaltinio kodą ir viską, kas su juo susiję, ir pradėkite kompiliavimo procesą.

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

Paskutiniame galutinio vaizdo kūrimo etape reikia nurodyti pagrindinį programos vaizdą, kuriame bus visi kompiliavimo artefaktai ir konfigūracijos failai. Norėdami nukopijuoti surinktus failus iš tarpinio surinkimo vaizdo, turite nurodyti parametrą --from=builder instrukcijose COPY.

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

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

Dabar belieka pridėti reikiamas priklausomybes, kad mūsų programa veiktų, ir pagal instrukcijas nurodyti paleidimo komandą ENTRYPOINT arba CMD.

išvada

Šiame straipsnyje kalbėjau apie tai, kaip sukurti visavertę C++ programų kompiliavimo aplinką konteineryje sistemoje „Windows“ ir kaip naudotis daugiapakopių „Docker“ versijų galimybėmis kuriant visaverčius mūsų programos vaizdus.

Šaltinis: www.habr.com

Добавить комментарий