استفاده از docker چند مرحله ای برای ساخت تصاویر ویندوز

سلام به همه! نام من آندری است و به عنوان یک مهندس DevOps در Exness در تیم توسعه کار می کنم. فعالیت اصلی من مربوط به ساخت، استقرار و پشتیبانی از برنامه های کاربردی در docker تحت سیستم عامل لینوکس (از این پس سیستم عامل نامیده می شود). چندی پیش من با همین فعالیت ها وظیفه داشتم، اما سیستم عامل هدف پروژه ویندوز سرور و مجموعه ای از پروژه های ++C بود. برای من، این اولین تعامل نزدیک با کانتینرهای docker تحت سیستم عامل ویندوز و به طور کلی با برنامه های C++ بود. به لطف این، من تجربه جالبی داشتم و با برخی از پیچیدگی های برنامه های کانتینری در ویندوز آشنا شدم.

استفاده از docker چند مرحله ای برای ساخت تصاویر ویندوز

در این مقاله می خواهم به شما بگویم که با چه مشکلاتی روبرو شدم و چگونه توانستم آنها را حل کنم. امیدوارم این برای چالش های فعلی و آینده شما مفید باشد. از خواندن لذت ببرید!

چرا ظروف؟

این شرکت دارای زیرساخت های موجود برای ارکستراتور کانتینر Hashicorp Nomad و اجزای مرتبط - کنسول و Vault است. بنابراین، کانتینرسازی برنامه به عنوان یک روش یکپارچه برای ارائه راه حل کلید در دست انتخاب شد. از آنجایی که زیرساخت پروژه شامل میزبان های docker با سیستم عامل Windows Server Core نسخه های 1803 و 1809 است، لازم است نسخه های جداگانه ای از تصاویر docker برای 1803 و 1809 ساخته شود. در نسخه 1803، مهم است که به یاد داشته باشید که شماره ویرایش هاست build docker باید با شماره بازبینی تصویر پایه داکر و میزبانی که کانتینر این تصویر راه اندازی می شود مطابقت داشته باشد. نسخه 1809 چنین ایرادی ندارد. می توانید بیشتر بخوانید اینجا.

چرا چند مرحله ای؟

مهندسان تیم توسعه دسترسی به ساخت هاست ندارند یا دسترسی بسیار محدودی دارند؛ هیچ راهی برای مدیریت سریع مجموعه کامپوننت ها برای ساخت برنامه روی این هاست ها وجود ندارد، به عنوان مثال، یک مجموعه ابزار اضافی یا حجم کار برای ویژوال استودیو نصب کنید. بنابراین، ما تصمیم گرفتیم تمام اجزای لازم برای ساخت برنامه را در بیلد داکر ایمیج نصب کنیم. در صورت لزوم، می توانید به سرعت فقط فایل docker را تغییر دهید و خط لوله ایجاد این تصویر را راه اندازی کنید.

از تئوری تا عمل

در یک ساخت تصویر چند مرحله ای ایده آل Docker، محیط ساخت برنامه با همان اسکریپت Dockerfile که خود برنامه ساخته شده است، آماده می شود. اما در مورد ما، یک پیوند میانی اضافه شد، یعنی مرحله ایجاد اولیه یک تصویر داکر با همه چیز لازم برای ساخت برنامه. این کار به این دلیل انجام شد که می خواستم از ویژگی کش docker برای کاهش زمان نصب همه وابستگی ها استفاده کنم.

بیایید به نکات اصلی اسکریپت dockerfile برای ایجاد این تصویر نگاه کنیم.

برای ایجاد تصاویر نسخه های مختلف سیستم عامل، می توانید یک آرگومان در فایل docker تعریف کنید که شماره نسخه از طریق آن در طول ساخت ارسال می شود و همچنین تگ تصویر پایه است.

لیست کاملی از تگ های تصویر Microsoft Windows Server را می توان یافت اینجا.

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

به طور پیش فرض دستورات در دستورالعمل ها RUN در داخل dockerfile در سیستم عامل ویندوز، آنها در کنسول cmd.exe اجرا می شوند. برای راحتی نوشتن اسکریپت ها و گسترش عملکرد دستورات مورد استفاده، کنسول اجرای دستورات را در Powershell از طریق دستورالعمل دوباره تعریف می کنیم. 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 Build Tools 2019 - این یک نسخه سبک وزن از Visual Studio 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"
  ]
}

Dockerfile اسکریپت نصب را اجرا می کند و برای راحتی، مسیر فایل های اجرایی ابزار ساخت را به متغیر محیطی اضافه می کند. 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 آماده است و می‌توانیم مستقیماً اقدام به ساخت یک ساخت چند مرحله‌ای docker از برنامه کنیم.

چند مرحله ای در عمل

از تصویر ایجاد شده با تمام ابزارهای موجود به عنوان تصویر ساخت استفاده خواهیم کرد. مانند اسکریپت قبلی dockerfile، برای سهولت استفاده مجدد از کد، توانایی تعیین پویا شماره نسخه/تگ تصویر را اضافه می کنیم. مهم است که یک برچسب اضافه کنید 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 در داخل یک کانتینر تحت ویندوز و نحوه استفاده از قابلیت های ساخت های چند مرحله ای docker برای ایجاد تصاویر تمام عیار از برنامه خود صحبت کردم.

منبع: www.habr.com

اضافه کردن نظر