Windows дүрсийг бүтээхийн тулд докерын олон үе шатыг ашиглах

Сайн уу! Намайг Андрей гэдэг бөгөөд би Exness-д хөгжүүлэлтийн багт DevOps инженерээр ажилладаг. Миний үндсэн үйл ажиллагаа бол Линукс үйлдлийн систем (цаашид OS гэх) доор байрлах docker дахь програмуудыг угсрах, байршуулах, дэмжихтэй холбоотой юм. Тун удалгүй би ижил үйл ажиллагаатай даалгавартай байсан ч Windows Server болон C ++ дахь олон тооны төслүүд төслийн зорилтот үйлдлийн систем болсон. Миний хувьд энэ нь Windows үйлдлийн систем болон ерөнхийдөө C++ программтай докер контейнеруудтай хийсэн анхны ойр дотно харилцаа байсан юм. Үүний ачаар би сонирхолтой туршлага олж авч, Windows дээр контейнер хадгалах зарим нарийн ширийн зүйлийг олж мэдсэн.

Windows дүрсийг бүтээхийн тулд докерын олон үе шатыг ашиглах

Энэ нийтлэлд би ямар бэрхшээлтэй тулгарсан, тэдгээрийг хэрхэн шийдэж чадсанаа хэлэхийг хүсч байна. Энэ нь таны одоогийн болон ирээдүйн хэрэгцээнд хэрэг болно гэж найдаж байна. Уншихыг сайхан өнгөрүүлээрэй!

Яагаад савнууд гэж?

Тус компани нь Hashicorp Nomad чингэлэг найруулагч болон Консул, Ваулт зэрэг холбогдох бүрэлдэхүүн хэсгүүдийн дэд бүтэцтэй. Тиймээс хэрэглээний контейнержуулалтыг түлхүүр гардуулах шийдлийг хүргэх нэгдсэн арга болгон сонгосон. Төслийн дэд бүтцэд Windows Server Core үйлдлийн системийн 1803 ба 1809 хувилбар бүхий докер хостууд байдаг тул 1803 болон 1809-д зориулсан докер зургийн хувилбаруудыг тусад нь бүтээх шаардлагатай. 1803 хувилбарт угсралтын докер хостын засварын дугаарыг санах нь чухал. Үндсэн докерын дүрс болон энэ зургийн контейнерыг эхлүүлэх хостын засварын дугаартай тохирч байх ёстой. 1809 хувилбарт энэ сул тал байхгүй. Цааш унших энд.

Яагаад олон үе шаттай вэ?

Хөгжлийн багийн инженерүүд хостуудыг бүтээх эрхгүй эсвэл маш хязгаарлагдмал бөгөөд эдгээр хостууд дээр програм бүтээх бүрэлдэхүүн хэсгүүдийг хурдан удирдах арга байхгүй, жишээлбэл, Visual Studio-д зориулсан нэмэлт хэрэгслийн багц эсвэл ажлын ачааллыг суулгах. Тиймээс бид програмыг бүтээхэд шаардлагатай бүх бүрэлдэхүүн хэсгүүдийг угсралтын докерын дүрс дээр суулгахаар шийдсэн. Шаардлагатай бол та зөвхөн докер файлыг хурдан сольж, энэ зургийг бүтээх шугамыг ажиллуулж болно.

Онолоос бизнес рүү

Зургийн хамгийн тохиромжтой докерын олон үе шаттай бүтээхэд програмыг бүтээх орчин нь тухайн программыг бүтээхтэй ижил dockerfile скрипт дээр бэлтгэгдсэн байдаг. Гэхдээ манай тохиолдолд завсрын холбоос нэмэгдсэн, тухайлбал, програмыг бүтээхэд шаардлагатай бүх зүйл бүхий докер дүрсийг урьдчилан үүсгэх алхам. Би бүх хамаарлыг суулгах хугацааг багасгахын тулд docker кэш функцийг ашиглахыг хүссэн учраас үүнийг хийсэн.

Энэ зургийг бүтээх dockerfile скриптийн гол санааг авч үзье.

Докер файлд үйлдлийн системийн өөр хувилбаруудын зургийг үүсгэхийн тулд угсрах явцад хувилбарын дугаар дамжих аргументыг тодорхойлж болох бөгөөд энэ нь мөн үндсэн зургийн шошго болно.

Microsoft Windows Server зургийн шошгуудын бүрэн жагсаалтыг олж болно энд.

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

Зааварт заасан өгөгдмөл тушаалууд RUN Windows дээрх 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 бүтээх ажлыг шууд үргэлжлүүлж болно.

Үйл ажиллагааны олон үе шаттай

Угсралтын зургийн хувьд бид бүтээсэн дүрсийг самбар дээрх бүх хэрэгслүүдийн хамт ашиглах болно. Өмнөх 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.

дүгнэлт

Энэ нийтлэлд би Windows дээр контейнер дотор бүрэн хэмжээний C++ програмын эмхэтгэлийн орчинг хэрхэн үүсгэх, мөн докерын олон үе шаттай бүтээцийг ашиглан програмынхаа бүрэн хэмжээний зургийг хэрхэн бүтээхийг харуулсан.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх