Sèvi ak docker plizyè etap pou konstwi imaj fenèt yo

Bonjou tout moun! Non mwen se Andrey, epi mwen travay kòm yon enjenyè DevOps nan Exness nan ekip devlopman an. Aktivite prensipal mwen an gen rapò ak bati, deplwaye ak sipòte aplikasyon nan Docker anba sistèm operasyon Linux (ki refere yo kòm OS la). Pa gen lontan mwen te gen yon travay ak aktivite yo menm, men eksplwatasyon an sib nan pwojè a te Windows Server ak yon seri C++ pwojè. Pou mwen, sa a te premye entèraksyon sere ak resipyan Docker anba Windows OS epi, an jeneral, ak aplikasyon C++. Mèsi a sa a, mwen te gen yon eksperyans enteresan epi mwen te aprann sou kèk nan sibtilite ki genyen nan aplikasyon conteneur nan Windows.

Sèvi ak docker plizyè etap pou konstwi imaj fenèt yo

Nan atik sa a mwen vle di ou ki difikilte mwen te gen pou fè fas ak ki jan mwen jere yo rezoud yo. Mwen espere ke sa a itil pou defi aktyèl ak pwochen ou yo. Jwi lekti!

Poukisa kontenè?

Konpayi an gen enfrastrikti ki egziste deja pou orchestrator veso Hashicorp Nomad ak konpozan ki gen rapò - Consul ak Vault. Se poutèt sa, yo te chwazi kontenèrizasyon aplikasyon kòm yon metòd inifye pou delivre yon solisyon en. Piske enfrastrikti pwojè a gen lame docker ak vèsyon Windows Server Core OS 1803 ak 1809, li nesesè pou konstwi vèsyon separe imaj docker pou 1803 ak 1809. Nan vèsyon 1803, li enpòtan sonje nimewo revizyon build docker host la. dwe matche ak nimewo revizyon imaj docker baz la ak lame kote veso ki soti nan imaj sa a pral lanse. Vèsyon 1809 pa gen okenn dezavantaj sa yo. Ou ka li plis isit la.

Poukisa plizyè etap?

Enjenyè ekip devlopman yo pa gen aksè oswa anpil aksè limite pou konstwi hôtes; pa gen okenn fason byen vit jere seri konpozan pou bati yon aplikasyon sou hôtes sa yo, pou egzanp, enstale yon seri zouti adisyonèl oswa kantite travay pou Visual Studio. Se poutèt sa, nou te pran desizyon an enstale tout eleman ki nesesè yo bati aplikasyon an nan imaj la bati Docker. Si sa nesesè, ou ka byen vit chanje sèlman dockerfile a epi lanse tiyo a pou kreye imaj sa a.

Soti nan teyori nan aksyon

Nan yon konsepsyon imaj milti-etap Docker ideyal, anviwònman an pou bati aplikasyon an prepare nan menm script Dockerfile kòm aplikasyon an li menm ki bati. Men, nan ka nou an, yo te ajoute yon lyen entèmedyè, sètadi, etap la nan preliminè kreye yon imaj Docker ak tout bagay ki nesesè yo bati aplikasyon an. Sa a te fè paske mwen te vle sèvi ak karakteristik nan kachèt Docker diminye tan an enstalasyon nan tout depandans.

Ann gade pwen prensipal yo nan script dockerfile pou kreye imaj sa a.

Pou kreye imaj nan vèsyon OS diferan, ou ka defini yon agiman nan dockerfile la nan ki nimewo vèsyon an pase pandan bati a, epi li se tou tag nan imaj la baz.

Ou ka jwenn yon lis konplè sou etikèt imaj Microsoft Windows Server isit la.

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

Pa default kòmandman yo nan enstriksyon yo RUN andedan dockerfile sou Windows OS yo egzekite nan konsole cmd.exe. Pou konvenyans pou ekri scripts ak agrandi fonksyonalite kòmandman yo itilize yo, nou pral redefini konsole egzekisyon kòmand nan Powershell atravè enstriksyon an. SHELL.

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

Pwochen etap la se enstale manadjè pake chokola ak pakè ki nesesè yo:

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'

Pou enstale pakè lè l sèvi avèk chokola, ou ka tou senpleman pase yo kòm yon lis, oswa enstale yo youn nan yon moman si ou bezwen pase paramèt inik pou chak pake. Nan sitiyasyon nou an, nou te itilize yon dosye manifest nan fòma XML, ki gen yon lis pakè obligatwa ak paramèt yo. Kontni li yo sanble sa a:

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

Apre sa, nou enstale anviwònman bati aplikasyon an, sètadi, MS Build Tools 2019 - sa a se yon vèsyon ki lejè nan Visual Studio 2019, ki gen seri minimòm ki nesesè nan eleman pou konpile kòd.
Pou travay konplètman ak pwojè C++ nou an, nou pral bezwen eleman adisyonèl, sètadi:

  • Travay C++ zouti
  • Toolset v141
  • Windows 10 SDK (10.0.17134.0)

Ou ka enstale yon seri zouti pwolonje otomatikman lè l sèvi avèk yon fichye konfigirasyon nan fòma JSON. Kontni fichye konfigirasyon:

Ou ka jwenn yon lis konplè sou eleman ki disponib sou sit dokimantasyon an Microsoft vizyèl 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 la kouri script enstalasyon an, epi pou konvenyans, ajoute chemen an nan zouti yo bati dosye ègzèkutabl nan varyab anviwònman an. PATH. Li se tou rekòmande yo retire dosye ki pa nesesè ak repèrtwar diminye gwosè a nan imaj la.

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)

Nan etap sa a, imaj nou an pou konpile aplikasyon C++ a pare, epi nou ka kontinye dirèkteman nan kreye yon docker plizyè etap bati nan aplikasyon an.

Plizyè etap nan aksyon

Nou pral sèvi ak imaj la kreye ak tout zouti yo sou tablo kòm yon imaj bati. Kòm nan script dockerfile anvan an, nou pral ajoute kapasite nan dinamikman presize nimewo vèsyon an / tag imaj la pou fasilite kòd reitilize. Li enpòtan pou ajoute yon etikèt as builder nan imaj la asanble nan enstriksyon yo FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Koulye a, li lè yo bati aplikasyon an. Tout bagay isit la se byen senp: kopye kòd sous la ak tout bagay ki asosye ak li, epi kòmanse pwosesis konpilasyon an.

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

Etap final la nan kreye imaj final la se presize imaj de baz aplikasyon an, kote tout zafè konpilasyon ak dosye konfigirasyon yo pral lokalize. Pou kopye fichye konpile ki soti nan imaj asanble entèmedyè a, ou dwe presize paramèt la --from=builder nan enstriksyon yo COPY.

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

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

Koulye a, tout sa ki rete se ajoute depandans ki nesesè yo pou aplikasyon nou an travay epi presize lòd lansman an atravè enstriksyon yo ENTRYPOINT oswa CMD.

Konklizyon

Nan atik sa a, mwen te pale sou ki jan yo kreye yon anviwònman konpilasyon konplè pou aplikasyon C++ andedan yon veso anba Windows ak ki jan yo sèvi ak kapasite yo nan docker plizyè etap bati yo kreye imaj konplè nan aplikasyon nou an.

Sous: www.habr.com

Add nouvo kòmantè