విండోస్ చిత్రాలను రూపొందించడానికి డాకర్ బహుళ-దశలను ఉపయోగించడం

అందరికి వందనాలు! నా పేరు ఆండ్రీ, నేను డెవలప్‌మెంట్ టీమ్‌లో Exnessలో DevOps ఇంజనీర్‌గా పని చేస్తున్నాను. నా ప్రధాన కార్యకలాపం Linux ఆపరేటింగ్ సిస్టమ్‌లో (ఇకపై OSగా సూచిస్తారు) డాకర్‌లో అప్లికేషన్‌లను రూపొందించడం, అమలు చేయడం మరియు మద్దతు ఇవ్వడానికి సంబంధించినది. కొంతకాలం క్రితం నేను అదే కార్యకలాపాలతో ఒక పనిని కలిగి ఉన్నాను, కానీ ప్రాజెక్ట్ యొక్క లక్ష్య OS Windows సర్వర్ మరియు C++ ప్రాజెక్ట్‌ల సమితి. నాకు, ఇది Windows OS క్రింద డాకర్ కంటైనర్‌లతో మరియు సాధారణంగా, C++ అప్లికేషన్‌లతో మొదటి సన్నిహిత పరస్పర చర్య. దీనికి ధన్యవాదాలు, నేను ఆసక్తికరమైన అనుభవాన్ని పొందాను మరియు విండోస్‌లో అప్లికేషన్‌లను కంటైనర్‌గా మార్చడంలో కొన్ని చిక్కుల గురించి తెలుసుకున్నాను.

విండోస్ చిత్రాలను రూపొందించడానికి డాకర్ బహుళ-దశలను ఉపయోగించడం

ఈ వ్యాసంలో నేను ఏ ఇబ్బందులను ఎదుర్కొన్నాను మరియు వాటిని ఎలా పరిష్కరించగలిగాను అని నేను మీకు చెప్పాలనుకుంటున్నాను. మీ ప్రస్తుత మరియు భవిష్యత్తు సవాళ్లకు ఇది సహాయకరంగా ఉంటుందని నేను ఆశిస్తున్నాను. చదివి ఆనందించండి!

కంటైనర్లు ఎందుకు?

కంపెనీ Hashicorp Nomad కంటైనర్ ఆర్కెస్ట్రేటర్ మరియు సంబంధిత భాగాలు - కాన్సుల్ మరియు వాల్ట్ కోసం ఇప్పటికే ఉన్న మౌలిక సదుపాయాలను కలిగి ఉంది. అందువల్ల, పూర్తి పరిష్కారాన్ని అందించడానికి అప్లికేషన్ కంటైనర్‌ను ఏకీకృత పద్ధతిగా ఎంచుకున్నారు. ప్రాజెక్ట్ ఇన్‌ఫ్రాస్ట్రక్చర్ విండోస్ సర్వర్ కోర్ OS వెర్షన్‌లు 1803 మరియు 1809తో డాకర్ హోస్ట్‌లను కలిగి ఉన్నందున, 1803 మరియు 1809 కోసం డాకర్ ఇమేజ్‌ల యొక్క ప్రత్యేక వెర్షన్‌లను రూపొందించడం అవసరం. వెర్షన్ 1803లో, బిల్డ్ డాకర్ హోస్ట్ యొక్క రివిజన్ నంబర్ గుర్తుంచుకోవడం ముఖ్యం. తప్పనిసరిగా బేస్ డాకర్ చిత్రం యొక్క పునర్విమర్శ సంఖ్య మరియు ఈ చిత్రం నుండి కంటైనర్ ప్రారంభించబడే హోస్ట్‌తో సరిపోలాలి. వెర్షన్ 1809లో అలాంటి లోపం లేదు. మీరు మరింత చదవగలరు ఇక్కడ.

ఎందుకు బహుళ దశలు?

డెవలప్‌మెంట్ టీమ్ ఇంజనీర్‌లకు హోస్ట్‌లను రూపొందించడానికి లేదా చాలా పరిమిత యాక్సెస్ లేదు; ఈ హోస్ట్‌లలో అప్లికేషన్‌ను రూపొందించడానికి కాంపోనెంట్‌ల సెట్‌ను త్వరగా నిర్వహించడానికి మార్గం లేదు, ఉదాహరణకు, విజువల్ స్టూడియో కోసం అదనపు టూల్‌సెట్ లేదా వర్క్‌లోడ్‌ని ఇన్‌స్టాల్ చేయండి. అందువల్ల, అప్లికేషన్‌ను బిల్డ్ డాకర్ ఇమేజ్‌లో రూపొందించడానికి అవసరమైన అన్ని భాగాలను ఇన్‌స్టాల్ చేయాలని మేము నిర్ణయం తీసుకున్నాము. అవసరమైతే, మీరు త్వరగా డాకర్‌ఫైల్‌ను మాత్రమే మార్చవచ్చు మరియు ఈ చిత్రాన్ని రూపొందించడానికి పైప్‌లైన్‌ను ప్రారంభించవచ్చు.

సిద్ధాంతం నుండి చర్య వరకు

ఆదర్శవంతమైన డాకర్ మల్టీ-స్టేజ్ ఇమేజ్ బిల్డ్‌లో, అప్లికేషన్‌ను రూపొందించడానికి పర్యావరణం అప్లికేషన్‌ను రూపొందించిన అదే డాకర్‌ఫైల్ స్క్రిప్ట్‌లో తయారు చేయబడుతుంది. కానీ మా విషయంలో, ఇంటర్మీడియట్ లింక్ జోడించబడింది, అవి అప్లికేషన్‌ను రూపొందించడానికి అవసరమైన ప్రతిదానితో డాకర్ చిత్రాన్ని రూపొందించే ప్రాథమిక దశ. నేను అన్ని డిపెండెన్సీల ఇన్‌స్టాలేషన్ సమయాన్ని తగ్గించడానికి డాకర్ కాష్ ఫీచర్‌ని ఉపయోగించాలనుకున్నాను కాబట్టి ఇది జరిగింది.

ఈ చిత్రాన్ని రూపొందించడానికి డాకర్‌ఫైల్ స్క్రిప్ట్‌లోని ప్రధాన అంశాలను చూద్దాం.

విభిన్న OS సంస్కరణల చిత్రాలను రూపొందించడానికి, మీరు డాకర్‌ఫైల్‌లో ఆర్గ్యుమెంట్‌ని నిర్వచించవచ్చు, దీని ద్వారా బిల్డ్ సమయంలో వెర్షన్ నంబర్ పాస్ చేయబడుతుంది మరియు ఇది బేస్ ఇమేజ్ యొక్క ట్యాగ్ కూడా.

మైక్రోసాఫ్ట్ విండోస్ సర్వర్ ఇమేజ్ ట్యాగ్‌ల పూర్తి జాబితాను కనుగొనవచ్చు ఇక్కడ.

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

డిఫాల్ట్‌గా సూచనలలోని ఆదేశాలు RUN Windows OSలోని డాకర్‌ఫైల్ లోపల అవి cmd.exe కన్సోల్‌లో అమలు చేయబడతాయి. స్క్రిప్ట్‌లను వ్రాసే సౌలభ్యం కోసం మరియు ఉపయోగించిన ఆదేశాల కార్యాచరణను విస్తరించడం కోసం, మేము సూచనల ద్వారా పవర్‌షెల్‌లోని కమాండ్ ఎగ్జిక్యూషన్ కన్సోల్‌ను పునర్నిర్వచిస్తాము. SHELL.

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

చాక్లెట్ ప్యాకేజీ మేనేజర్ మరియు అవసరమైన ప్యాకేజీలను ఇన్‌స్టాల్ చేయడం తదుపరి దశ:

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'

చాక్లెట్‌ని ఉపయోగించి ప్యాకేజీలను ఇన్‌స్టాల్ చేయడానికి, మీరు వాటిని జాబితాగా పాస్ చేయవచ్చు లేదా మీరు ప్రతి ప్యాకేజీకి ప్రత్యేకమైన పారామితులను పాస్ చేయవలసి వస్తే వాటిని ఒక్కొక్కటిగా ఇన్‌స్టాల్ చేయవచ్చు. మా పరిస్థితిలో, మేము XML ఫార్మాట్‌లో మానిఫెస్ట్ ఫైల్‌ని ఉపయోగించాము, ఇందులో అవసరమైన ప్యాకేజీలు మరియు వాటి పారామితుల జాబితా ఉంటుంది. దాని కంటెంట్‌లు ఇలా ఉన్నాయి:

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

తర్వాత, మేము అప్లికేషన్ బిల్డ్ ఎన్విరాన్‌మెంట్‌ని ఇన్‌స్టాల్ చేస్తాము, అవి, MS బిల్డ్ టూల్స్ 2019 - ఇది విజువల్ స్టూడియో 2019 యొక్క తేలికపాటి వెర్షన్, ఇది కోడ్ కంపైల్ చేయడానికి అవసరమైన కనీస భాగాల సెట్‌ను కలిగి ఉంటుంది.
మా C++ ప్రాజెక్ట్‌తో పూర్తిగా పని చేయడానికి, మాకు అదనపు భాగాలు అవసరం, అవి:

  • పనిభారం C++ సాధనాలు
  • టూల్‌సెట్ v141
  • Windows 10 SDK (10.0.17134.0)

మీరు JSON ఫార్మాట్‌లో కాన్ఫిగరేషన్ ఫైల్‌ను ఉపయోగించి స్వయంచాలకంగా విస్తరించిన సాధనాల సెట్‌ను ఇన్‌స్టాల్ చేయవచ్చు. కాన్ఫిగరేషన్ ఫైల్ కంటెంట్‌లు:

అందుబాటులో ఉన్న భాగాల పూర్తి జాబితాను డాక్యుమెంటేషన్ సైట్‌లో చూడవచ్చు మైక్రోసాఫ్ట్ విజువల్ స్టూడియో.

{
  "version": "1.0",
  "components": [
    "Microsoft.Component.MSBuild",
    "Microsoft.VisualStudio.Workload.VCTools;includeRecommended",
    "Microsoft.VisualStudio.Component.VC.v141.x86.x64",
    "Microsoft.VisualStudio.Component.Windows10SDK.17134"
  ]
}

డాకర్‌ఫైల్ ఇన్‌స్టాలేషన్ స్క్రిప్ట్‌ను రన్ చేస్తుంది మరియు సౌలభ్యం కోసం, బిల్డ్ టూల్స్ ఎక్జిక్యూటబుల్ ఫైల్‌లకు ఎన్విరాన్‌మెంట్ వేరియబుల్‌కు మార్గాన్ని జోడిస్తుంది. PATH. చిత్రం యొక్క పరిమాణాన్ని తగ్గించడానికి అనవసరమైన ఫైల్‌లు మరియు డైరెక్టరీలను తీసివేయడం కూడా మంచిది.

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)

ఈ దశలో, C++ అప్లికేషన్‌ను కంపైల్ చేయడానికి మా చిత్రం సిద్ధంగా ఉంది మరియు మేము అప్లికేషన్ యొక్క డాకర్ బహుళ-దశల నిర్మాణాన్ని రూపొందించడానికి నేరుగా కొనసాగవచ్చు.

చర్యలో బహుళ-దశ

మేము బోర్డులోని అన్ని సాధనాలతో సృష్టించిన చిత్రాన్ని బిల్డ్ ఇమేజ్‌గా ఉపయోగిస్తాము. మునుపటి డాకర్‌ఫైల్ స్క్రిప్ట్‌లో వలె, కోడ్ పునర్వినియోగ సౌలభ్యం కోసం వెర్షన్ నంబర్/ఇమేజ్ ట్యాగ్‌ని డైనమిక్‌గా పేర్కొనే సామర్థ్యాన్ని మేము జోడిస్తాము. లేబుల్‌ని జోడించడం ముఖ్యం as builder సూచనలలో అసెంబ్లీ చిత్రానికి FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

ఇప్పుడు అప్లికేషన్‌ను రూపొందించే సమయం వచ్చింది. ఇక్కడ ప్రతిదీ చాలా సులభం: సోర్స్ కోడ్ మరియు దానితో అనుబంధించబడిన ప్రతిదాన్ని కాపీ చేసి, సంకలన ప్రక్రియను ప్రారంభించండి.

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

తుది చిత్రాన్ని రూపొందించే చివరి దశ అప్లికేషన్ యొక్క మూల చిత్రాన్ని పేర్కొనడం, ఇక్కడ అన్ని సంకలన కళాఖండాలు మరియు కాన్ఫిగరేషన్ ఫైల్‌లు ఉంటాయి. ఇంటర్మీడియట్ అసెంబ్లీ ఇమేజ్ నుండి కంపైల్ చేసిన ఫైల్‌లను కాపీ చేయడానికి, మీరు తప్పనిసరిగా పరామితిని పేర్కొనాలి --from=builder సూచనలలో COPY.

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

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

ఇప్పుడు మిగిలి ఉన్నది మా అప్లికేషన్ పని చేయడానికి అవసరమైన డిపెండెన్సీలను జోడించడం మరియు సూచనల ద్వారా లాంచ్ కమాండ్‌ను పేర్కొనడం. ENTRYPOINT లేదా CMD.

తీర్మానం

ఈ ఆర్టికల్‌లో, Windows కింద కంటైనర్‌లో C++ అప్లికేషన్‌ల కోసం పూర్తి స్థాయి సంకలన వాతావరణాన్ని ఎలా సృష్టించాలో మరియు మా అప్లికేషన్ యొక్క పూర్తి స్థాయి చిత్రాలను రూపొందించడానికి డాకర్ మల్టీ-స్టేజ్ బిల్డ్‌ల సామర్థ్యాలను ఎలా ఉపయోగించాలో గురించి మాట్లాడాను.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి