Windows-ի պատկերներ ստեղծելու համար docker-ի բազմաստիճան օգտագործումը

Բարեւ բոլորին! Իմ անունը Անդրեյ է, և ես աշխատում եմ որպես DevOps-ի ինժեներ Exness-ում՝ մշակողների թիմում: Իմ հիմնական գործունեությունը կապված է Linux օպերացիոն համակարգի ներքո (այսուհետ՝ ՕՀ) docker-ում հավելվածների կառուցման, տեղակայման և աջակցման հետ։ Ոչ վաղ անցյալում ես նույն գործողություններով խնդիր ունեի, բայց նախագծի թիրախային ՕՀ-ն Windows Server-ն էր և C++ նախագծերի մի շարք: Ինձ համար սա առաջին սերտ փոխազդեցությունն էր Windows OS-ի տակ գտնվող դոկեր կոնտեյներների և, ընդհանրապես, C++ հավելվածների հետ: Դրա շնորհիվ ես հետաքրքիր փորձ ունեցա և իմացա Windows-ում կոնտեյներացման հավելվածների որոշ բարդությունների մասին:

Windows-ի պատկերներ ստեղծելու համար docker-ի բազմաստիճան օգտագործումը

Այս հոդվածում ուզում եմ պատմել, թե ինչ դժվարությունների եմ հանդիպել և ինչպես կարողացա լուծել դրանք։ Հուսով եմ, որ սա օգտակար կլինի ձեր ընթացիկ և ապագա մարտահրավերների համար: Վայելե՛ք կարդալը:

Ինչու՞ կոնտեյներներ:

Ընկերությունն ունի Hashicorp Nomad կոնտեյներային նվագախմբի և հարակից բաղադրիչների համար գոյություն ունեցող ենթակառուցվածք՝ Consul and Vault: Հետևաբար, կիրառական կոնտեյներացումը ընտրվել է որպես ամբողջական լուծում տրամադրելու միասնական մեթոդ: Քանի որ նախագծի ենթակառուցվածքը պարունակում է Windows Server Core OS-ի 1803 և 1809 տարբերակներով դոկեր հոսթինգներ, անհրաժեշտ է ստեղծել 1803 և 1809 թվականների համար դոկերի պատկերների առանձին տարբերակներ: 1803 տարբերակում կարևոր է հիշել, որ build docker հոսթի վերանայման համարը: պետք է համապատասխանի բազային դոկերի պատկերի վերանայման համարին և հոսթին, որտեղ կգործարկվի այս պատկերի կոնտեյները: 1809 տարբերակը նման թերություն չունի։ Դուք կարող եք կարդալ ավելին այստեղ.

Ինչու՞ բազմափուլ:

Զարգացման թիմի ինժեներները չունեն կամ շատ սահմանափակ մուտք ունեն հոսթներ կառուցելու համար, չկա որևէ միջոց արագ կառավարելու բաղադրիչների հավաքածուն այս հոսթինգների վրա հավելված ստեղծելու համար, օրինակ՝ տեղադրել լրացուցիչ գործիքների հավաքածու կամ աշխատանքային ծանրաբեռնվածություն Visual Studio-ի համար: Հետևաբար, մենք որոշում կայացրինք տեղադրել բոլոր այն բաղադրիչները, որոնք անհրաժեշտ են հավելվածը կառուցելու Docker պատկերի մեջ: Անհրաժեշտության դեպքում կարող եք արագ փոխել միայն dockerfile-ը և գործարկել այս պատկերը ստեղծելու խողովակաշարը:

Տեսությունից մինչև գործողություն

Իդեալական Docker-ի բազմաստիճան պատկերի կառուցման դեպքում հավելվածի ստեղծման միջավայրը պատրաստված է նույն Dockerfile սկրիպտով, ինչ հավելվածն ինքն է կառուցված: Բայց մեր դեպքում ավելացվեց միջանկյալ հղում, այն է՝ դոկերի պատկեր ստեղծելու նախնական քայլը՝ հավելվածը ստեղծելու համար անհրաժեշտ ամեն ինչով: Դա արվել է, քանի որ ես ուզում էի օգտագործել docker cache ֆունկցիան՝ նվազեցնելու բոլոր կախվածությունների տեղադրման ժամանակը:

Դիտարկենք այս պատկերը ստեղծելու dockerfile սցենարի հիմնական կետերը:

ՕՀ-ի տարբեր տարբերակների պատկերներ ստեղծելու համար dockerfile-ում կարող եք սահմանել արգումենտ, որի միջոցով կառուցման ընթացքում փոխանցվում է տարբերակի համարը, և դա նաև բազային պատկերի պիտակն է։

Microsoft Windows Server պատկերի պիտակների ամբողջական ցանկը կարելի է գտնել այստեղ.

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

Լռելյայնորեն հրահանգների հրամանները RUN Windows OS-ի dockerfile-ի ներսում դրանք կատարվում են 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"
  ]
}

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++ հավելվածը կազմելու մեր պատկերը պատրաստ է, և մենք կարող ենք ուղղակիորեն անցնել հավելվածի docker-ի բազմաստիճան build-ի ստեղծմանը։

Բազմաստիճան գործողության մեջ

Մենք կօգտագործենք ստեղծված պատկերը բոլոր գործիքների հետ միասին, որպես կառուցապատման պատկեր: Ինչպես նախորդ 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-ի տակ գտնվող կոնտեյների ներսում և ինչպես օգտագործել docker բազմաստիճան կառուցումների հնարավորությունները՝ ստեղծելու մեր հավելվածի լիարժեք պատկերներ:

Source: www.habr.com

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