Истифодаи бисёрмарҳилаи docker барои сохтани тасвирҳои Windows

Салом ба ҳама! Номи ман Андрей аст ва ман ҳамчун муҳандиси DevOps дар Exness дар гурӯҳи таҳиякунанда кор мекунам. Фаъолияти асосии ман ба сохтан, ҷобаҷогузорӣ ва дастгирии барномаҳо дар docker дар системаи оператсионии Linux (минбаъд ОС номида мешавад) алоқаманд аст. Чанде пеш ман як вазифаро бо ҳамон фаъолиятҳо доштам, аммо OS ҳадафи лоиҳа Windows Server ва маҷмӯи лоиҳаҳои C++ буд. Барои ман, ин аввалин ҳамкории наздик бо контейнерҳои докер дар OS Windows ва умуман бо барномаҳои C++ буд. Ба шарофати ин, ман таҷрибаи ҷолиб доштам ва дар бораи баъзе нозукиҳои барномаҳои контейнерсозӣ дар Windows шинос шудам.

Истифодаи бисёрмарҳилаи docker барои сохтани тасвирҳои Windows

Дар ин мақола ман мехоҳам ба шумо бигӯям, ки ман бо чӣ гуна мушкилот дучор шудам ва чӣ гуна онҳоро ҳал карда метавонам. Ман умедворам, ки ин барои мушкилоти ҷорӣ ва ояндаи шумо муфид хоҳад буд. Аз хондан лаззат баред!

Чаро контейнерҳо?

Ширкат дорои инфрасохтори мавҷудаи оркестри контейнерии Hashicorp Nomad ва ҷузъҳои марбут - Consul and Vault мебошад. Аз ин рӯ, контейнеризатсияи барнома ҳамчун усули ягонаи расонидани ҳалли мукаммал интихоб карда шуд. Азбаски инфрасохтори лоиҳа дорои ҳостҳои докерӣ бо версияҳои Windows Server Core OS 1803 ва 1809 мебошад, зарур аст, ки версияҳои алоҳидаи тасвирҳои докер барои 1803 ва 1809 сохта шаванд. Дар версияи 1803, дар хотир доштан муҳим аст, ки рақами таҷдиди ҳости сохтани докер бояд ба рақами таҷдиди тасвири докери асосӣ ва хосте, ки контейнер аз ин тасвир оғоз мешавад, мувофиқат кунад. Версияи 1809 чунин нуқсон надорад. Шумо метавонед бештар хонед дар ин ҷо.

Чаро бисёрмарҳила?

Муҳандисони дастаи таҳиякунанда барои сохтани ҳостҳо дастрасии хеле маҳдуд ё маҳдуд доранд; роҳи зуд идора кардани маҷмӯи ҷузъҳо барои сохтани замима дар ин ҳостҳо вуҷуд надорад, масалан, насби асбобҳои иловагӣ ё сарбории корӣ барои Visual Studio. Аз ин рӯ, мо тасмим гирифтем, ки ҳамаи ҷузъҳои заруриро барои сохтани барнома дар симои сохтани Docker насб кунем. Агар лозим бошад, шумо метавонед танҳо файли докер-файлро зуд тағир диҳед ва лӯлаи эҷоди ин тасвирро оғоз кунед.

Аз назария ба амал

Дар сохтани тасвири идеалии бисёрмарҳалаи Docker, муҳити сохтани барнома дар ҳамон скрипти Dockerfile, ки худи барнома сохта шудааст, омода карда мешавад. Аммо дар ҳолати мо, як пайванди фосилавӣ илова карда шуд, яъне қадами пешакии эҷоди тасвири докер бо ҳама чизҳои зарурӣ барои сохтани барнома. Ин барои он анҷом дода шуд, ки ман мехостам хусусияти кэши docker-ро барои кам кардани вақти насби ҳама вобастагӣ истифода барам.

Биёед ба нуктаҳои асосии скрипти dockerfile барои сохтани ин тасвир назар андозем.

Барои эҷод кардани тасвирҳои версияҳои гуногуни ОС, шумо метавонед дар файли докер аргументеро муайян кунед, ки тавассути он рақами версия ҳангоми сохтан интиқол дода мешавад ва он инчунин теғи тасвири асосӣ мебошад.

Рӯйхати пурраи барчаспҳои тасвирии Microsoft Windows Serverро пайдо кардан мумкин аст дар ин ҷо.

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

Бо нобаёнӣ фармонҳо дар дастурҳо RUN дар дохили dockerfile дар 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++
  • Маҷмӯи асбобҳо v141
  • Windows 10 SDK (10.0.17134.0)

Шумо метавонед маҷмӯи васеи асбобҳоро бо истифода аз файли конфигуратсия дар формати JSON ба таври худкор насб кунед. Мундариҷаи файли конфигуратсия:

Рӯйхати пурраи ҷузъҳои дастрасро дар сайти ҳуҷҷатгузорӣ пайдо кардан мумкин аст 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 скрипти насбкуниро иҷро мекунад ва барои роҳат, роҳро ба файлҳои иҷрошавандаи асбобҳо ба тағирёбандаи муҳити зист илова мекунад 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++ омода аст ва мо метавонем мустақиман ба сохтани сохтани бисёрмарҳалаи докери барнома идома диҳем.

Бисёр марҳила дар амал

Мо тасвири сохташударо бо тамоми асбобҳои борт ҳамчун тасвири сохта истифода хоҳем кард. Тавре ки дар скрипти пешинаи dockerfile, мо қобилияти ба таври динамикӣ муайян кардани рақами версия/теги тасвирро барои осонии истифодаи такрории код илова хоҳем кард. Илова кардани тамға муҳим аст 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.

хулоса

Дар ин мақола, ман дар бораи чӣ гуна эҷод кардани муҳити мукаммали компилятсионӣ барои замимаҳои C++ дар дохили контейнер дар зери Windows ва чӣ гуна истифода бурдани имкониятҳои докерҳои бисёрсатҳи сохтмонҳо барои эҷоди тасвирҳои мукаммали замимаи мо сӯҳбат кардам.

Манбаъ: will.com

Илова Эзоҳ