Windows şəkillərini yaratmaq üçün docker çox mərhələli istifadə

Hamıya salam! Mənim adım Andrey və mən inkişaf komandasında Exness-də DevOps mühəndisi kimi işləyirəm. Əsas fəaliyyətim Linux əməliyyat sistemi (bundan sonra ƏS) altında docker proqramlarının qurulması, yerləşdirilməsi və dəstəklənməsi ilə bağlıdır. Bir müddət əvvəl eyni fəaliyyətlərlə bir tapşırığım var idi, lakin layihənin hədəf ƏS Windows Server və bir sıra C++ layihələri idi. Mənim üçün bu, Windows OS altında docker konteynerləri ilə və ümumiyyətlə, C++ proqramları ilə ilk sıx qarşılıqlı əlaqə idi. Bunun sayəsində mən maraqlı təcrübə qazandım və Windows-da konteynerləşdirmə proqramlarının bəzi incəliklərini öyrəndim.

Windows şəkillərini yaratmaq üçün docker çox mərhələli istifadə

Bu yazıda sizə hansı çətinliklərlə üzləşdiyimi və onları necə həll edə bildiyimi söyləmək istəyirəm. Ümid edirəm ki, bu, cari və gələcək problemləriniz üçün faydalı olacaq. Oxumaqdan həzz alın!

Niyə konteynerlər?

Şirkət Hashicorp Nomad konteyner orkestri və əlaqəli komponentlər - Konsul və Vault üçün mövcud infrastruktura malikdir. Buna görə də, tətbiqin konteynerləşdirilməsi tam həllin çatdırılması üçün vahid üsul kimi seçildi. Layihə infrastrukturunda Windows Server Core OS 1803 və 1809 versiyaları olan docker hostları olduğundan, 1803 və 1809 üçün doker təsvirlərinin ayrı versiyalarını qurmaq lazımdır. 1803-cü versiyada quraşdırma docker hostunun təftiş nömrəsinin olduğunu xatırlamaq vacibdir. əsas doker təsvirinin reviziya nömrəsinə və bu təsvirdən konteynerin işə salınacağı hosta uyğun olmalıdır. 1809-cu versiyada belə bir çatışmazlıq yoxdur. Ətraflı oxuya bilərsiniz burada.

Niyə çoxmərhələli?

İnkişaf komandasının mühəndislərinin hostlar qurmaq imkanı yoxdur və ya çox məhduddur; bu hostlarda proqram yaratmaq üçün komponentlər dəstini tez idarə etmək üçün heç bir yol yoxdur, məsələn, Visual Studio üçün əlavə alətlər dəsti və ya iş yükü quraşdırın. Buna görə də, tətbiqi Docker imicinə qurmaq üçün lazım olan bütün komponentləri quraşdırmaq qərarına gəldik. Lazım gələrsə, tez bir zamanda yalnız docker faylını dəyişdirə və bu təsviri yaratmaq üçün boru xəttini işə sala bilərsiniz.

Nəzəriyyədən hərəkətə

İdeal Docker çoxmərhələli təsvir quruluşunda, tətbiqin qurulması üçün mühit tətbiqin özü qurulduğu kimi eyni Dockerfile skriptində hazırlanır. Ancaq bizim vəziyyətimizdə ara keçid əlavə edildi, yəni tətbiqi qurmaq üçün lazım olan hər şeyi olan bir docker görüntüsünün ilkin yaradılması addımı. Bu, bütün asılılıqların quraşdırılması vaxtını azaltmaq üçün docker keş xüsusiyyətindən istifadə etmək istədiyim üçün edildi.

Bu təsviri yaratmaq üçün dockerfile skriptinin əsas məqamlarına nəzər salaq.

Fərqli OS versiyalarının şəkillərini yaratmaq üçün siz doker faylında quruluş zamanı versiya nömrəsinin ötürüldüyü arqumenti təyin edə bilərsiniz və bu, həm də əsas təsvirin etiketidir.

Microsoft Windows Server şəkil teqlərinin tam siyahısını tapa bilərsiniz burada.

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

Varsayılan olaraq, təlimatlardakı əmrlər RUN Windows OS-də dockerfile daxilində onlar cmd.exe konsolunda icra olunur. Skriptlərin yazılmasının rahatlığı və istifadə olunan əmrlərin funksionallığının genişləndirilməsi üçün təlimat vasitəsilə Powershell-də əmr icra konsolunu yenidən təyin edəcəyik. SHELL.

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

Növbəti addım şokolad paket menecerini və lazımi paketləri quraşdırmaqdır:

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'

Paketləri şokoladdan istifadə etməklə quraşdırmaq üçün onları sadəcə olaraq siyahı kimi ötürə və ya hər paket üçün unikal parametrləri ötürməlisinizsə, onları bir-bir quraşdıra bilərsiniz. Bizim vəziyyətimizdə tələb olunan paketlərin və onların parametrlərinin siyahısını ehtiva edən XML formatında bir manifest faylından istifadə etdik. Onun məzmunu belə görünür:

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

Sonra, proqram qurma mühitini, yəni MS Build Tools 2019-u quraşdırırıq - bu, kodun tərtib edilməsi üçün minimum tələb olunan komponentlər dəstini ehtiva edən Visual Studio 2019-un yüngül versiyasıdır.
C++ layihəmizlə tam işləmək üçün bizə əlavə komponentlər lazımdır, yəni:

  • İş yükü C++ alətləri
  • Alətlər dəsti v141
  • Windows 10 SDK (10.0.17134.0)

Siz JSON formatında konfiqurasiya faylından istifadə edərək genişləndirilmiş alətlər dəstini avtomatik quraşdıra bilərsiniz. Konfiqurasiya faylının məzmunu:

Mövcud komponentlərin tam siyahısını sənədlər saytında tapa bilərsiniz 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 quraşdırma skriptini işlədir və rahatlıq üçün ətraf mühit dəyişəninə icra edilə bilən faylların qurulması alətlərinin yolunu əlavə edir. PATH. Şəklin ölçüsünü azaltmaq üçün lazımsız faylları və qovluqları silmək də məsləhətdir.

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)

Bu mərhələdə, C++ proqramını tərtib etmək üçün təsvirimiz hazırdır və biz birbaşa tətbiqin docker çoxmərhələli quruluşunu yaratmağa davam edə bilərik.

Çox mərhələli fəaliyyət

Yaradılmış təsviri göyərtədəki bütün alətlərlə birlikdə qurma şəkli kimi istifadə edəcəyik. Əvvəlki dockerfile skriptində olduğu kimi, kodun təkrar istifadəsi asanlığı üçün versiya nömrəsini/şəkil teqini dinamik olaraq təyin etmək imkanı əlavə edəcəyik. Etiket əlavə etmək vacibdir as builder təlimatlardakı montaj şəklinə FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

İndi tətbiqi qurmaq vaxtıdır. Burada hər şey olduqca sadədir: mənbə kodunu və onunla əlaqəli hər şeyi kopyalayın və tərtib prosesinə başlayın.

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

Son görüntünün yaradılmasının son mərhələsi bütün kompilyasiya artefaktlarının və konfiqurasiya fayllarının yerləşəcəyi tətbiqin əsas şəklini müəyyən etməkdir. Aralıq montaj görüntüsündən tərtib edilmiş faylları köçürmək üçün parametri göstərməlisiniz --from=builder təlimatlarda COPY.

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

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

İndi yalnız tətbiqimizin işləməsi üçün lazımi asılılıqları əlavə etmək və təlimatlar vasitəsilə işə salma əmrini təyin etmək qalır ENTRYPOINT və ya CMD.

Nəticə

Bu yazıda mən Windows altında konteyner daxilində C++ proqramları üçün tam hüquqlu kompilyasiya mühitini necə yaratmaq və tətbiqimizin tam hüquqlu şəkillərini yaratmaq üçün docker çoxmərhələli konstruksiyaların imkanlarından necə istifadə etmək barədə danışdım.

Mənbə: www.habr.com

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