Amfani da docker Multi-stage don gina hotunan windows

Sannu duka! Sunana Andrey, kuma ina aiki a matsayin injiniyan DevOps a Exness a cikin ƙungiyar ci gaba. Babban aikina yana da alaƙa da ginawa, turawa da tallafawa aikace-aikace a cikin docker ƙarƙashin tsarin aiki na Linux (wanda ake kira OS). Ba da daɗewa ba ina da ɗawainiya tare da ayyuka iri ɗaya, amma manufa OS na aikin shine Windows Server da saitin ayyukan C ++. A gare ni, wannan ita ce ma'amala ta farko ta kusa da kwantenan docker a ƙarƙashin Windows OS kuma, gabaɗaya, tare da aikace-aikacen C++. Godiya ga wannan, na sami gogewa mai ban sha'awa kuma na koyi game da wasu ƙaƙƙarfan ƙaƙƙarfan aikace-aikacen kwantena a cikin Windows.

Amfani da docker Multi-stage don gina hotunan windows

A cikin wannan labarin, ina so in gaya muku irin matsalolin da na fuskanta da kuma yadda na yi nasarar magance su. Ina fatan wannan zai taimaka wa kalubalenku na yanzu da na gaba. Ji daɗin karatu!

Me yasa kwantena?

Kamfanin yana da abubuwan more rayuwa na Hashicorp Nomad mawaƙin kwantena da abubuwan da ke da alaƙa - Consul da Vault. Don haka, an zaɓi kwantena aikace-aikacen azaman hanyar haɗin kai don isar da cikakkiyar bayani. Tun da kayan aikin ya ƙunshi runduna docker tare da nau'ikan Windows Server Core OS 1803 da 1809, wajibi ne a gina nau'ikan hotunan docker daban-daban don 1803 da 1809. A cikin sigar 1803, yana da mahimmanci a tuna cewa lambar bita na mai masaukin ginin docker dole ne ya dace da lambar bita na hoton docker na tushe da kuma rundunar inda za a ƙaddamar da akwati daga wannan hoton. Version 1809 ba shi da irin wannan drawback. Kuna iya karantawa a nan.

Me yasa matakai masu yawa?

Injiniyoyin ƙungiyar haɓaka ba su da ko iyakacin damar gina runduna; babu wata hanya da za a hanzarta sarrafa saitin abubuwan da aka haɗa don gina aikace-aikace akan waɗannan runduna, misali, shigar da ƙarin kayan aiki ko kayan aiki don Kayayyakin Kayayyakin Hulɗa. Saboda haka, mun yanke shawarar shigar da duk abubuwan da suka dace don gina aikace-aikacen a cikin ginin Docker. Idan ya cancanta, zaku iya canza fayil ɗin docker da sauri kuma ku ƙaddamar da bututun don ƙirƙirar wannan hoton.

Daga ka'idar zuwa aiki

A cikin kyakkyawan ginin hoto mai matakai da yawa na Docker, yanayin gina aikace-aikacen an shirya shi a cikin rubutun Dockerfile iri ɗaya kamar yadda aka gina aikace-aikacen kanta. Amma a cikin yanayinmu, an ƙara hanyar haɗin gwiwa, wato, matakin farko na ƙirƙirar hoton docker tare da duk abin da ya dace don gina aikace-aikacen. Anyi wannan saboda ina so in yi amfani da fasalin cache na docker don rage lokacin shigarwa na duk abin dogara.

Bari mu kalli mahimman abubuwan rubutun dockerfile don ƙirƙirar wannan hoton.

Don ƙirƙirar hotunan nau'ikan OS daban-daban, zaku iya ayyana hujja a cikin dockerfile ta inda lambar sigar ke wucewa yayin ginin, kuma ita ce alamar hoton tushe.

Ana iya samun cikakken jerin alamun hoton Microsoft Windows Server a nan.

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

Ta hanyar tsoho umarni a cikin umarnin RUN A cikin dockerfile akan Windows OS ana aiwatar da su a cikin na'ura mai kwakwalwa ta cmd.exe. Don saukaka rubutun rubutun da fadada ayyukan umarnin da aka yi amfani da su, za mu sake fasalta na'urar aiwatar da umarni a cikin Powershell ta hanyar umarnin. SHELL.

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

Mataki na gaba shine shigar da manajan kunshin cakulan da fakitin da suka dace:

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'

Don shigar da fakiti ta amfani da cakulan, zaku iya kawai wuce su azaman jeri, ko shigar da su ɗaya bayan ɗaya idan kuna buƙatar wuce sigogi na musamman ga kowane fakitin. A halin da muke ciki, mun yi amfani da fayil mai bayyanawa a cikin tsarin XML, wanda ya ƙunshi jerin fakitin da ake buƙata da sigoginsu. Abubuwan da ke cikinsa sun yi kama da haka:

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

Bayan haka, muna shigar da yanayin gina aikace-aikacen, wato, MS Build Tools 2019 - wannan sigar 2019 ce mai nauyi, wacce ta ƙunshi mafi ƙarancin abubuwan da ake buƙata don haɗa lamba.
Don cikakken aiki tare da aikin mu na C++, za mu buƙaci ƙarin abubuwa, wato:

  • Kayan aiki na C++
  • Kayan aiki v141
  • Windows 10 SDK (10.0.17134.0)

Kuna iya shigar da ƙarin saitin kayan aikin ta atomatik ta amfani da fayil ɗin sanyi a tsarin JSON. Abubuwan da ke cikin tsarin saiti:

Za'a iya samun cikakken jerin abubuwan da aka samu akan rukunin takaddun 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 yana gudanar da rubutun shigarwa, kuma don dacewa, yana ƙara hanyar gina kayan aikin fayilolin aiwatarwa zuwa canjin yanayi. PATH. Hakanan yana da kyau a cire fayiloli da kundayen adireshi marasa amfani don rage girman hoton.

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)

A wannan matakin, hotonmu don haɗa aikace-aikacen C++ ya shirya, kuma za mu iya ci gaba kai tsaye zuwa ƙirƙirar ginin aikace-aikacen da yawa matakai.

Multi-mataki a cikin aiki

Za mu yi amfani da hoton da aka ƙirƙira tare da duk kayan aikin da ke kan jirgin azaman hoton gini. Kamar yadda yake a cikin rubutun dockerfile na baya, za mu ƙara ikon tantance lambar sigar/tambarin hoto don sauƙin sake amfani da lambar. Yana da mahimmanci don ƙara lakabi as builder zuwa hoton taro a cikin umarnin FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Yanzu lokaci yayi da za a gina aikace-aikacen. Komai anan abu ne mai sauqi: kwafi lambar tushe da duk abin da ke da alaƙa da shi, sannan fara tsarin tattarawa.

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

Mataki na ƙarshe na ƙirƙirar hoto na ƙarshe shine ƙayyade ainihin hoton aikace-aikacen, inda duk kayan tarihi da fayilolin daidaitawa za su kasance. Don kwafe fayilolin da aka haɗe daga hoton taro na tsaka-tsaki, dole ne ku saka ma'aunin --from=builder a cikin umarnin COPY.

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

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

Yanzu abin da ya rage shi ne ƙara abubuwan da suka dace don aikace-aikacenmu don yin aiki da kuma ƙayyade umarnin ƙaddamarwa ta hanyar umarnin ENTRYPOINT ko CMD.

ƙarshe

A cikin wannan labarin, na yi magana game da yadda ake ƙirƙirar yanayi mai cikakken tsari don aikace-aikacen C ++ a cikin akwati a ƙarƙashin Windows da kuma yadda ake amfani da damar docker multi-stage gini don ƙirƙirar cikakkun hotuna na aikace-aikacenmu.

source: www.habr.com

Add a comment