Windows кескіндерін құру үшін көп сатылы докерді пайдалану

Бәріңе сәлем! Менің атым Андрей, мен Exness компаниясында әзірлеу тобында DevOps инженері болып жұмыс істеймін. Менің негізгі қызметім Linux операциялық жүйесі (бұдан әрі – ОЖ) астында докерде қолданбаларды құру, орналастыру және қолдаумен байланысты. Жақында менде бірдей әрекеттермен тапсырма болды, бірақ жобаның мақсатты ОЖ Windows Server және C++ жобаларының жиынтығы болды. Мен үшін бұл Windows операциялық жүйесіндегі докер контейнерлерімен және жалпы C++ қолданбаларымен алғашқы тығыз әрекеттесу болды. Осының арқасында мен қызықты тәжірибеге ие болдым және Windows жүйесіндегі қолданбаларды контейнерлеудің кейбір қыр-сырын білдім.

Windows кескіндерін құру үшін көп сатылы докерді пайдалану

Бұл мақалада мен сізге қандай қиындықтарға тап болғанымды және оларды қалай шеше алғанымды айтқым келеді. Бұл сіздің қазіргі және болашақ қиындықтарыңыз үшін пайдалы болады деп үміттенемін. Оқудан ләззат алыңыз!

Неліктен контейнерлер?

Компанияда Hashicorp Nomad контейнерлік оркестрі және оған қатысты құрамдас бөліктер - Consul and Vault үшін қолданыстағы инфрақұрылым бар. Сондықтан қолданбалы контейнерлендіру толық шешімді жеткізудің бірыңғай әдісі ретінде таңдалды. Жобаның инфрақұрылымында Windows Server Core ОЖ 1803 және 1809 нұсқалары бар докер хосттары болғандықтан, 1803 және 1809 үшін докер кескіндерінің бөлек нұсқаларын құрастыру қажет. 1803 нұсқасында құрастыру докер хостының түзету нөмірін есте сақтау маңызды. негізгі докер кескінінің қайта қарау нөміріне және осы кескіндегі контейнер іске қосылатын хостқа сәйкес келуі керек. 1809 нұсқасында мұндай кемшілік жоқ. Толығырақ оқи аласыз осында.

Неліктен көп сатылы?

Әзірлеу тобының инженерлерінің хосттарды құруға рұқсаты жоқ немесе өте шектеулі; осы хосттарда қолданбаны құруға арналған компоненттер жинағын жылдам басқарудың ешқандай жолы жоқ, мысалы, қосымша құралдар жинағын немесе Visual Studio үшін жұмыс жүктемесін орнату. Сондықтан біз Docker кескініне қосымшаны құруға қажетті барлық құрамдастарды орнату туралы шешім қабылдадық. Қажет болса, сіз тек докер файлын жылдам өзгерте аласыз және осы кескінді жасау үшін құбырды іске қоса аласыз.

Теориядан әрекетке

Керемет Docker көп сатылы кескін құрастыруында қолданбаны құру ортасы қолданбаның өзі жасалғандай Dockerfile сценарийінде дайындалады. Бірақ біздің жағдайда аралық сілтеме қосылды, атап айтқанда, қосымшаны құру үшін барлық қажетті заттармен докер кескінін алдын ала жасау қадамы. Бұл барлық тәуелділіктерді орнату уақытын азайту үшін докер кэш мүмкіндігін пайдаланғым келгендіктен жасалды.

Осы кескінді жасау үшін докер файл сценарийінің негізгі нүктелерін қарастырайық.

Әртүрлі ОЖ нұсқаларының кескіндерін жасау үшін құрастыру кезінде нұсқа нөмірі берілетін докер файлында аргументті анықтауға болады және ол сонымен қатар негізгі кескіннің тегі болып табылады.

Microsoft Windows Server сурет тегтерінің толық тізімін табуға болады осында.

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

Әдепкі бойынша нұсқаулардағы пәрмендер RUN Windows ОЖ докер файлының ішінде олар cmd.exe консолінде орындалады. Сценарийлерді жазудың ыңғайлылығы және пайдаланылатын пәрмендердің функционалдығын кеңейту үшін нұсқаулық арқылы Powershell бағдарламасында пәрменді орындау консолін қайта анықтаймыз. SHELL.

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

Келесі қадам шоколад пакетінің менеджерін және қажетті бумаларды орнату болып табылады:

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'

Шоколадты пайдаланып бумаларды орнату үшін оларды жай ғана тізім ретінде беруге болады немесе әрбір бума үшін бірегей параметрлерді беру қажет болса, оларды бір-бірден орнатуға болады. Біздің жағдайда біз XML пішіміндегі манифест файлын қолдандық, онда қажетті пакеттер тізімі және олардың параметрлері бар. Оның мазмұны келесідей көрінеді:

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

Әрі қарай, біз қолданбаны құрастыру ортасын орнатамыз, атап айтқанда, MS Build Tools 2019 – бұл Visual Studio 2019 бағдарламасының жеңіл нұсқасы, ол кодты құрастыруға қажетті ең аз қажетті құрамдастарды қамтиды.
Біздің C++ жобамызбен толық жұмыс істеу үшін бізге қосымша компоненттер қажет, атап айтқанда:

  • Жұмыс жүктемесі C++ құралдары
  • Құралдар жинағы v141
  • Windows 10 SDK (10.0.17134.0)

JSON пішіміндегі конфигурация файлын пайдаланып, кеңейтілген құралдар жинағын автоматты түрде орнатуға болады. Конфигурация файлының мазмұны:

Қолжетімді құрамдастардың толық тізімін құжаттама сайтынан табуға болады 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"
  ]
}

Докер файлы орнату сценарийін іске қосады және ыңғайлы болу үшін орта айнымалысына құрастыру құралдарының орындалатын файлдарының жолын қосады. PATH. Сондай-ақ кескін өлшемін азайту үшін қажет емес файлдар мен каталогтарды алып тастаған жөн.

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)

Бұл кезеңде C++ қосымшасын құрастыруға арналған кескініміз дайын және біз қосымшаның көп сатылы докер құрастыруын жасауға тікелей кірісе аламыз.

Көп сатылы әрекет

Құрылған кескінді борттағы барлық құралдармен бірге құрастыру кескіні ретінде қолданамыз. Алдыңғы докер-файл сценарийіндегідей, кодты қайта пайдалануды жеңілдету үшін нұсқа нөмірін/кескін тегін динамикалық түрде көрсету мүмкіндігін қосамыз. Белгіні қосу маңызды as builder нұсқаулардағы құрастыру кескініне FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Енді қосымшаны құру уақыты келді. Мұнда барлығы өте қарапайым: бастапқы кодты және онымен байланысты барлық нәрсені көшіріп, құрастыру процесін бастаңыз.

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

Соңғы кескінді жасаудың соңғы кезеңі барлық компиляция артефактілері мен конфигурация файлдары орналасатын қолданбаның негізгі кескінін көрсету болып табылады. Аралық жинақ кескінінен құрастырылған файлдарды көшіру үшін параметрді көрсету керек --from=builder нұсқаулықта көрсетілген COPY.

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

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

Енді біздің қолданба жұмыс істеуі үшін қажетті тәуелділіктерді қосу және нұсқаулар арқылы іске қосу пәрменін көрсету ғана қалады ENTRYPOINT немесе CMD.

қорытынды

Бұл мақалада мен Windows жүйесіндегі контейнер ішінде C++ қосымшалары үшін толыққанды компиляция ортасын қалай жасау керектігі және қосымшамыздың толыққанды кескіндерін жасау үшін докердің көп сатылы құрастыруларының мүмкіндіктерін қалай пайдалану керектігі туралы айттым.

Ақпарат көзі: www.habr.com

пікір қалдыру