विंडोज़ छवियाँ बनाने के लिए डॉकर मल्टी-स्टेज का उपयोग करना

नमस्ते! मेरा नाम एंड्री है, और मैं Exness में डेवलपमेंट टीम में DevOps इंजीनियर के रूप में काम करता हूँ। मेरी मुख्य गतिविधि लिनक्स ऑपरेटिंग सिस्टम (इसके बाद ओएस के रूप में संदर्भित) के तहत डॉकर में अनुप्रयोगों के निर्माण, तैनाती और समर्थन से संबंधित है। अभी कुछ समय पहले मेरे पास समान गतिविधियों वाला एक कार्य था, लेकिन परियोजना का लक्ष्य ओएस विंडोज सर्वर और सी++ परियोजनाओं का एक सेट था। मेरे लिए, यह विंडोज़ ओएस के तहत डॉकर कंटेनरों के साथ और सामान्य तौर पर सी++ अनुप्रयोगों के साथ पहली करीबी बातचीत थी। इसके लिए धन्यवाद, मुझे एक दिलचस्प अनुभव हुआ और विंडोज़ में कंटेनरीकरण अनुप्रयोगों की कुछ जटिलताओं के बारे में सीखा।

विंडोज़ छवियाँ बनाने के लिए डॉकर मल्टी-स्टेज का उपयोग करना

इस लेख में मैं आपको बताना चाहता हूं कि मुझे किन कठिनाइयों का सामना करना पड़ा और मैं उन्हें कैसे हल करने में कामयाब रहा। मुझे आशा है कि यह आपकी वर्तमान और भविष्य की चुनौतियों के लिए सहायक होगा। मन लगाकर पढ़ाई करो!

कंटेनर क्यों?

कंपनी के पास हाशिकॉर्प नोमैड कंटेनर ऑर्केस्ट्रेटर और संबंधित घटकों - कॉन्सल और वॉल्ट के लिए मौजूदा बुनियादी ढांचा है। इसलिए, संपूर्ण समाधान प्रदान करने के लिए एप्लिकेशन कंटेनरीकरण को एक एकीकृत विधि के रूप में चुना गया था। चूंकि प्रोजेक्ट इंफ्रास्ट्रक्चर में विंडोज सर्वर कोर ओएस संस्करण 1803 और 1809 के साथ डॉकर होस्ट शामिल हैं, इसलिए 1803 और 1809 के लिए डॉकर छवियों के अलग-अलग संस्करण बनाना आवश्यक है। संस्करण 1803 में, यह याद रखना महत्वपूर्ण है कि बिल्ड डॉकर होस्ट की संशोधन संख्या बेस डॉकर छवि और होस्ट की संशोधन संख्या से मेल खाना चाहिए जहां इस छवि से कंटेनर लॉन्च किया जाएगा। संस्करण 1809 में ऐसी कोई कमी नहीं है। आप और अधिक पढ़ सकते हैं यहां.

मल्टी-स्टेज क्यों?

विकास टीम के इंजीनियरों के पास होस्ट बनाने के लिए कोई या बहुत सीमित पहुंच नहीं है; इन होस्ट पर एप्लिकेशन बनाने के लिए घटकों के सेट को जल्दी से प्रबंधित करने का कोई तरीका नहीं है, उदाहरण के लिए, विजुअल स्टूडियो के लिए एक अतिरिक्त टूलसेट या वर्कलोड स्थापित करना। इसलिए, हमने बिल्ड डॉकर छवि में एप्लिकेशन बनाने के लिए आवश्यक सभी घटकों को स्थापित करने का निर्णय लिया। यदि आवश्यक हो, तो आप केवल dockerfile को तुरंत बदल सकते हैं और इस छवि को बनाने के लिए पाइपलाइन लॉन्च कर सकते हैं।

सिद्धांत से कार्य तक

एक आदर्श डॉकर मल्टी-स्टेज इमेज बिल्ड में, एप्लिकेशन के निर्माण के लिए वातावरण उसी डॉकरफाइल स्क्रिप्ट में तैयार किया जाता है जैसे एप्लिकेशन स्वयं बनाया जाता है। लेकिन हमारे मामले में, एक मध्यवर्ती लिंक जोड़ा गया था, अर्थात्, एप्लिकेशन बनाने के लिए आवश्यक सभी चीज़ों के साथ डॉकर छवि बनाने का प्रारंभिक चरण। ऐसा इसलिए किया गया क्योंकि मैं सभी निर्भरताओं के इंस्टॉलेशन समय को कम करने के लिए डॉकर कैश सुविधा का उपयोग करना चाहता था।

आइए इस छवि को बनाने के लिए dockerfile स्क्रिप्ट के मुख्य बिंदुओं को देखें।

विभिन्न OS संस्करणों की छवियां बनाने के लिए, आप dockerfile में एक तर्क को परिभाषित कर सकते हैं जिसके माध्यम से निर्माण के दौरान संस्करण संख्या पारित की जाती है, और यह आधार छवि का टैग भी है।

Microsoft Windows सर्वर छवि टैग की पूरी सूची पाई जा सकती है यहां.

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

डिफ़ॉल्ट रूप से निर्देशों में आदेश RUN Windows OS पर dockerfile के अंदर उन्हें 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>

इसके बाद, हम एप्लिकेशन बिल्ड वातावरण स्थापित करते हैं, अर्थात्, एमएस बिल्ड टूल्स 2019 - यह विजुअल स्टूडियो 2019 का एक हल्का संस्करण है, जिसमें कोड संकलित करने के लिए घटकों का न्यूनतम आवश्यक सेट शामिल है।
हमारे C++ प्रोजेक्ट के साथ पूरी तरह से काम करने के लिए, हमें अतिरिक्त घटकों की आवश्यकता होगी, अर्थात्:

  • कार्यभार C++ उपकरण
  • टूलसेट v141
  • विंडोज़ 10 एसडीके (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.

निष्कर्ष

इस लेख में, मैंने विंडोज के तहत एक कंटेनर के अंदर C++ अनुप्रयोगों के लिए एक पूर्ण संकलन वातावरण कैसे बनाया जाए और हमारे एप्लिकेशन की पूर्ण छवियां बनाने के लिए डॉकर मल्टी-स्टेज बिल्ड की क्षमताओं का उपयोग कैसे किया जाए, इसके बारे में बात की।

स्रोत: www.habr.com

एक टिप्पणी जोड़ें