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.
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.
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ä:
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.
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.
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.
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.