Benotzt Docker Multi-Stage fir Windows Biller ze bauen

Moien alleguer! Mäin Numm ass Andrey, an ech schaffen als DevOps Ingenieur bei Exness am Entwécklungsteam. Meng Haaptaktivitéit ass am Zesummenhang mam Bauen, Ofbau an Ënnerstëtzung vun Uwendungen am Docker ënner dem Linux Betriebssystem (nodréiglech als OS bezeechent). Net viru laanger Zäit hat ech eng Aufgab mat déiselwecht Aktivitéiten, awer d'Zil OS vum Projet war Windows Server an eng Rei vu C ++ Projeten. Fir mech war dëst déi éischt enk Interaktioun mat Docker Container ënner Windows OS an allgemeng mat C++ Uwendungen. Dank dësem hat ech eng interessant Erfahrung a geléiert iwwer e puer vun de Schwieregkeete vu Containeriséierungsapplikatiounen a Windows.

Benotzt Docker Multi-Stage fir Windows Biller ze bauen

An dësem Artikel wëll ech Iech soen wéi eng Schwieregkeeten ech konfrontéiert hunn a wéi ech et fäerdeg bruecht hunn se ze léisen. Ech hoffen dat ass hëllefräich fir Är aktuell an zukünfteg Erausfuerderungen. Genéisst d'Liesen!

Firwat Container?

D'Firma huet existent Infrastruktur fir den Hashicorp Nomad Containerorchester a verbonne Komponenten - Consul a Vault. Dofir gouf d'Applikatioun Containeriséierung als vereenegt Method gewielt fir eng komplett Léisung ze liwweren. Zënter datt d'Projetinfrastruktur Docker-Host mat Windows Server Core OS Versiounen 1803 an 1809 enthält, ass et néideg fir separat Versioune vun Docker-Biller fir 1803 an 1809 ze bauen. muss mat der Versiounsnummer vum Basisdocker-Bild an dem Host passen, wou de Container vun dësem Bild gestart gëtt. Versioun 1803 huet keen esou Nodeel. Dir kënnt méi liesen hei.

Firwat Multi-Etapp?

Entwécklungsteam Ingenieuren hunn keen oder ganz limitéierten Zougang fir Hosten ze bauen; et gëtt kee Wee fir séier de Set vu Komponenten ze managen fir eng Applikatioun op dësen Hosten ze bauen, zum Beispill en zousätzlech Toolset oder Workload fir Visual Studio z'installéieren. Dofir hu mir d'Entscheedung getraff fir all déi néideg Komponenten z'installéieren fir d'Applikatioun an d'Build Docker Bild ze bauen. Wann néideg, kënnt Dir séier nëmmen d'Dockerfile änneren an d'Pipeline starten fir dëst Bild ze kreéieren.

Vun Theorie bis Handlung

An engem idealen Docker Multi-Stage Bildbau ass d'Ëmfeld fir d'Applikatioun ze bauen am selwechte Dockerfile Skript virbereet wéi d'Applikatioun selwer gebaut ass. Awer an eisem Fall gouf en Zwëschenlink bäigefüügt, nämlech de Schrëtt vun der virleefeg Schafung vun engem Docker-Bild mat alles wat néideg ass fir d'Applikatioun ze bauen. Dëst gouf gemaach well ech d'Docker Cache Feature benotze wollt fir d'Installatiounszäit vun all Ofhängegkeeten ze reduzéieren.

Loosst eis d'Haaptpunkte vum Dockerfile Skript kucken fir dëst Bild ze kreéieren.

Fir Biller vu verschiddene OS Versiounen ze kreéieren, kënnt Dir en Argument an der Dockerfile definéieren, duerch déi d'Versiounsnummer während dem Build passéiert ass, an et ass och den Tag vum Basisbild.

Eng komplett Lëscht vu Microsoft Windows Server Image Tags ka fonnt ginn hei.

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

Par défaut d'Befehle an den Instruktiounen RUN bannent der Dockerfile op Windows OS gi se an der cmd.exe Konsole ausgefouert. Fir d'Bequemlechkeet fir Scripten ze schreiwen an d'Funktionalitéit vun de benotzte Kommandoen auszebauen, wäerte mir d'Kommando Ausféierungskonsole an Powershell duerch d'Instruktioun nei definéieren SHELL.

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

De nächste Schrëtt ass de Schockela Package Manager an déi néideg Packagen z'installéieren:

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'

Fir Packagen mat Schockela ze installéieren, kënnt Dir se einfach als Lëscht passéieren, oder se eng gläichzäiteg installéieren wann Dir eenzegaarteg Parametere fir all Package muss passéieren. An eiser Situatioun hu mir eng Manifestdatei am XML-Format benotzt, déi eng Lëscht vun erfuerderleche Packagen an hir Parameteren enthält. Säin Inhalt gesäit esou aus:

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

Als nächst installéiere mir d'Applikatioun Build Ëmfeld, nämlech MS Build Tools 2019 - dëst ass eng liicht Versioun vum Visual Studio 2019, déi de Minimum erfuerderleche Set vu Komponenten enthält fir Code ze kompiléieren.
Fir voll mat eisem C++ Projet ze schaffen, brauche mir zousätzlech Komponenten, nämlech:

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

Dir kënnt en erweiderten Set vun Tools automatesch mat enger Konfiguratiounsdatei am JSON-Format installéieren. Configuratiounsdatei Inhalt:

Eng komplett Lëscht vun verfügbare Komponenten kann op der Dokumentatiounssäit fonnt ginn 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"
  ]
}

D'Dockerfile leeft d'Installatiounsskript, a fir d'Bequemlechkeet füügt de Wee un d'Build-Tools ausführbar Dateien un d'Ëmfeldvariabel. PATH. Et ass och unzeroden onnéideg Dateien a Verzeichnisser ze läschen fir d'Gréisst vum Bild ze reduzéieren.

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 dëser Etapp ass eist Bild fir d'C++ Applikatioun ze kompiléieren prett, a mir kënnen direkt weidergoen fir en Docker Multi-Stage Build vun der Applikatioun ze kreéieren.

Multi-Etapp an Aktioun

Mir wäerten dat erstallt Bild mat all den Tools u Bord benotzen als e Baubild. Wéi am fréiere dockerfile Skript, addéiere mir d'Fäegkeet fir dynamesch d'Versiounsnummer / Bildtag ze spezifizéieren fir d'Erliichterung vum Code Wiederverwendung. Et ass wichteg e Label ze addéieren as builder op d'Versammlungsbild an den Instruktiounen FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Elo ass et Zäit d'Applikatioun ze bauen. Alles hei ass ganz einfach: kopéiert de Quellcode an alles wat domat assoziéiert, a fänkt de Compilatiounsprozess un.

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

Déi lescht Etapp fir dat lescht Bild ze kreéieren ass d'Basisbild vun der Applikatioun ze spezifizéieren, wou all Kompiléierungsartefakter a Konfiguratiounsdateien lokaliséiert ginn. Fir kompiléiert Dateien aus dem Zwëschenversammlungsbild ze kopéieren, musst Dir de Parameter uginn --from=builder an den Instruktiounen COPY.

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

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

Elo bleift just déi néideg Ofhängegkeete fir eis Applikatioun ze addéieren an de Startbefehl duerch d'Instruktioune spezifizéieren ENTRYPOINT oder CMD.

Konklusioun

An dësem Artikel hunn ech geschwat wéi een e vollwäertegt Kompiléierungsëmfeld fir C++ Uwendungen an engem Container ënner Windows erstellt a wéi een d'Fähigkeiten vun Docker Multi-Stage Builds benotzt fir vollwäerteg Biller vun eiser Applikatioun ze kreéieren.

Source: will.com

Setzt e Commentaire