Nganggo docker multi-stage pikeun ngawangun gambar windows

Halo sadayana! Nami abdi Andrey, sareng abdi damel salaku insinyur DevOps di Exness dina tim pamekaran. Aktivitas utama kuring aya hubunganana sareng ngawangun, nyebarkeun sareng ngadukung aplikasi dina docker dina sistem operasi Linux (saterusna disebut OS). Teu lila pisan kuring kungsi tugas jeung kagiatan anu sarua, tapi udagan OS proyék éta Windows Server jeung susunan C ++ proyék. Pikeun kuring, ieu mangrupikeun interaksi anu caket sareng wadah docker dina Windows OS sareng, sacara umum, sareng aplikasi C ++. Hatur nuhun kana ieu, kuring ngagaduhan pangalaman anu pikaresepeun sareng diajar ngeunaan sababaraha intricacies aplikasi wadahna dina Windows.

Nganggo docker multi-stage pikeun ngawangun gambar windows

Dina artikel ieu abdi hoyong ngabejaan Anjeun naon kasusah kuring kungsi nyanghareupan jeung kumaha kuring junun ngabéréskeun aranjeunna. Kuring miharep ieu mantuan pikeun tantangan anjeun ayeuna jeung nu bakal datang. Senang maca!

Naha wadahna?

Perusahaan gaduh infrastruktur anu tos aya pikeun orkestra wadah wadah Hashicorp Nomad sareng komponén anu aya hubunganana - Konsul sareng Vault. Ku alatan éta, containerization aplikasi dipilih salaku padika hasil ngahijikeun Tatar pikeun nganteurkeun solusi lengkep. Kusabab infrastruktur proyék ngandung docker host sareng Windows Server Core OS versi 1803 sareng 1809, peryogi ngawangun versi misah gambar docker pikeun 1803 sareng 1809. Dina versi 1803, penting pikeun émut yén nomer révisi tina host docker ngawangun. kedah cocog sareng nomer révisi gambar docker dasar sareng host dimana wadah tina gambar ieu bakal diluncurkeun. Vérsi 1809 teu boga aral saperti. Anjeun tiasa maca deui di dieu.

Naha multi-tahap?

Insinyur tim pamekaran teu gaduh atanapi dugi pisan aksés pikeun ngawangun host; teu aya deui jalan pikeun gancang ngatur set komponén pikeun ngawangun aplikasi dina host ieu, contona, masang toolset tambahan atanapi beban kerja pikeun Visual Studio. Ku alatan éta, kami nyandak kaputusan pikeun masang sadaya komponén anu dipikabutuh pikeun ngawangun aplikasi kana gambar ngawangun Docker. Upami diperyogikeun, anjeun tiasa gancang ngan ukur ngarobih dockerfile sareng ngaluncurkeun pipa pikeun nyiptakeun gambar ieu.

Tina tiori nepi ka aksi

Dina wangunan gambar multi-tahap Docker idéal, lingkungan pikeun ngawangun aplikasi disiapkeun dina naskah Dockerfile sarua salaku aplikasi sorangan diwangun. Tapi dina kasus urang, hiji link panengah ditambahkeun, nyaéta, hambalan awal nyieun gambar docker kalawan sagalana diperlukeun pikeun ngawangun aplikasi. Hal ieu dilakukeun kusabab kuring hoyong nganggo fitur cache docker pikeun ngirangan waktos pamasangan sadaya kagumantungan.

Hayu urang tingali titik utama naskah dockerfile pikeun nyiptakeun gambar ieu.

Pikeun nyieun gambar tina versi OS béda, anjeun bisa nangtukeun hiji argumen dina dockerfile ngaliwatan nu nomer versi diliwatan salila ngawangun, sarta eta oge tag gambar dasar.

Daptar lengkep tag gambar Microsoft Windows Server tiasa dipendakan di dieu.

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

Sacara standar paréntah dina parentah RUN di jero dockerfile dina OS Windows aranjeunna dieksekusi dina konsol cmd.exe. Pikeun genah nulis skrip sareng ngalegaan pungsionalitas paréntah anu dianggo, kami bakal ngartikeun ulang konsol palaksanaan paréntah di Powershell ngaliwatan instruksi. SHELL.

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

Lengkah saterusna nyaéta masang manajer pakét coklat sareng pakét anu diperyogikeun:

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'

Pikeun masang pakét nganggo coklat, anjeun ngan saukur tiasa lulus salaku daptar, atanapi pasang hiji-hiji upami anjeun kedah lulus parameter unik pikeun unggal pakét. Dina kaayaan urang, kami nganggo file manifest dina format XML, anu ngandung daptar pakét anu diperyogikeun sareng parameterna. eusina siga kieu:

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

Salajengna, urang pasang lingkungan ngawangun aplikasi, nyaéta, MS Build Tools 2019 - ieu mangrupikeun vérsi ringan Visual Studio 2019, anu ngandung set komponén minimum anu diperyogikeun pikeun nyusun kode.
Pikeun pinuh damel sareng proyék C++ urang, urang peryogi komponén tambahan, nyaéta:

  • Workload C++ parabot
  • Pakakas v141
  • Windows 10 SDK (10.0.17134.0)

Anjeun tiasa masang set alat anu diperpanjang sacara otomatis nganggo file konfigurasi dina format JSON. Eusi file konfigurasi:

Daptar lengkep komponén anu sayogi tiasa dipendakan dina situs dokuméntasi 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 ngajalankeun skrip pamasangan, sareng pikeun genah, nambihan jalur kana alat ngawangun file anu tiasa dieksekusi kana variabel lingkungan. PATH. Éta ogé sasaena pikeun ngahapus file sareng diréktori anu teu dipikabutuh pikeun ngirangan ukuran gambar.

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)

Dina tahap ieu, gambar urang pikeun compiling aplikasi C ++ geus siap, tur urang bisa neruskeun langsung ka nyieun docker multi-tahap ngawangun aplikasi.

Multi-tahap dina aksi

Kami bakal nganggo gambar anu diciptakeun sareng sadaya alat anu aya dina kapal salaku gambar ngawangun. Sapertos dina skrip dockerfile sateuacana, kami bakal nambihan kamampuan pikeun sacara dinamis nangtukeun nomer vérsi / tag gambar pikeun gampang dianggo deui kode. Kadé pikeun nambahkeun labél a as builder kana gambar assembly dina parentah FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Ayeuna waktuna pikeun ngawangun aplikasi. Sadayana di dieu saderhana: nyalin kodeu sumber sareng sadayana anu aya hubunganana sareng ngamimitian prosés kompilasi.

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

Tahap ahir nyieun gambar ahir nyaéta pikeun nangtukeun gambar dasar aplikasi, dimana sakabeh artefak kompilasi jeung file konfigurasi bakal lokasina. Pikeun nyalin file disusun tina gambar assembly panengah, anjeun kudu nangtukeun parameter --from=builder dina parentah COPY.

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

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

Ayeuna sadayana anu tetep nyaéta pikeun nambihan katergantungan anu dipikabutuh pikeun aplikasi urang tiasa dianggo sareng netepkeun paréntah peluncuran ngaliwatan paréntah ENTRYPOINT atawa CMD.

kacindekan

Dina artikel ieu, kuring ngobrol ngeunaan kumaha carana nyieun lingkungan kompilasi full-fledged pikeun aplikasi C ++ di jero wadahna handapeun Windows jeung kumaha carana make kamampuhan docker multi-tahap ngawangun nyieun gambar full-fledged tina aplikasi urang.

sumber: www.habr.com

Tambahkeun komentar