Gebrûk fan docker multi-stage om Windows-ôfbyldings te bouwen

Hoi allegearre! Myn namme is Andrey, en ik wurkje as DevOps-yngenieur by Exness yn it ûntwikkelingsteam. Myn haadaktiviteit is relatearre oan it bouwen, ynsetten en stypjen fan applikaasjes yn docker ûnder it Linux-bestjoeringssysteem (hjirnei oantsjutten as it OS). Net lang lyn hie ik in taak mei deselde aktiviteiten, mar it doel OS fan it projekt wie Windows Server en in set fan C ++ projekten. Foar my wie dit de earste nauwe ynteraksje mei docker-konteners ûnder Windows OS en, yn 't algemien, mei C ++-applikaasjes. Hjirmei hie ik in nijsgjirrige ûnderfining en learde ik oer guon fan 'e yngewikkeldheden fan containerisearjen fan applikaasjes yn Windows.

Gebrûk fan docker multi-stage om Windows-ôfbyldings te bouwen

Yn dit artikel wol ik jo fertelle hokker swierrichheden ik hie te krijen en hoe't ik it slagge om se op te lossen. Ik hoopje dat jo dit nuttich fine foar jo hjoeddeistige en takomstige útdagings. Genietsje fan it lêzen!

Wêrom konteners?

It bedriuw hat besteande ynfrastruktuer foar de Hashicorp Nomad container orkestrator en besibbe komponinten - Consul en Vault. Dêrom waard applikaasjecontainerisaasje keazen as in unifoarme metoade foar it leverjen fan in folsleine oplossing. Sûnt de projektynfrastruktuer befettet docker-hosts mei Windows Server Core OS-ferzjes 1803 en 1809, is it nedich om aparte ferzjes fan docker-ôfbyldings te bouwen foar 1803 en 1809. Yn ferzje 1803 is it wichtich om te ûnthâlden dat it revyzjenûmer fan 'e build docker-host moat oerienkomme mei it revyzjenûmer fan 'e basisdokerôfbylding en de host wêr't de kontener fan dizze ôfbylding sil wurde lansearre. Ferzje 1809 hat gjin sa'n nadeel. Jo kinne mear lêze hjir.

Wêrom multi-stage?

Untwikkelingsteam-yngenieurs hawwe gjin of heul beheinde tagong om hosts te bouwen, d'r is gjin manier om de set fan komponinten fluch te behearjen foar it bouwen fan in applikaasje op dizze hosts, bygelyks in ekstra arkset of wurkdruk te ynstallearjen foar Visual Studio. Dêrom hawwe wy it beslút makke om alle komponinten te ynstallearjen dy't nedich binne om de applikaasje yn te bouwen yn 'e build Docker-ôfbylding. As it nedich is, kinne jo fluch feroarje allinne de dockerfile en starte de pipeline foar it meitsjen fan dizze ôfbylding.

Fan teory oant aksje

Yn in ideale Docker multi-stage image build, wurdt de omjouwing foar it bouwen fan de applikaasje taret yn itselde Dockerfile-skript as de applikaasje sels is boud. Mar yn ús gefal waard in tuskenlizzende keppeling tafoege, nammentlik de stap fan it foarriedige meitsjen fan in docker-ôfbylding mei alles wat nedich is om de applikaasje te bouwen. Dit waard dien om't ik de docker-cache-funksje brûke woe om de ynstallaasjetiid fan alle ôfhinklikens te ferminderjen.

Litte wy nei de haadpunten fan it dockerfile-skript sjen foar it meitsjen fan dizze ôfbylding.

Om ôfbyldings fan ferskate OS-ferzjes te meitsjen, kinne jo in argumint definiearje yn 'e dockerfile wêrmei it ferzjenûmer wurdt trochjûn tidens de bou, en it is ek de tag fan' e basisôfbylding.

In folsleine list mei Microsoft Windows Server-ôfbyldingstags kin fûn wurde hjir.

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

Standert binne de kommando's yn 'e ynstruksjes RUN binnen it dockerfile op Windows OS wurde se útfierd yn 'e cmd.exe-konsole. Foar it gemak fan it skriuwen fan skripts en it útwreidzjen fan de funksjonaliteit fan de brûkte kommando's, sille wy de kommando-útfierkonsole yn Powershell opnij definiearje fia de ynstruksje SHELL.

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

De folgjende stap is om de sûkeladepakketbehearder en de nedige pakketten te ynstallearjen:

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'

Om pakketten te ynstallearjen mei sûkelade, kinne jo se gewoan trochjaan as in list, of ien foar ien ynstallearje as jo unike parameters foar elk pakket moatte trochjaan. Yn ús situaasje hawwe wy in manifestbestân brûkt yn XML-formaat, dy't in list befettet mei fereaske pakketten en har parameters. De ynhâld dêrfan sjocht der sa út:

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

Dêrnei ynstallearje wy de applikaasje-buildomjouwing, nammentlik MS Build Tools 2019 - dit is in lichtgewicht ferzje fan Visual Studio 2019, dy't de minimale fereaske set fan komponinten befettet foar it kompilearjen fan koade.
Om folslein te wurkjen mei ús C++-projekt, sille wy ekstra komponinten nedich hawwe, nammentlik:

  • Workload C++ ark
  • Toolset v141
  • Windows 10 SDK (10.0.17134.0)

Jo kinne automatysk in útwreide set ark ynstallearje mei in konfiguraasjetriem yn JSON-formaat. Ynhâld fan konfiguraasjetriem:

In folsleine list mei beskikbere komponinten is te finen op 'e dokumintaasjeside 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"
  ]
}

De dockerfile rint it ynstallaasjeskript, en foeget foar gemak it paad ta nei de útfierbere bestannen foar build-ark oan 'e omjouwingsfariabele PATH. It is ek oan te rieden om ûnnedige bestannen en mappen te ferwiderjen om de grutte fan 'e ôfbylding te ferminderjen.

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)

Op dit poadium is ús ôfbylding foar it kompilearjen fan 'e C ++-applikaasje klear, en wy kinne direkt trochgean mei it meitsjen fan in docker-multy-stage build fan 'e applikaasje.

Multi-poadium yn aksje

Wy sille de makke ôfbylding brûke mei alle ark oan board as in buildôfbylding. Lykas yn it foarige dockerfile-skript, sille wy de mooglikheid taheakje om it ferzjenûmer/ôfbyldingstag dynamysk oan te jaan foar it gemak fan koade opnij. It is wichtich om in label ta te foegjen as builder nei de gearkomste ôfbylding yn 'e ynstruksjes FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

No is it tiid om de applikaasje te bouwen. Alles is hjir frij ienfâldich: kopiearje de boarnekoade en alles dat dermei ferbûn is, en begjin it kompilaasjeproses.

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

De lêste etappe fan it meitsjen fan de definitive ôfbylding is om de basisôfbylding fan 'e applikaasje op te jaan, wêr't alle kompilaasje-artefakten en konfiguraasjebestannen sille lizze. Om kompilearre bestannen te kopiearjen fan 'e tuskenlizzende assemblageôfbylding, moatte jo de parameter opjaan --from=builder yn de ynstruksjes COPY.

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

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

No bliuwt alles oer de nedige ôfhinklikens ta te foegjen foar ús applikaasje om te wurkjen en it startkommando op te jaan fia de ynstruksjes ENTRYPOINT of CMD.

konklúzje

Yn dit artikel haw ik it oer hoe't jo in folsleine kompilaasje-omjouwing meitsje kinne foar C ++-applikaasjes yn in Windows-kontener en hoe't jo de mooglikheden fan docker-multy-stage builds kinne brûke om folweardige ôfbyldings fan ús applikaasje te meitsjen.

Boarne: www.habr.com

Add a comment