Utilizà docker multi-stage per custruisce immagini di Windows

Salut à tutti ! Mi chjamu Andrey, è travagliu cum'è ingegnere DevOps à Exness in u squadra di sviluppu. A mo attività principale hè ligata à a creazione, implementazione è supportu di l'applicazioni in docker sottu u sistema operatore Linux (in seguitu chjamatu OS). Pocu pocu fà aghju avutu un compitu cù e listesse attività, ma u SO di destinazione di u prughjettu era Windows Server è un settore di prughjetti C++. Per mè, questa hè stata a prima interazzione stretta cù i cuntenituri docker sottu Windows OS è, in generale, cù l'applicazioni C++. Grazie à questu, aghju avutu una sperienza interessante è hà amparatu alcune di l'intricacies di l'applicazioni containerizing in Windows.

Utilizà docker multi-stage per custruisce immagini di Windows

In questu articulu, vogliu dì chì e difficultà ch'e aghju avutu per affruntà è cumu aghju riisciutu à risolve. Spergu chì questu hè utile per i vostri sfidi attuali è futuri. Prufittate a lettura!

Perchè cuntenituri?

A cumpagnia hà una infrastruttura esistente per l'orchestratore di container Hashicorp Nomad è cumpunenti cunnessi - Consul è Vault. Dunque, a containerizazione di l'applicazioni hè stata scelta cum'è un metudu unificatu per furnisce una suluzione cumpleta. Siccomu l'infrastruttura di u prughjettu cuntene docker hosts cù Windows Server Core OS versioni 1803 è 1809, hè necessariu di custruisce versioni separati di l'imaghjini docker per 1803 è 1809. In a versione 1803, hè impurtante ricurdà chì u numeru di rivisione di u build docker host. deve currisponde à u numeru di rivisione di l'imaghjini di basa di docker è l'ospitu induve u cuntinuu da sta maghjina serà lanciatu. A versione 1809 ùn hà micca tali inconvenienti. Pudete leghje più ccà.

Perchè multi-stadi?

L'ingegneri di u squadra di sviluppu ùn anu micca accessu o assai limitatu per custruisce l'ospiti; ùn ci hè manera di gestisce rapidamente u settore di cumpunenti per a custruzzione di una applicazione nantu à questi ospiti, per esempiu, installà un set di strumenti supplementari o una carica di travagliu per Visual Studio. Dunque, avemu pigliatu a decisione di installà tutti i cumpunenti necessarii per custruisce l'applicazione in l'imagine Docker di custruzzione. Se necessariu, pudete cambià rapidamente solu u dockerfile è lanciate u pipeline per creà sta maghjina.

Da a teoria à l'azzione

In una creazione ideale di l'imaghjini di Docker in più tappe, l'ambiente per custruisce l'applicazione hè preparatu in u stessu script Dockerfile cum'è l'applicazione stessa hè custruita. Ma in u nostru casu, hè statu aghjuntu un ligame intermediu, à dì, u passu di creazione preliminare di una maghjina docker cù tuttu ciò chì hè necessariu per custruisce l'applicazione. Questu hè statu fattu perchè vulia utilizà a funzione di cache di docker per riduce u tempu di stallazione di tutte e dependenze.

Fighjemu i punti principali di u dockerfile script per creà sta maghjina.

Per creà l'imaghjini di e diverse versioni di u SO, pudete definisce un argumentu in u dockerfile per quale u numeru di versione hè passatu durante a custruzzione, è hè ancu a tag di l'imaghjini di basa.

Una lista cumpleta di e tag di l'imagine di Microsoft Windows Server pò esse truvata ccà.

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

Per automaticamente i cumandamenti in l'istruzzioni RUN in u dockerfile in u sistema operativu Windows sò eseguiti in a cunsola cmd.exe. Per a cunvenzione di scrive scripts è espansione a funziunalità di i cumandamenti utilizati, ridefiniremu a cunsola di esecuzione di cumandamenti in Powershell attraversu l'istruzzioni. SHELL.

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

U prossimu passu hè di installà u gestore di pacchetti di cioccolata è i pacchetti necessarii:

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'

Per installà pacchetti chì utilizanu chocolatey, pudete solu passà cum'è una lista, o installate unu à un tempu se avete bisognu di passà paràmetri unichi per ogni pacchettu. In a nostra situazione, avemu usatu un schedariu manifestu in u furmatu XML, chì cuntene una lista di pacchetti necessarii è i so paràmetri. U so cuntenutu pare cusì:

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

In seguitu, installemu l'ambiente di creazione di l'applicazioni, vale à dì, MS Build Tools 2019 - questa hè una versione ligera di Visual Studio 2019, chì cuntene l'inseme minimu di cumpunenti necessarii per a compilazione di codice.
Per travaglià cumplettamente cù u nostru prughjettu C ++, avemu bisognu di cumpunenti supplementari, vale à dì:

  • Carichi di travagliu C++ Strumenti
  • Toolset v141
  • Windows 10 SDK (10.0.17134.0)

Pudete installà un inseme allargatu di strumenti automaticamente utilizendu un schedariu di cunfigurazione in formatu JSON. Cuntenutu di u schedariu di cunfigurazione:

Una lista cumpleta di cumpunenti dispunibuli pò esse truvata nantu à u situ di documentazione 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"
  ]
}

U dockerfile esegue u script d'installazione, è per comodità, aghjunghjenu u percorsu à i fugliali eseguibili di strumenti di creazione à a variabile di l'ambiente. PATH. Hè ancu cunsigliatu di sguassà i fugliali è cartulari innecessarii per riduce a dimensione di l'imaghjini.

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)

In questa fase, a nostra maghjina per cumpilà l'applicazione C++ hè pronta, è pudemu prucede direttamente à creà un docker multi-stage build di l'applicazione.

Multi-stadi in azzione

Avemu aduprà l'imaghjini creatu cù tutti l'arnesi à bordu cum'è una maghjina di custruzzione. Cum'è in l'script dockerfile precedente, aghjunghjemu a capacità di specificà dinamicamente u numeru di versione / tag di l'imaghjini per facilità di reutilizazione di codice. Hè impurtante di aghjunghje una etichetta as builder à l'imaghjini di l'assemblea in l'istruzzioni FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Avà hè u tempu di custruisce l'applicazione. Tuttu quì hè abbastanza simplice: copià u codice fonte è tuttu ciò chì hè assuciatu cù questu, è principià u prucessu di compilazione.

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

L'ultima tappa di a creazione di l'imaghjini finali hè di specificà l'imaghjini di basa di l'applicazione, induve si trovanu tutti l'artefatti di compilazione è i schedarii di cunfigurazione. Per copià i fugliali compilati da l'imaghjini di l'assemblea intermediata, deve specificà u paràmetru --from=builder in l'istruzzioni COPY.

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

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

Avà tuttu ciò chì resta hè di aghjunghje e dipendenze necessarie per a nostra applicazione per travaglià è specificà u cumandamentu di lanciamentu attraversu l'istruzzioni ENTRYPOINT o CMD.

cunchiusioni

In questu articulu, aghju parlatu di cumu creà un ambiente di compilazione cumpletu per l'applicazioni C ++ in un containeru sottu Windows è cumu utilizà e capacità di docker multi-stage builds per creà l'imaghjini cumpletu di a nostra applicazione.

Source: www.habr.com

Add a comment