Kutumia docker ya hatua nyingi kuunda picha za windows

Salaam wote! Jina langu ni Andrey, na ninafanya kazi kama mhandisi wa DevOps katika Exness katika timu ya maendeleo. Shughuli yangu kuu inahusiana na kujenga, kupeleka na kuunga mkono programu kwenye docker chini ya mfumo wa uendeshaji wa Linux (hapa inajulikana kama OS). Sio muda mrefu uliopita nilikuwa na kazi na shughuli sawa, lakini OS inayolengwa ya mradi ilikuwa Windows Server na seti ya miradi ya C ++. Kwangu, huu ulikuwa mwingiliano wa kwanza wa karibu na vyombo vya docker chini ya Windows OS na, kwa ujumla, na programu za C ++. Shukrani kwa hili, nilikuwa na uzoefu wa kufurahisha na nilijifunza juu ya ugumu fulani wa kuweka programu kwenye Windows.

Kutumia docker ya hatua nyingi kuunda picha za windows

Katika nakala hii nataka kukuambia ni shida gani nililazimika kukabiliana nazo na jinsi nilivyoweza kuzitatua. Natumai hii ni msaada kwa changamoto zako za sasa na zijazo. Furahia kusoma!

Kwa nini vyombo?

Kampuni ina miundombinu iliyopo kwa ajili ya orchestrator ya vyombo vya Hashicorp Nomad na vipengele vinavyohusiana - Consul na Vault. Kwa hivyo, uwekaji kontena wa programu ulichaguliwa kama njia ya umoja ya kutoa suluhisho kamili. Kwa kuwa miundombinu ya mradi ina majeshi ya docker na matoleo ya Windows Server Core OS 1803 na 1809, ni muhimu kujenga matoleo tofauti ya picha za docker kwa 1803 na 1809. Katika toleo la 1803, ni muhimu kukumbuka kuwa nambari ya marekebisho ya jeshi la kujenga docker. lazima ilingane na nambari ya marekebisho ya picha ya kituo cha msingi na seva pangishi ambapo chombo kutoka kwa picha hii kitazinduliwa. Toleo la 1809 halina shida kama hiyo. Unaweza kusoma zaidi hapa.

Kwa nini ngazi nyingi?

Wahandisi wa timu za maendeleo hawana au ufikiaji mdogo sana wa kuunda wapangishaji; hakuna njia ya kudhibiti kwa haraka seti ya vipengee vya kuunda programu kwenye wapangishi hawa, kwa mfano, kusakinisha zana ya ziada au mzigo wa kazi kwa Visual Studio. Kwa hivyo, tulifanya uamuzi wa kusanikisha vifaa vyote muhimu ili kuunda programu kwenye picha ya Docker. Ikiwa ni lazima, unaweza kubadilisha faili ya docker haraka na kuzindua bomba la kuunda picha hii.

Kutoka kwa nadharia hadi vitendo

Katika muundo bora wa picha wa hatua nyingi wa Docker, mazingira ya kuunda programu hutayarishwa kwa hati sawa ya Dockerfile kama programu yenyewe inavyoundwa. Lakini kwa upande wetu, kiunga cha kati kiliongezwa, ambayo ni, hatua ya awali ya kuunda picha ya kizimbani na kila kitu muhimu ili kuunda programu. Hii ilifanywa kwa sababu nilitaka kutumia kipengee cha kashe cha docker kupunguza wakati wa usakinishaji wa utegemezi wote.

Wacha tuangalie vidokezo kuu vya hati ya dockerfile ya kuunda picha hii.

Ili kuunda picha za matoleo tofauti ya OS, unaweza kufafanua hoja katika faili ya docker ambayo nambari ya toleo hupitishwa wakati wa kujenga, na pia ni tag ya picha ya msingi.

Orodha kamili ya vitambulisho vya picha vya Microsoft Windows Server inaweza kupatikana hapa.

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

Kwa chaguo-msingi amri katika maagizo RUN ndani ya faili ya docker kwenye Windows OS wanatekelezwa kwenye koni ya cmd.exe. Kwa urahisi wa kuandika hati na kupanua utendaji wa amri zinazotumiwa, tutafafanua upya kiweko cha utekelezaji wa amri katika Powershell kupitia maagizo. SHELL.

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

Hatua inayofuata ni kusanikisha meneja wa kifurushi cha chokoleti na vifurushi muhimu:

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'

Ili kusakinisha vifurushi kwa kutumia chokoleti, unaweza kuzipitisha tu kama orodha, au kuzisakinisha moja baada ya nyingine ikiwa unahitaji kupitisha vigezo vya kipekee kwa kila kifurushi. Katika hali yetu, tulitumia faili ya maelezo katika umbizo la XML, ambalo lina orodha ya vifurushi vinavyohitajika na vigezo vyake. Yaliyomo ndani yake yanaonekana kama hii:

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

Ifuatayo, tunasanikisha mazingira ya uundaji wa programu, ambayo ni, Zana za Kuunda za MS 2019 - hili ni toleo jepesi la Visual Studio 2019, ambalo lina seti ya chini inayohitajika ya vifaa vya kuunda nambari.
Ili kufanya kazi kikamilifu na mradi wetu wa C++, tutahitaji vifaa vya ziada, ambavyo ni:

  • Zana za C++ za mzigo wa kazi
  • Seti ya zana v141
  • Windows 10 SDK (10.0.17134.0)

Unaweza kusakinisha seti iliyopanuliwa ya zana kiotomatiki kwa kutumia faili ya usanidi katika umbizo la JSON. Yaliyomo kwenye faili ya usanidi:

Orodha kamili ya vipengele vinavyopatikana vinaweza kupatikana kwenye tovuti ya nyaraka 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 inaendesha hati ya usakinishaji, na kwa urahisi, inaongeza njia ya zana za ujenzi faili zinazoweza kutekelezeka kwa utofauti wa mazingira. PATH. Inashauriwa pia kuondoa faili na saraka zisizo za lazima ili kupunguza saizi ya picha.

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)

Katika hatua hii, picha yetu ya kuunda programu ya C++ iko tayari, na tunaweza kuendelea moja kwa moja kuunda muundo wa hatua nyingi wa programu.

Hatua nyingi katika hatua

Tutatumia picha iliyoundwa na zana zote kwenye ubao kama taswira ya ujenzi. Kama ilivyo katika hati ya awali ya faili ya docker, tutaongeza uwezo wa kubainisha nambari ya toleo/lebo ya picha kwa urahisi wa kutumia tena msimbo. Ni muhimu kuongeza lebo as builder kwa picha ya kusanyiko katika maagizo FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Sasa ni wakati wa kuunda programu. Kila kitu hapa ni rahisi sana: nakili msimbo wa chanzo na kila kitu kinachohusiana nayo, na anza mchakato wa ujumuishaji.

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

Hatua ya mwisho ya kuunda picha ya mwisho ni kutaja picha ya msingi ya programu, ambapo mabaki yote ya mkusanyiko na faili za usanidi zitapatikana. Ili kunakili faili zilizokusanywa kutoka kwa picha ya mkutano wa kati, lazima ueleze parameter --from=builder katika maagizo COPY.

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

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

Sasa kilichobaki ni kuongeza tegemezi muhimu kwa programu yetu kufanya kazi na kutaja amri ya uzinduzi kupitia maagizo ENTRYPOINT au CMD.

Hitimisho

Katika nakala hii, nilizungumza juu ya jinsi ya kuunda mazingira kamili ya ujumuishaji wa programu za C++ ndani ya kontena chini ya Windows na jinsi ya kutumia uwezo wa ujenzi wa hatua nyingi wa docker kuunda picha kamili za programu yetu.

Chanzo: mapenzi.com

Kuongeza maoni