Docker többlépcsős használata Windows képek készítéséhez
Sziasztok! A nevem Andrey, és DevOps mérnökként dolgozom az Exnessnél a fejlesztőcsapatban. Fő tevékenységem a Linux operációs rendszer (továbbiakban: OS) alatti dockerben történő alkalmazások felépítése, telepítése és támogatása. Nemrég volt egy feladatom ugyanezekkel a tevékenységekkel, de a projekt cél operációs rendszere a Windows Server és egy sor C++ projekt volt. Számomra ez volt az első szoros interakció a docker konténerekkel Windows operációs rendszer alatt és általában a C++ alkalmazásokkal. Ennek köszönhetően érdekes tapasztalatokkal gazdagodtam, és megismerhettem a Windows-ban futó alkalmazások konténerezésének néhány bonyolultságát.
Ebben a cikkben szeretném elmondani, milyen nehézségekkel kellett szembenéznem, és hogyan sikerült megoldanom azokat. Remélem, hogy ez hasznos lesz a jelenlegi és jövőbeli kihívásaiban. Élvezd az olvasást!
Miért konténerek?
A vállalat meglévő infrastruktúrával rendelkezik a Hashicorp Nomad konténer-hangszerelőhöz és a kapcsolódó alkatrészekhez - a Consul és a Vault. Ezért az alkalmazáskonténerezést választották, mint egységes módszert a teljes megoldás szállítására. Mivel a projekt infrastruktúrája 1803-as és 1809-es Windows Server Core OS-verziójú docker gazdagépeket tartalmaz, különálló verziójú docker-képfájlokat kell készíteni az 1803-as és 1809-es verziókhoz. Az 1803-as verzióban fontos megjegyezni, hogy a build docker gazdagép verziószáma meg kell egyeznie az alap docker-kép és annak a gazdagépnek a verziószámával, amelyen a lemezkép tárolója elindul. Az 1809-es verziónak nincs ilyen hátránya. Bővebben olvashatsz itt.
Miért többlépcsős?
A fejlesztőcsapat mérnökei nem vagy csak nagyon korlátozottan férnek hozzá a gazdagépek létrehozásához; nincs mód arra, hogy gyorsan felügyeljék az alkalmazást ezeken a gazdagépeken az összetevőkészletet, például további eszközkészletet vagy munkaterhelést telepítsenek a Visual Studio számára. Ezért úgy döntöttünk, hogy az alkalmazás építéséhez szükséges összes összetevőt telepítjük a Buil Docker lemezképbe. Ha szükséges, gyorsan módosíthatja csak a dockerfájlt, és elindíthatja a folyamatot a kép létrehozásához.
Az elmélettől a cselekvésig
Egy ideális Docker többlépcsős képfelépítésben az alkalmazás létrehozásának környezete ugyanabban a Dockerfile-szkriptben készül, mint maga az alkalmazás. De a mi esetünkben egy köztes hivatkozás került hozzáadásra, nevezetesen az a lépés, hogy előzetesen létrehozunk egy docker-képet, amelyben minden szükséges az alkalmazás elkészítéséhez. Erre azért került sor, mert a docker gyorsítótár funkcióját akartam használni az összes függőség telepítési idejének csökkentésére.
Nézzük meg a dockerfile szkript főbb pontjait a kép létrehozásához.
Különböző operációs rendszer-verziók képeinek létrehozásához a dockerfájlban megadhat egy argumentumot, amelyen keresztül a verziószám átkerül az összeállítás során, és ez egyben az alapkép címkéje is.
A Microsoft Windows Server képcímkék teljes listája megtalálható itt.
ARG WINDOWS_OS_VERSION=1809
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION
Alapértelmezés szerint az utasításokban szereplő parancsok RUN a Windows operációs rendszer dockerfájljában a cmd.exe konzolban futnak le. A szkriptek írásának kényelme és a használt parancsok funkcionalitásának bővítése érdekében újradefiniáljuk a parancsvégrehajtási konzolt a Powershellben az utasítás segítségével. SHELL.
A csokoládé csomagok telepítéséhez egyszerűen átadhatja őket listaként, vagy egyenként telepítheti őket, ha minden csomaghoz egyedi paramétereket kell átadnia. A mi helyzetünkben egy XML formátumú manifest fájlt használtunk, amely tartalmazza a szükséges csomagok listáját és azok paramétereit. A tartalma így néz ki:
Ezután telepítjük az alkalmazásépítési környezetet, nevezetesen az MS Build Tools 2019-et - ez a Visual Studio 2019 könnyű verziója, amely tartalmazza a kódfordításhoz szükséges minimális összetevőkészletet.
A C++ projektünk teljes körű használatához további összetevőkre lesz szükségünk, nevezetesen:
Munkaterhelés C++ eszközök
Eszközkészlet v141
Windows 10 SDK (10.0.17134.0)
Az eszközök bővített készletét automatikusan telepítheti egy JSON formátumú konfigurációs fájl használatával. A konfigurációs fájl tartalma:
Az elérhető összetevők teljes listája a dokumentációs oldalon található Microsoft Visual Studio.
A dockerfile futtatja a telepítő szkriptet, és a kényelem kedvéért hozzáadja a Build Tool futtatható fájlok elérési útját a környezeti változóhoz PATH. A kép méretének csökkentése érdekében a szükségtelen fájlokat és könyvtárakat is célszerű eltávolítani.
Ebben a szakaszban elkészült a C++ alkalmazás fordítására szolgáló képünk, és közvetlenül folytathatjuk az alkalmazás többlépcsős docker buildjének létrehozását.
Többlépcsős működés közben
A létrehozott képet a fedélzeten lévő összes eszközzel együtt build képként fogjuk használni. Az előző dockerfile szkripthez hasonlóan a kód újrafelhasználásának megkönnyítése érdekében hozzáadjuk a verziószám/képcímke dinamikus megadásának lehetőségét. Fontos a címke hozzáadása as builder az útmutatóban található összeállítási képre FROM.
ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder
Most itt az ideje az alkalmazás elkészítésének. Itt minden nagyon egyszerű: másolja ki a forráskódot és mindent, ami hozzá tartozik, és indítsa el a fordítási folyamatot.
A végső kép létrehozásának utolsó szakasza az alkalmazás alapképének megadása, ahol az összes összeállítási műtermék és konfigurációs fájl található. A lefordított fájlok közbülső összeállítási lemezképről történő másolásához meg kell adnia a paramétert --from=builder az utasításokban COPY.
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION
COPY --from=builder C:/x64/Release/myapp/ ./
COPY ./configs ./
Most már nincs más hátra, mint hozzáadni az alkalmazásunk működéséhez szükséges függőségeket, és az utasításokon keresztül megadni az indítási parancsot ENTRYPOINT vagy CMD.
Következtetés
Ebben a cikkben arról beszéltem, hogyan hozhatunk létre teljes értékű fordítási környezetet C++ alkalmazásokhoz egy konténeren belül Windows alatt, és hogyan használhatjuk ki a docker többlépcsős buildjeit az alkalmazásunk teljes értékű képeinek létrehozásához.