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. Prensipal konsantrasyon mwen se bati, deplwaye, epi kenbe aplikasyon Docker k ap fonksyone sou sistèm operasyon an. Linux (ki pral rele apre sa OS). Sa pa gen lontan, mwen te gen yon travay ak menm aktivite yo, men OS sib pwojè a te vin tounen Windows Server и набор проектов на C++. Для меня это было первое плотное взаимодействие c docker контейнерами под ОС Windows и в целом с приложениями на C++. Благодаря этому я получил интересный опыт и узнал о некоторых тонкостях контейнеризации приложений в ОС 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è?

В компании есть существующая инфраструктура оркестратора контейнеров Hashicorp Nomad и связанных компонентов — Consul и Vault. Поэтому контейнеризация приложений была выбрана как унифицированный метод доставки готового решения. Так как в инфраструктуре проекта имеются docker-хосты с версиями ОС Windows Server Core 1803 и 1809, то необходимо собирать отдельно версии docker-образов для 1803 и 1809. В версии 1803 важно помнить о том, что номер ревизии сборочного docker-хоста должен совпадать с номером ревизии базового docker-образа и хоста, где контейнер из этого образа будет запущен. Версия 1809 лишена такого недостатка. Подробнее можно прочитать 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.

Полный список тэгов образов Microsoft Windows Server ka jwenn 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 внутри dockerfile в ОС Windows выполняются в консоли cmd.exe. Для удобства написания скриптов и расширения функционала используемых команд переопределим консоль исполнения команд на Powershell через инструкцию 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

В этой статье я рассказал, как создать полноценную среду компиляции C++ приложений внутри контейнера под Windows и о том, как использовать возможности docker multi-stage сборок для создания полноценных образов нашего приложения.

Sous: www.habr.com

Achte hosting serye pou sit ki gen pwoteksyon DDoS, sèvè VPS VDS 🔥 Achte yon hébergement sit entènèt serye ak pwoteksyon DDoS, sèvè VPS VDS | ProHoster