Nggunakake docker multi-stage kanggo mbangun gambar windows

Halo kabeh! Jenengku Andrey, lan aku kerja minangka insinyur DevOps ing Exness ing tim pangembangan. Kegiatan utamaku ana gandhengane karo mbangun, nyebarake lan ndhukung aplikasi ing docker ing sistem operasi Linux (sabanjuré diarani OS). Ora suwe aku duwe tugas kanthi kegiatan sing padha, nanging target OS proyek kasebut yaiku Windows Server lan sakumpulan proyek C ++. Kanggo kula, iki minangka interaksi cedhak pisanan karo wadhah docker ing Windows OS lan, umume, karo aplikasi C ++. Thanks kanggo iki, aku duwe pengalaman sing menarik lan sinau babagan sawetara kerumitan aplikasi containerizing ing Windows.

Nggunakake docker multi-stage kanggo mbangun gambar windows

Ing artikel iki, aku arep menehi pitutur marang kowe apa kangelan aku kudu ngadhepi lan carane aku ngatur kanggo ngatasi. Muga-muga iki bisa migunani kanggo tantangan saiki lan mbesuk. Seneng maca!

Kenapa kontainer?

Perusahaan kasebut duwe infrastruktur kanggo orkestra kontainer Hashicorp Nomad lan komponen sing ana gandhengane - Konsul lan Vault. Mulane, containerization aplikasi dipilih minangka cara terpadu kanggo ngirim solusi lengkap. Wiwit infrastruktur proyek ngemot host docker karo Windows Server Core OS versi 1803 lan 1809, perlu kanggo mbangun versi kapisah saka gambar docker kanggo 1803 lan 1809. Ing versi 1803, penting kanggo elinga yen nomer revisi saka host docker mbangun. kudu cocog karo nomer revisi saka gambar docker dhasar lan host ngendi wadhah saka gambar iki bakal dibukak. Versi 1809 ora duwe kekurangan. Sampeyan bisa maca liyane kene.

Kenapa multi-stage?

Insinyur tim pangembangan ora duwe akses utawa winates banget kanggo mbangun host; ora ana cara kanggo ngatur set komponen kanthi cepet kanggo mbangun aplikasi ing host kasebut, contone, nginstal toolset utawa beban kerja tambahan kanggo Visual Studio. Mula, kita mutusake kanggo nginstal kabeh komponen sing dibutuhake kanggo mbangun aplikasi menyang gambar mbangun Docker. Yen perlu, sampeyan bisa kanthi cepet ngganti mung dockerfile lan miwiti pipeline kanggo nggawe gambar iki.

Saka teori nganti tumindak

Ing mbangun gambar multi-tataran Docker sing becik, lingkungan kanggo mbangun aplikasi disiapake ing skrip Dockerfile sing padha karo aplikasi kasebut dhewe. Nanging ing kasus kita, link penengah ditambahake, yaiku, langkah awal nggawe gambar docker karo kabeh sing dibutuhake kanggo mbangun aplikasi kasebut. Iki rampung amarga aku pengin nggunakake fitur cache docker kanggo nyuda wektu instalasi kabeh dependensi.

Ayo goleki poin utama skrip dockerfile kanggo nggawe gambar iki.

Kanggo nggawe gambar saka versi OS beda, sampeyan bisa nemtokake bantahan ing dockerfile liwat kang nomer versi liwati sak mbangun, lan uga tag saka gambar dhasar.

Dhaptar lengkap tag gambar Microsoft Windows Server bisa ditemokake kene.

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

Kanthi gawan printah ing instruksi RUN nang dockerfile ing OS Windows lagi dieksekusi ing console cmd.exe. Kanggo penak nulis skrip lan ngembangake fungsi printah sing digunakake, kita bakal nemtokake maneh konsol eksekusi perintah ing Powershell liwat instruksi kasebut. SHELL.

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

Langkah sabanjure yaiku nginstal manajer paket coklat lan paket sing dibutuhake:

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'

Kanggo nginstal paket nggunakake chocolatey, sampeyan mung bisa pass minangka dhaftar, utawa nginstal siji ing wektu yen sampeyan kudu pass paramèter unik kanggo saben paket. Ing kahanan kita, kita nggunakake file manifest ing format XML, sing ngemot dhaptar paket sing dibutuhake lan paramèter. Isine katon kaya iki:

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

Sabanjure, kita nginstal lingkungan mbangun aplikasi, yaiku, MS Build Tools 2019 - iki minangka versi entheng saka Visual Studio 2019, sing ngemot set komponen minimal sing dibutuhake kanggo kompilasi kode.
Kanggo nggarap proyek C++ kanthi lengkap, kita butuh komponen tambahan, yaiku:

  • Alat C++ beban kerja
  • Piranti v141
  • Windows 10 SDK (10.0.17134.0)

Sampeyan bisa nginstal set lengkap piranti kanthi otomatis nggunakake file konfigurasi ing format JSON. Isi file konfigurasi:

Dhaptar lengkap komponen sing kasedhiya bisa ditemokake ing situs dokumentasi 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 mbukak skrip instalasi, lan kanggo penak, nambah path menyang file eksekusi alat mbangun menyang variabel lingkungan PATH. Sampeyan uga dianjurake kanggo mbusak file lan direktori sing ora perlu kanggo nyuda 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)

Ing tataran iki, gambar kita kanggo kompilasi C ++ aplikasi wis siyap, lan kita bisa nerusake langsung kanggo nggawe docker multi-tataran mbangun aplikasi.

Multi-tataran ing tumindak

Kita bakal nggunakake gambar digawe karo kabeh alat ing Papan minangka gambar mbangun. Kaya ing skrip dockerfile sadurunge, kita bakal nambah kemampuan kanggo nemtokake nomer versi / tag gambar kanthi dinamis supaya gampang digunakake maneh kode. Penting kanggo nambah label as builder menyang gambar perakitan ing instruksi FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Saiki wektune kanggo mbangun aplikasi kasebut. Kabeh ing kene cukup prasaja: nyalin kode sumber lan kabeh sing ana gandhengane, lan miwiti proses kompilasi.

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

Tahap pungkasan nggawe gambar pungkasan yaiku nemtokake gambar dhasar aplikasi, ing ngendi kabeh artefak kompilasi lan file konfigurasi bakal ana. Kanggo nyalin file kompilasi saka gambar perakitan penengah, sampeyan kudu nemtokake parameter kasebut --from=builder ing instruksi COPY.

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

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

Saiki sing isih ana yaiku nambahake dependensi sing dibutuhake supaya aplikasi bisa digunakake lan nemtokake perintah peluncuran liwat instruksi kasebut ENTRYPOINT utawa CMD.

kesimpulan

Ing artikel iki, aku ngomong babagan carane nggawe lingkungan kompilasi lengkap kanggo aplikasi C ++ ing wadhah Windows lan carane nggunakake kemampuan docker multi-stage mbangun kanggo nggawe gambar lengkap aplikasi kita.

Source: www.habr.com

Add a comment