Ang paggamit sa docker multi-stage sa paghimo sa mga imahe sa windows

Kumusta tanan! Ang akong ngalan kay Andrey, ug nagtrabaho ko isip DevOps engineer sa Exness sa development team. Ang akong panguna nga kalihokan adunay kalabotan sa pagtukod, pag-deploy ug pagsuporta sa mga aplikasyon sa docker sa ilawom sa operating system sa Linux (gitawag nga OS). Dili pa lang dugay ako adunay usa ka buluhaton nga adunay parehas nga mga kalihokan, apan ang target nga OS sa proyekto mao ang Windows Server ug usa ka set sa mga proyekto sa C++. Alang kanako, kini ang una nga suod nga interaksyon sa mga docker container sa ilawom sa Windows OS ug, sa kinatibuk-an, sa mga aplikasyon sa C++. Salamat niini, ako adunay usa ka makapaikag nga kasinatian ug nahibal-an ang bahin sa pipila ka mga kakuti sa pag-container sa mga aplikasyon sa Windows.

Ang paggamit sa docker multi-stage sa paghimo sa mga imahe sa windows

Niini nga artikulo gusto nakong isulti kanimo kung unsang mga kalisud ang akong giatubang ug giunsa nako kini pagsulbad. Nanghinaut ko nga makatabang kini sa imong mga hagit karon ug sa umaabot. Malingaw sa pagbasa!

Nganong sudlanan?

Ang kompanya adunay naglungtad nga imprastraktura para sa Hashicorp Nomad container orchestrator ug mga may kalabutan nga sangkap - Consul ug Vault. Busa, gipili ang containerization sa aplikasyon ingon usa ka hiniusa nga pamaagi alang sa paghatud sa usa ka kompleto nga solusyon. Tungod kay ang imprastraktura sa proyekto naglangkob sa mga docker host nga adunay Windows Server Core OS nga mga bersyon 1803 ug 1809, gikinahanglan ang paghimo og bulag nga bersyon sa docker nga mga imahe para sa 1803 ug 1809. Sa bersyon 1803, importante nga hinumdoman nga ang rebisyon nga numero sa build docker host kinahanglan nga motakdo sa rebisyon nga numero sa base docker nga imahe ug sa host diin ang sudlanan gikan niini nga hulagway ilunsad. Ang Bersyon 1809 walay ingon nga disbentaha. Makabasa ka ug dugang dinhi.

Nganong multi-stage?

Ang mga inhinyero sa development team walay o limitado kaayo nga pag-access sa pagtukod og mga host; walay paagi nga dali nga madumala ang hugpong sa mga sangkap alang sa pagtukod og aplikasyon niini nga mga host, pananglitan, pag-instalar og dugang nga toolset o workload alang sa Visual Studio. Busa, naghimo kami og desisyon nga i-install ang tanan nga mga sangkap nga gikinahanglan aron matukod ang aplikasyon sa imahe sa build Docker. Kung gikinahanglan, mahimo nimo nga dali nga usbon ang dockerfile ug ilunsad ang pipeline alang sa paghimo niini nga imahe.

Gikan sa teorya hangtod sa aksyon

Sa usa ka sulundon nga Docker multi-stage image build, ang palibot alang sa pagtukod sa aplikasyon giandam sa parehas nga Dockerfile script ingon nga ang aplikasyon mismo gitukod. Apan sa among kaso, usa ka intermediate link ang gidugang, nga mao, ang lakang sa pasiuna nga paghimo sa usa ka docker nga imahe nga adunay tanan nga kinahanglan aron matukod ang aplikasyon. Gihimo kini tungod kay gusto nako nga gamiton ang feature sa docker cache aron makunhuran ang oras sa pag-instalar sa tanan nga mga dependency.

Atong tan-awon ang mga nag-unang punto sa dockerfile script alang sa paghimo niini nga imahe.

Aron makahimo og mga hulagway sa lain-laing mga bersyon sa OS, mahimo nimong ipasabut ang usa ka argumento sa dockerfile diin ang numero sa bersyon gipasa sa panahon sa pagtukod, ug kini usab ang tag sa base nga imahe.

Ang usa ka kompleto nga lista sa mga tag sa imahe sa Microsoft Windows Server makit-an dinhi.

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

Pinaagi sa default ang mga mando sa mga panudlo RUN sulod sa dockerfile sa Windows OS sila gipatuman sa cmd.exe console. Alang sa kasayon ​​​​sa pagsulat sa mga script ug pagpalapad sa pagpaandar sa mga sugo nga gigamit, atong i-redefine ang command execution console sa Powershell pinaagi sa instruksiyon. SHELL.

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

Ang sunod nga lakang mao ang pag-instalar sa chocolatey package manager ug ang gikinahanglan nga mga pakete:

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'

Aron ma-install ang mga pakete gamit ang tsokolate, mahimo nimong ipasa kini ingon usa ka lista, o i-install kini matag usa kung kinahanglan nimo nga ipasa ang mga talagsaon nga mga parameter alang sa matag pakete. Sa among sitwasyon, migamit kami og manifest file sa XML format, nga adunay listahan sa gikinahanglan nga mga package ug ang mga parameter niini. Ang mga sulod niini ingon niini:

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

Sunod, gi-install namon ang palibot sa pagtukod sa aplikasyon, nga mao, ang MS Build Tools 2019 - kini usa ka gaan nga bersyon sa Visual Studio 2019, nga adunay sulud nga minimum nga gikinahanglan nga set sa mga sangkap alang sa pag-compile sa code.
Aron hingpit nga magtrabaho sa among C++ nga proyekto, kinahanglan namon ang dugang nga mga sangkap, nga mao ang:

  • Workload C++ nga mga himan
  • Toolset v141
  • Windows 10 SDK (10.0.17134.0)

Mahimo nimong i-install ang usa ka taas nga set sa mga himan nga awtomatiko gamit ang usa ka file sa pag-configure sa format nga JSON. Mga sulud sa file sa pag-configure:

Ang usa ka kompleto nga lista sa magamit nga mga sangkap makita sa site sa dokumentasyon 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"
  ]
}

Ang dockerfile nagpadagan sa script sa pag-install, ug alang sa kasayon, gidugang ang agianan sa mga himan sa pagtukod nga mga executable nga mga file sa variable sa palibot PATH. Gisugyot usab nga tangtangon ang wala kinahanglana nga mga file ug direktoryo aron makunhuran ang gidak-on sa imahe.

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)

Niini nga yugto, andam na ang among imahen para sa pag-compile sa C++ nga aplikasyon, ug mahimo na kaming mopadayon direkta sa paghimo og docker multi-stage nga pagtukod sa aplikasyon.

Multi-stage sa aksyon

Gamiton namo ang gibuhat nga hulagway uban sa tanang galamiton sa board isip build image. Sama sa miaging dockerfile script, among idugang ang abilidad sa dinamikong pagtino sa numero sa bersyon/tag sa imahe para sa kadali sa paggamit sa code. Importante nga magdugang og label as builder sa imahe sa asembliya sa mga panudlo FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Karon na ang panahon sa pagtukod sa aplikasyon. Ang tanan dinhi kay yano ra: kopyaha ang source code ug ang tanan nga nalangkit niini, ug sugdi ang proseso sa pag-compile.

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

Ang katapusan nga yugto sa paghimo sa katapusan nga imahe mao ang pagtino sa base nga imahe sa aplikasyon, diin ang tanan nga mga artifact sa compilation ug mga file sa pag-configure mahimutang. Aron makopya ang mga gihugpong nga mga file gikan sa intermediate assembly image, kinahanglan nimong ipiho ang parameter --from=builder sa mga instruksyon COPY.

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

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

Karon ang nahabilin mao ang pagdugang sa gikinahanglan nga mga dependency aron magtrabaho ang among aplikasyon ug ipiho ang mando sa paglansad pinaagi sa mga panudlo ENTRYPOINT o CMD.

konklusyon

Sa kini nga artikulo, naghisgot ako kung giunsa paghimo ang usa ka hingpit nga compilation environment para sa C ++ nga mga aplikasyon sa sulod sa usa ka sudlanan sa ilawom sa Windows ug kung giunsa ang paggamit sa mga kapabilidad sa mga docker multi-stage build aron makamugna ang hingpit nga mga imahe sa among aplikasyon.

Source: www.habr.com

Idugang sa usa ka comment