Dockerin monivaiheinen käyttö Windows-kuvien rakentamiseen

Hei kaikki! Nimeni on Andrey ja työskentelen DevOps-insinöörinä Exnessissä kehitystiimissä. Päätoimialani liittyy docker-sovellusten rakentamiseen, käyttöönottoon ja tukemiseen Linux-käyttöjärjestelmän (jäljempänä käyttöjärjestelmä) alla. Ei kauan sitten minulla oli tehtävä samoilla toimilla, mutta projektin kohdekäyttöjärjestelmä oli Windows Server ja joukko C++-projekteja. Minulle tämä oli ensimmäinen läheinen vuorovaikutus Docker-säiliöiden kanssa Windows-käyttöjärjestelmässä ja yleensä C++-sovellusten kanssa. Tämän ansiosta minulla oli mielenkiintoinen kokemus ja opin joitain Windows-sovellusten säilytyssovellusten monimutkaisuuksia.

Dockerin monivaiheinen käyttö Windows-kuvien rakentamiseen

Tässä artikkelissa haluan kertoa sinulle, mitä vaikeuksia jouduin kohtaamaan ja kuinka onnistuin ratkaisemaan ne. Toivottavasti tästä on apua nykyisissä ja tulevissa haasteissasi. Nauti lukemisesta!

Miksi kontit?

Yrityksellä on olemassa oleva infrastruktuuri Hashicorp Nomad -konttiorkesterille ja siihen liittyville komponenteille - Consulille ja Vaultille. Tästä syystä sovelluskontitointi valittiin yhtenäiseksi menetelmäksi kokonaisratkaisun toimittamiseen. Koska projektin infrastruktuuri sisältää Docker-isäntiä Windows Server Core -käyttöjärjestelmän versioilla 1803 ja 1809, on tarpeen rakentaa erilliset versiot Docker-näköistiedostoista versioille 1803 ja 1809. Versiossa 1803 on tärkeää muistaa, että build Docker -isäntäkoneen versionumero on vastattava Docker-peruskuvan versionumeroa ja isäntää, jossa tämän kuvan säilö käynnistetään. Versiossa 1809 ei ole tällaista haittaa. Voit lukea lisää täällä.

Miksi monivaiheinen?

Kehitystiimien insinööreillä ei ole lainkaan tai vain rajoitetusti oikeuksia rakentaa isäntiä; ei ole mahdollista hallita nopeasti komponenttijoukkoja sovelluksen rakentamiseksi näille isännille, esimerkiksi asentaa ylimääräinen työkalusarja tai työkuorma Visual Studiolle. Siksi teimme päätöksen asentaa kaikki sovelluksen rakentamiseen tarvittavat komponentit Build Docker -näköistiedostoon. Tarvittaessa voit nopeasti muuttaa vain docker-tiedostoa ja käynnistää liukuhihnan tämän kuvan luomiseksi.

Teoriasta tekoon

Ihanteellisessa monivaiheisessa Docker-kuvanrakennuksessa ympäristö sovelluksen rakentamiseen valmistetaan samalla Dockerfile-skriptillä kuin itse sovellus on rakennettu. Mutta meidän tapauksessamme lisättiin välilinkki, nimittäin vaihe, jossa esitellään telakointikuva, jossa on kaikki tarvittava sovelluksen rakentamiseen. Tämä tehtiin, koska halusin käyttää Docker-välimuistiominaisuutta lyhentämään kaikkien riippuvuuksien asennusaikaa.

Katsotaanpa Dockerfile-skriptin pääkohtia tämän kuvan luomiseksi.

Kun haluat luoda kuvia eri käyttöjärjestelmäversioista, voit määrittää docker-tiedostoon argumentin, jonka kautta versionumero välitetään koonnon aikana, ja se on myös peruskuvan tagi.

Täydellinen luettelo Microsoft Windows Server -kuvatunnisteista löytyy täällä.

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

Oletuksena ohjeiden komennot RUN Windows-käyttöjärjestelmän docker-tiedoston sisällä ne suoritetaan cmd.exe-konsolissa. Komentosarjojen kirjoittamisen ja käytettävien komentojen toiminnallisuuden laajentamisen helpottamiseksi määrittelemme Powershellin komentojen suorituskonsolin uudelleen ohjeen avulla. SHELL.

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

Seuraava askel on asentaa suklaapakettien hallinta ja tarvittavat paketit:

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'

Jos haluat asentaa paketteja chocolateylla, voit välittää ne luettelona tai asentaa ne yksi kerrallaan, jos sinun on välitettävä yksilölliset parametrit jokaiselle paketille. Tilanteessamme käytimme XML-muotoista manifest-tiedostoa, joka sisältää luettelon tarvittavista paketeista ja niiden parametreista. Sen sisältö näyttää tältä:

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

Seuraavaksi asennamme sovelluksen rakennusympäristön, nimittäin MS Build Tools 2019:n - tämä on Visual Studio 2019:n kevyt versio, joka sisältää vähimmäismäärän komponentteja koodin kääntämiseen.
Jotta voimme työskennellä täysin C++-projektimme kanssa, tarvitsemme lisäkomponentteja, nimittäin:

  • Työkuorma C++-työkalut
  • Työkalusarja v141
  • Windows 10 SDK (10.0.17134.0)

Voit asentaa laajennetun työkalujoukon automaattisesti käyttämällä JSON-muodossa olevaa määritystiedostoa. Asetustiedoston sisältö:

Täydellinen luettelo saatavilla olevista komponenteista löytyy dokumentaatiosivustolta 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"
  ]
}

Docker-tiedosto suorittaa asennuskomentosarjan ja lisää käyttömukavuuden vuoksi polun rakennustyökalujen suoritettaviin tiedostoihin ympäristömuuttujaan PATH. On myös suositeltavaa poistaa tarpeettomat tiedostot ja hakemistot kuvan koon pienentämiseksi.

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)

Tässä vaiheessa C++-sovelluksen käännöskuvamme on valmis ja voimme siirtyä suoraan sovelluksen docker-monivaiheisen koontiversion luomiseen.

Monivaiheinen toiminnassa

Käytämme luotua kuvaa kaikilla mukana olevilla työkaluilla rakennuskuvana. Kuten edellisessä Dockerfile-skriptissä, lisäämme mahdollisuuden määrittää dynaamisesti versionumero/kuvatunniste koodin uudelleenkäytön helpottamiseksi. On tärkeää lisätä etiketti as builder ohjeen kokoonpanokuvaan FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Nyt on aika rakentaa sovellus. Kaikki täällä on melko yksinkertaista: kopioi lähdekoodi ja kaikki siihen liittyvä ja aloita käännösprosessi.

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

Lopullisen kuvan luomisen viimeinen vaihe on määrittää sovelluksen peruskuva, jossa kaikki kokoelman artefaktit ja asetustiedostot sijaitsevat. Jos haluat kopioida käännetyt tiedostot välikokoonpanon näköistiedostosta, sinun on määritettävä parametri --from=builder ohjeissa COPY.

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

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

Nyt on vain lisättävä tarvittavat riippuvuudet, jotta sovelluksemme toimii, ja määrittää käynnistyskomento ohjeiden avulla ENTRYPOINT tai CMD.

Johtopäätös

Tässä artikkelissa puhuin siitä, miten luodaan täysimittainen käännösympäristö C++-sovelluksille Windows-säilön sisällä ja kuinka voit käyttää docker-monivaiheisten koontiversioiden ominaisuuksia luomaan täysimittaisia ​​kuvia sovelluksestamme.

Lähde: will.com

Lisää kommentti