Utilizà docker multi-stage per custruisce immagini di Windows
Salut à tutti ! Mi chjamu Andrey, è travagliu cum'è ingegnere DevOps à Exness in u squadra di sviluppu. A mo attività principale hè ligata à a creazione, implementazione è supportu di l'applicazioni in docker sottu u sistema operatore Linux (in seguitu chjamatu OS). Pocu pocu fà aghju avutu un compitu cù e listesse attività, ma u SO di destinazione di u prughjettu era Windows Server è un settore di prughjetti C++. Per mè, questa hè stata a prima interazzione stretta cù i cuntenituri docker sottu Windows OS è, in generale, cù l'applicazioni C++. Grazie à questu, aghju avutu una sperienza interessante è hà amparatu alcune di l'intricacies di l'applicazioni containerizing in Windows.
In questu articulu, vogliu dì chì e difficultà ch'e aghju avutu per affruntà è cumu aghju riisciutu à risolve. Spergu chì questu hè utile per i vostri sfidi attuali è futuri. Prufittate a lettura!
Perchè cuntenituri?
A cumpagnia hà una infrastruttura esistente per l'orchestratore di container Hashicorp Nomad è cumpunenti cunnessi - Consul è Vault. Dunque, a containerizazione di l'applicazioni hè stata scelta cum'è un metudu unificatu per furnisce una suluzione cumpleta. Siccomu l'infrastruttura di u prughjettu cuntene docker hosts cù Windows Server Core OS versioni 1803 è 1809, hè necessariu di custruisce versioni separati di l'imaghjini docker per 1803 è 1809. In a versione 1803, hè impurtante ricurdà chì u numeru di rivisione di u build docker host. deve currisponde à u numeru di rivisione di l'imaghjini di basa di docker è l'ospitu induve u cuntinuu da sta maghjina serà lanciatu. A versione 1809 ùn hà micca tali inconvenienti. Pudete leghje più ccà.
Perchè multi-stadi?
L'ingegneri di u squadra di sviluppu ùn anu micca accessu o assai limitatu per custruisce l'ospiti; ùn ci hè manera di gestisce rapidamente u settore di cumpunenti per a custruzzione di una applicazione nantu à questi ospiti, per esempiu, installà un set di strumenti supplementari o una carica di travagliu per Visual Studio. Dunque, avemu pigliatu a decisione di installà tutti i cumpunenti necessarii per custruisce l'applicazione in l'imagine Docker di custruzzione. Se necessariu, pudete cambià rapidamente solu u dockerfile è lanciate u pipeline per creà sta maghjina.
Da a teoria à l'azzione
In una creazione ideale di l'imaghjini di Docker in più tappe, l'ambiente per custruisce l'applicazione hè preparatu in u stessu script Dockerfile cum'è l'applicazione stessa hè custruita. Ma in u nostru casu, hè statu aghjuntu un ligame intermediu, à dì, u passu di creazione preliminare di una maghjina docker cù tuttu ciò chì hè necessariu per custruisce l'applicazione. Questu hè statu fattu perchè vulia utilizà a funzione di cache di docker per riduce u tempu di stallazione di tutte e dependenze.
Fighjemu i punti principali di u dockerfile script per creà sta maghjina.
Per creà l'imaghjini di e diverse versioni di u SO, pudete definisce un argumentu in u dockerfile per quale u numeru di versione hè passatu durante a custruzzione, è hè ancu a tag di l'imaghjini di basa.
Una lista cumpleta di e tag di l'imagine di Microsoft Windows Server pò esse truvata ccà.
ARG WINDOWS_OS_VERSION=1809
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION
Per automaticamente i cumandamenti in l'istruzzioni RUN in u dockerfile in u sistema operativu Windows sò eseguiti in a cunsola cmd.exe. Per a cunvenzione di scrive scripts è espansione a funziunalità di i cumandamenti utilizati, ridefiniremu a cunsola di esecuzione di cumandamenti in Powershell attraversu l'istruzzioni. SHELL.
Per installà pacchetti chì utilizanu chocolatey, pudete solu passà cum'è una lista, o installate unu à un tempu se avete bisognu di passà paràmetri unichi per ogni pacchettu. In a nostra situazione, avemu usatu un schedariu manifestu in u furmatu XML, chì cuntene una lista di pacchetti necessarii è i so paràmetri. U so cuntenutu pare cusì:
In seguitu, installemu l'ambiente di creazione di l'applicazioni, vale à dì, MS Build Tools 2019 - questa hè una versione ligera di Visual Studio 2019, chì cuntene l'inseme minimu di cumpunenti necessarii per a compilazione di codice.
Per travaglià cumplettamente cù u nostru prughjettu C ++, avemu bisognu di cumpunenti supplementari, vale à dì:
Carichi di travagliu C++ Strumenti
Toolset v141
Windows 10 SDK (10.0.17134.0)
Pudete installà un inseme allargatu di strumenti automaticamente utilizendu un schedariu di cunfigurazione in formatu JSON. Cuntenutu di u schedariu di cunfigurazione:
Una lista cumpleta di cumpunenti dispunibuli pò esse truvata nantu à u situ di documentazione Microsoft Visual Studio.
U dockerfile esegue u script d'installazione, è per comodità, aghjunghjenu u percorsu à i fugliali eseguibili di strumenti di creazione à a variabile di l'ambiente. PATH. Hè ancu cunsigliatu di sguassà i fugliali è cartulari innecessarii per riduce a dimensione di l'imaghjini.
In questa fase, a nostra maghjina per cumpilà l'applicazione C++ hè pronta, è pudemu prucede direttamente à creà un docker multi-stage build di l'applicazione.
Multi-stadi in azzione
Avemu aduprà l'imaghjini creatu cù tutti l'arnesi à bordu cum'è una maghjina di custruzzione. Cum'è in l'script dockerfile precedente, aghjunghjemu a capacità di specificà dinamicamente u numeru di versione / tag di l'imaghjini per facilità di reutilizazione di codice. Hè impurtante di aghjunghje una etichetta as builder à l'imaghjini di l'assemblea in l'istruzzioni FROM.
ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder
Avà hè u tempu di custruisce l'applicazione. Tuttu quì hè abbastanza simplice: copià u codice fonte è tuttu ciò chì hè assuciatu cù questu, è principià u prucessu di compilazione.
L'ultima tappa di a creazione di l'imaghjini finali hè di specificà l'imaghjini di basa di l'applicazione, induve si trovanu tutti l'artefatti di compilazione è i schedarii di cunfigurazione. Per copià i fugliali compilati da l'imaghjini di l'assemblea intermediata, deve specificà u paràmetru --from=builder in l'istruzzioni COPY.
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION
COPY --from=builder C:/x64/Release/myapp/ ./
COPY ./configs ./
Avà tuttu ciò chì resta hè di aghjunghje e dipendenze necessarie per a nostra applicazione per travaglià è specificà u cumandamentu di lanciamentu attraversu l'istruzzioni ENTRYPOINT o CMD.
cunchiusioni
In questu articulu, aghju parlatu di cumu creà un ambiente di compilazione cumpletu per l'applicazioni C ++ in un containeru sottu Windows è cumu utilizà e capacità di docker multi-stage builds per creà l'imaghjini cumpletu di a nostra applicazione.