Docker etapa anitzeko erabiltzea Windows irudiak eraikitzeko

Kaixo guztioi! Nire izena Andrey da, eta Exness-en DevOps ingeniari gisa lan egiten dut garapen taldean. Nire jarduera nagusia Linux sistema eragilearen (aurrerantzean OS) pean docker-en aplikazioak eraikitzea, hedatzea eta eustea da. Duela ez asko jarduera berberak zituen zeregin bat nuen, baina proiektuaren helburuko sistema eragilea Windows Server eta C++ proiektu multzo bat zen. Niretzat, hau izan zen Windows OS pean docker edukiontziekin eta, oro har, C++ aplikazioekin egindako lehen interakzio estua. Horri esker, esperientzia interesgarria izan nuen eta Windows-en edukiontzien aplikazioen konplexutasun batzuk ezagutu nituen.

Docker etapa anitzeko erabiltzea Windows irudiak eraikitzeko

Artikulu honetan zein zailtasunei aurre egin behar izan nien eta nola konpontzea lortu nuen esan nahi dizuet. Espero dut hau lagungarria izatea zure egungo eta etorkizuneko erronketarako. Gozatu irakurtzen!

Zergatik edukiontziak?

Konpainiak lehendik duen azpiegitura du Hashicorp Nomad edukiontzi-orkestratzailerako eta erlazionatutako osagaietarako - Consul eta Vault. Hori dela eta, aplikazioen edukiontzia irtenbide osoa emateko metodo bateratu gisa aukeratu zen. Proiektuaren azpiegiturak Windows Server Core OS 1803 eta 1809 bertsioak dituzten docker ostalariak dituenez, beharrezkoa da docker irudien bertsio bereiziak eraikitzea 1803 eta 1809rako. 1803 bertsioan, garrantzitsua da gogoratzea build docker host-aren berrikuspen-zenbakia. Oinarrizko docker-irudiaren berrikuspen-zenbakiarekin eta irudi honetako edukiontzia abiaraziko den ostalariarekin bat egin behar du. 1809 bertsioak ez du horrelako eragozpenik. Gehiago irakur dezakezu Hemen.

Zergatik etapa anitzekoa?

Garapen-taldeko ingeniariek ez dute sarbiderik edo sarbide oso mugatua dute ostalariak eraikitzeko; ez dago ostalari horietan aplikazio bat eraikitzeko osagai multzoa azkar kudeatzeko modurik, adibidez, Visual Studio-rako tresna-multzo edo lan-karga gehigarri bat instalatu. Hori dela eta, aplikazioa eraikitzeko Docker irudian eraikitzeko beharrezko osagai guztiak instalatzeko erabakia hartu genuen. Beharrezkoa izanez gero, azkar alda dezakezu dockerfile soilik eta irudi hau sortzeko kanalizazioa abiarazi.

Teoriatik ekintzara

Docker-en fase anitzeko irudien eraikuntza ezin hobean, aplikazioa eraikitzeko ingurunea aplikazioa eraiki den Dockerfile script berean prestatzen da. Baina gure kasuan, tarteko esteka bat gehitu zen, hau da, aplikazioa eraikitzeko beharrezko guztiarekin docker-irudi bat aldez aurretik sortzeko urratsa. Hau egin zen, docker cache funtzioa erabili nahi nuelako dependentzia guztien instalazio-denbora murrizteko.

Ikus ditzagun irudi hau sortzeko dockerfile script-aren puntu nagusiak.

OS bertsio ezberdinen irudiak sortzeko, dockerfilean argumentu bat defini dezakezu, zeinaren bidez bertsio-zenbakia pasatzen den eraikitzean, eta oinarrizko irudiaren etiketa ere bada.

Microsoft Windows Server-en irudi-etiketen zerrenda osoa aurki daiteke Hemen.

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

Lehenespenez, argibideetako komandoak RUN Windows OS-eko dockerfile barruan cmd.exe kontsolan exekutatzen dira. Scriptak idazteko eta erabilitako komandoen funtzionaltasuna zabaltzeko erosotasunerako, Powershell-en komandoak exekutatzeko kontsola birdefinituko dugu instrukzioaren bidez. SHELL.

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

Hurrengo urratsa chocolatey paketeen kudeatzailea eta beharrezko paketeak instalatzea da:

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'

Chocolate erabiliz paketeak instalatzeko, zerrenda gisa pasa ditzakezu edo banan-banan instalatu pakete bakoitzerako parametro bakarrak pasa behar badituzu. Gure egoeran, manifestu fitxategi bat erabili dugu XML formatuan, beharrezko paketeen zerrenda eta haien parametroak dituena. Bere edukiak honelakoak dira:

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

Ondoren, aplikazioak eraikitzeko ingurunea instalatzen dugu, hots, MS Build Tools 2019 - hau Visual Studio 2019-ren bertsio arina da, eta kodea konpilatzeko beharrezkoa den gutxieneko osagai multzoa dauka.
Gure C++ proiektuarekin guztiz lan egiteko, osagai osagarriak beharko ditugu, hau da:

  • Lan-karga C++ tresnak
  • Tresna multzoa v141
  • Windows 10 SDK (10.0.17134.0)

Tresna multzo hedatu bat automatikoki instala dezakezu JSON formatuan konfigurazio fitxategi bat erabiliz. Konfigurazio fitxategiaren edukia:

Eskuragarri dauden osagaien zerrenda osoa dokumentazio gunean aurki daiteke 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-k instalazio-scripta exekutatzen du, eta erosotasunerako, eraikuntza-tresnen fitxategi exekutagarrien bidea gehitzen dio ingurune-aldagaiari. PATH. Era berean, komeni da beharrezkoa ez diren fitxategiak eta direktorioak kentzea irudiaren tamaina murrizteko.

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)

Fase honetan, C++ aplikazioa konpilatzeko gure irudia prest dago, eta zuzenean aplikazioaren docker-etapa anitzeko eraikuntza bat sor dezakegu.

Ekintza anitzeko etapa

Sortutako irudia taulako tresna guztiekin erabiliko dugu eraikitzeko irudi gisa. Aurreko dockerfile script-ean bezala, bertsio-zenbakia/irudi etiketa dinamikoki zehazteko gaitasuna gehituko dugu, kodea berrerabiltzeko erraztasunerako. Garrantzitsua da etiketa bat gehitzea as builder argibideetako muntaketa-irudiari FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Orain aplikazioa eraikitzeko garaia da. Hemen dena nahiko erraza da: kopiatu iturburu-kodea eta harekin lotutako guztia, eta hasi konpilazio prozesua.

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

Azken irudia sortzeko azken fasea aplikazioaren oinarrizko irudia zehaztea da, non konpilazio artefaktu guztiak eta konfigurazio fitxategiak kokatuko diren. Konpilatutako fitxategiak tarteko muntaia-iruditik kopiatzeko, parametroa zehaztu behar duzu --from=builder argibideetan COPY.

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

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

Orain geratzen dena da gure aplikazioak funtziona dezan beharrezko menpekotasunak gehitzea eta argibideen bidez abiarazteko komandoa zehaztea ENTRYPOINT edo CMD.

Ondorioa

Artikulu honetan, Windows edukiontzi baten barruan C++ aplikazioetarako konpilazio-ingurune oso bat sortzeko moduari buruz hitz egin nuen eta nola erabili docker etapa anitzeko eraikitzeen gaitasunak gure aplikazioaren erabateko irudiak sortzeko.

Iturria: www.habr.com

Gehitu iruzkin berria