Windows сүрөттөрүн куруу үчүн көп баскычтуу докерди колдонуу

Баарына салам! Менин атым Андрей, мен Exness компаниясында иштеп чыгуу тобунда DevOps инженери болуп иштейм. Менин негизги ишим Linux операциялык тутумунун (мындан ары ОС) астында докерде тиркемелерди куруу, жайылтуу жана колдоо менен байланышкан. Жакында эле менде ошол эле иш-аракеттер менен тапшырма бар болчу, бирок долбоордун максаттуу OS Windows Server жана C++ долбоорлорунун топтому болгон. Мен үчүн бул Windows OS астындагы докер контейнерлери жана жалпысынан C++ тиркемелери менен биринчи тыгыз өз ара аракеттенүү болду. Ушунун аркасында мен кызыктуу тажрыйбага ээ болдум жана Windows'догу тиркемелерди контейнерлөөнүн кээ бир татаалдыктарын билдим.

Windows сүрөттөрүн куруу үчүн көп баскычтуу докерди колдонуу

Бул макалада мен сизге кандай кыйынчылыктарга туш болгонун жана аларды кантип чечкенимди айткым келет. Бул сиздин учурдагы жана келечектеги көйгөйлөрүңүзгө жардам берет деп үмүттөнөм. Окуудан ырахат алыңыз!

Эмне үчүн контейнерлер?

Компаниянын Hashicorp Nomad контейнер оркестринин инфраструктурасы жана ага байланыштуу компоненттери бар - Консул жана Vault. Ошондуктан, колдонмо контейнерлештирүү толук чечимди жеткирүү үчүн бирдиктүү ыкма катары тандалып алынган. Долбоордун инфраструктурасы Windows Server Core OS 1803 жана 1809 версиялары менен докер хостторун камтыгандыктан, 1803 жана 1809 үчүн докер сүрөттөрүнүн өзүнчө версияларын түзүү керек. 1803 версиясында куруучу докер хостунун оңдоо номери экенин эстен чыгарбоо керек. базалык докер сүрөтүнүн кайра кароо номерине жана бул сүрөттөн контейнер ишке киргизиле турган хостко дал келиши керек. 1809 версиясында мындай кемчилик жок. Сиз көбүрөөк окуй аласыз бул жерде.

Эмне үчүн көп баскычтуу?

Өнүктүрүү тобунун инженерлеринин хостторду курууга мүмкүнчүлүгү жок же өтө чектелген; бул хосттордо тиркемени куруу үчүн компоненттердин топтомун тез башкаруунун эч кандай жолу жок, мисалы, Visual Studio үчүн кошумча куралдар топтомун же жумуш жүгүн орнотуу. Ошондуктан, биз Docker сүрөтүнө тиркемени куруу үчүн зарыл болгон бардык компоненттерди орнотуу чечимин кабыл алдык. Зарыл болсо, сиз докер файлын гана тез өзгөртүп, бул сүрөттү түзүү үчүн конвейерди ишке киргизе аласыз.

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

Докердин көп баскычтуу образын идеалдуу курууда, тиркемени куруу үчүн чөйрө тиркеме өзү курулгандай эле Dockerfile скриптинде даярдалат. Бирок биздин учурда, аралык шилтеме кошулду, тактап айтканда, тиркемени куруу үчүн зарыл болгон бардык нерселер менен докердин сүрөтүн алдын ала түзүү кадамы. Бул бардык көз карандылыктарды орнотуу убактысын кыскартуу үчүн докер кэш өзгөчөлүгүн колдонууну каалагандыктан жасалды.

Бул сүрөттү түзүү үчүн докер файл скриптинин негизги пункттарын карап көрөлү.

Ар кандай ОС версияларынын сүрөттөрүн түзүү үчүн, сиз докер файлында аргументти аныктай аласыз, ал аркылуу куруу учурунда версия номери өткөрүлөт, ошондой эле ал базалык сүрөттүн теги болуп саналат.

Microsoft Windows Server сүрөт тегтеринин толук тизмесин тапса болот бул жерде.

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

Демейки боюнча, нускамалардагы буйруктар RUN Windows OS докер файлынын ичинде алар 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++ куралдары
  • Toolset 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++ тиркемелери үчүн толук кандуу компиляция чөйрөсүн кантип түзүү жана биздин тиркеменин толук кандуу сүрөттөрүн түзүү үчүн докердин көп баскычтуу түзүлүштөрүнүн мүмкүнчүлүктөрүн кантип колдонуу керектиги жөнүндө сүйлөштүм.

Source: www.habr.com

Комментарий кошуу