Windows tasvirlarini yaratish uchun docker ko'p bosqichli foydalanish

Hammaga salom! Mening ismim Andrey va men Exness kompaniyasida DevOps muhandisi bo'lib ishlayapman. Mening asosiy faoliyatim Linux operatsion tizimi (keyingi o'rinlarda OT deb yuritiladi) ostida docker-da ilovalarni yaratish, joylashtirish va qo'llab-quvvatlash bilan bog'liq. Yaqinda menda xuddi shu harakatlar bilan vazifa bor edi, lekin loyihaning maqsadli operatsion tizimi Windows Server va C++ loyihalari to'plami edi. Men uchun bu Windows OS ostida docker konteynerlari bilan va umuman, C++ ilovalari bilan birinchi yaqin aloqa edi. Buning yordamida men qiziqarli tajribaga ega bo'ldim va Windows-da konteynerlash ilovalarining ba'zi nozik tomonlarini bilib oldim.

Windows tasvirlarini yaratish uchun docker ko'p bosqichli foydalanish

Ushbu maqolada men qanday qiyinchiliklarga duch kelganimni va ularni qanday hal qilishga muvaffaq bo'lganimni aytmoqchiman. Umid qilamanki, bu sizning hozirgi va kelajakdagi muammolaringizga yordam beradi. O'qishdan zavqlaning!

Nima uchun konteynerlar?

Kompaniya Hashicorp Nomad konteyner orkestri va tegishli komponentlar - Konsul va Vault uchun mavjud infratuzilmaga ega. Shu sababli, dasturni konteynerlash kalitli yechimni yetkazib berishning yagona usuli sifatida tanlandi. Loyiha infratuzilmasi Windows Server Core OS 1803 va 1809 versiyalariga ega docker xostlarini o'z ichiga olganligi sababli, 1803 va 1809 uchun docker tasvirlarining alohida versiyalarini yaratish kerak. 1803-versiyada docker xostning revizion raqami ekanligini yodda tutish kerak. asosiy docker tasvirining revizion raqamiga va ushbu rasmdagi konteyner ishga tushiriladigan xostga mos kelishi kerak. 1809-versiyada bunday kamchilik yo'q. Siz ko'proq o'qishingiz mumkin shu yerda.

Nima uchun ko'p bosqichli?

Rivojlanish guruhi muhandislari xostlarni yaratish imkoniyatiga ega emaslar yoki juda cheklangan; bu xostlarda ilova yaratish uchun komponentlar to‘plamini tezda boshqarishning imkoni yo‘q, masalan, Visual Studio uchun qo‘shimcha asboblar to‘plami yoki ish yukini o‘rnatish. Shuning uchun biz ilovani Docker tasviriga yaratish uchun zarur bo'lgan barcha komponentlarni o'rnatishga qaror qildik. Agar kerak bo'lsa, siz tezda faqat docker faylini o'zgartirishingiz va ushbu tasvirni yaratish uchun quvur liniyasini ishga tushirishingiz mumkin.

Nazariyadan harakatga

Ideal Docker ko'p bosqichli tasvirni yaratishda, ilovani yaratish uchun muhit dasturning o'zi yaratilgani kabi bir xil Dockerfile skriptida tayyorlanadi. Ammo bizning holatlarimizda oraliq havola qo'shildi, ya'ni dasturni yaratish uchun zarur bo'lgan barcha narsalar bilan docker tasvirini oldindan yaratish bosqichi. Bu barcha bog'liqliklarni o'rnatish vaqtini qisqartirish uchun docker kesh xususiyatidan foydalanmoqchi bo'lganim uchun qilingan.

Keling, ushbu tasvirni yaratish uchun dockerfile skriptining asosiy nuqtalarini ko'rib chiqaylik.

Turli xil OT versiyalarining tasvirlarini yaratish uchun siz docker faylida argumentni belgilashingiz mumkin, u orqali versiya raqami tuzilish vaqtida uzatiladi va u ham asosiy tasvirning tegidir.

Microsoft Windows Server tasvir teglarining to'liq ro'yxatini topish mumkin shu yerda.

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

Odatiy bo'lib, ko'rsatmalardagi buyruqlar RUN Windows operatsion tizimidagi dockerfile ichida ular cmd.exe konsolida bajariladi. Skriptlarni yozish qulayligi va foydalanilgan buyruqlar funksiyalarini kengaytirish uchun biz Powershell-da buyruqni bajarish konsolini ko'rsatmalar orqali qayta belgilaymiz. SHELL.

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

Keyingi qadam shokoladli paketlar menejerini va kerakli paketlarni o'rnatishdir:

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'

Paketlarni shokolad yordamida o'rnatish uchun ularni ro'yxatda o'tkazishingiz yoki har bir paket uchun noyob parametrlarni kiritishingiz kerak bo'lsa, ularni birma-bir o'rnatishingiz mumkin. Bizning vaziyatimizda biz XML formatidagi manifest faylidan foydalandik, unda kerakli paketlar ro'yxati va ularning parametrlari mavjud. Uning mazmuni quyidagicha ko'rinadi:

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

Keyinchalik, biz dastur yaratish muhitini o'rnatamiz, ya'ni MS Build Tools 2019 - bu Visual Studio 2019 ning engil versiyasi bo'lib, kodni kompilyatsiya qilish uchun minimal talab qilinadigan komponentlar to'plamini o'z ichiga oladi.
C++ loyihamiz bilan to'liq ishlash uchun bizga qo'shimcha komponentlar kerak bo'ladi, xususan:

  • Ish yuki C++ vositalari
  • Asboblar to'plami v141
  • Windows 10 SDK (10.0.17134.0)

JSON formatidagi konfiguratsiya fayli yordamida kengaytirilgan asboblar to'plamini avtomatik ravishda o'rnatishingiz mumkin. Konfiguratsiya fayli tarkibi:

Mavjud komponentlarning to'liq ro'yxatini hujjatlar saytida topish mumkin 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 o'rnatish skriptini ishga tushiradi va qulaylik uchun quriladigan asboblar bajariladigan fayllarga yo'lni muhit o'zgaruvchisiga qo'shadi PATH. Tasvir hajmini kamaytirish uchun keraksiz fayllar va kataloglarni olib tashlash ham tavsiya etiladi.

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)

Ushbu bosqichda C++ dasturini kompilyatsiya qilish uchun rasmimiz tayyor va biz to'g'ridan-to'g'ri docker ko'p bosqichli ilovani yaratishga o'tishimiz mumkin.

Ko'p bosqichli harakat

Yaratilgan tasvirni bortdagi barcha vositalar bilan qurish tasviri sifatida ishlatamiz. Oldingi dockerfile skriptida bo'lgani kabi, biz kodni qayta ishlatish qulayligi uchun versiya raqami/tasvir tegini dinamik ravishda belgilash imkoniyatini qo'shamiz. Yorliq qo'shish muhimdir as builder ko'rsatmalardagi montaj tasviriga FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Endi dasturni yaratish vaqti keldi. Bu erda hamma narsa juda oddiy: manba kodini va u bilan bog'liq barcha narsalarni nusxalash va kompilyatsiya jarayonini boshlash.

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

Yakuniy tasvirni yaratishning yakuniy bosqichi - barcha kompilyatsiya artefaktlari va konfiguratsiya fayllari joylashgan ilovaning asosiy tasvirini belgilash. Oraliq montaj tasviridan kompilyatsiya qilingan fayllarni nusxalash uchun siz parametrni ko'rsatishingiz kerak --from=builder ko'rsatmalarda COPY.

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

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

Endi qolgan narsa bizning ilovamiz ishlashi uchun kerakli bog'liqliklarni qo'shish va ko'rsatmalar orqali ishga tushirish buyrug'ini belgilashdir ENTRYPOINT yoki CMD.

xulosa

Ushbu maqolada men Windows ostida konteyner ichida C++ ilovalari uchun to‘liq kompilyatsiya muhitini qanday yaratish va ilovamizning to‘laqonli tasvirlarini yaratish uchun docker ko‘p bosqichli konstruksiyalarining imkoniyatlaridan qanday foydalanish haqida gapirib berdim.

Manba: www.habr.com

a Izoh qo'shish