Χρήση docker πολλαπλών σταδίων για τη δημιουργία εικόνων των Windows

Γεια σε όλους! Το όνομά μου είναι Andrey και εργάζομαι ως μηχανικός DevOps στην Exness στην ομάδα ανάπτυξης. Η κύρια δραστηριότητά μου σχετίζεται με τη δημιουργία, την ανάπτυξη και την υποστήριξη εφαρμογών στο docker στο λειτουργικό σύστημα Linux (εφεξής το λειτουργικό σύστημα). Πριν από λίγο καιρό είχα μια εργασία με τις ίδιες δραστηριότητες, αλλά το λειτουργικό σύστημα-στόχος του έργου ήταν ο Windows Server και ένα σύνολο έργων C++. Για μένα, αυτή ήταν η πρώτη στενή αλληλεπίδραση με κοντέινερ docker υπό λειτουργικό σύστημα Windows και, γενικά, με εφαρμογές C++. Χάρη σε αυτό, είχα μια ενδιαφέρουσα εμπειρία και έμαθα για μερικές από τις περιπλοκές των εφαρμογών κοντέινερ στα Windows.

Χρήση docker πολλαπλών σταδίων για τη δημιουργία εικόνων των Windows

Σε αυτό το άρθρο θέλω να σας πω ποιες δυσκολίες είχα να αντιμετωπίσω και πώς κατάφερα να τις λύσω. Ελπίζω ότι αυτό είναι χρήσιμο για τις τρέχουσες και μελλοντικές σας προκλήσεις. Απολαύστε την ανάγνωση!

Γιατί κοντέινερ;

Η εταιρεία διαθέτει υπάρχουσα υποδομή για τον ενορχηστρωτή κοντέινερ Hashicorp Nomad και συναφή εξαρτήματα - Consul and Vault. Ως εκ τούτου, η τοποθέτηση σε δοχεία εφαρμογής επιλέχθηκε ως ενοποιημένη μέθοδος για την παροχή μιας ολοκληρωμένης λύσης. Εφόσον η υποδομή του έργου περιέχει κεντρικούς υπολογιστές docker με εκδόσεις Windows Server Core OS 1803 και 1809, είναι απαραίτητο να δημιουργήσετε ξεχωριστές εκδόσεις εικόνων docker για το 1803 και το 1809. Στην έκδοση 1803, είναι σημαντικό να θυμάστε ότι ο αριθμός αναθεώρησης του κεντρικού υπολογιστή build docker πρέπει να ταιριάζει με τον αριθμό αναθεώρησης της βασικής εικόνας του docker και του κεντρικού υπολογιστή όπου θα εκκινηθεί το κοντέινερ από αυτήν την εικόνα. Η έκδοση 1809 δεν έχει τέτοιο μειονέκτημα. Μπορείτε να διαβάσετε περισσότερα εδώ.

Γιατί πολλαπλών σταδίων;

Οι μηχανικοί της ομάδας ανάπτυξης δεν έχουν ή έχουν πολύ περιορισμένη πρόσβαση στη δημιουργία κεντρικών υπολογιστών· δεν υπάρχει τρόπος γρήγορης διαχείρισης του συνόλου στοιχείων για τη δημιουργία μιας εφαρμογής σε αυτούς τους κεντρικούς υπολογιστές, για παράδειγμα, εγκατάσταση ενός πρόσθετου συνόλου εργαλείων ή φόρτου εργασίας για το Visual Studio. Ως εκ τούτου, πήραμε την απόφαση να εγκαταστήσουμε όλα τα στοιχεία που είναι απαραίτητα για τη δημιουργία της εφαρμογής στην εικόνα του build Docker. Εάν είναι απαραίτητο, μπορείτε να αλλάξετε γρήγορα μόνο το αρχείο docker και να ξεκινήσετε τη διοχέτευση για τη δημιουργία αυτής της εικόνας.

Από τη θεωρία στη δράση

Σε μια ιδανική κατασκευή εικόνων πολλαπλών σταδίων Docker, το περιβάλλον για τη δημιουργία της εφαρμογής προετοιμάζεται με το ίδιο σενάριο Dockerfile που έχει κατασκευαστεί η ίδια η εφαρμογή. Αλλά στην περίπτωσή μας, προστέθηκε ένας ενδιάμεσος σύνδεσμος, δηλαδή το βήμα της προκαταρκτικής δημιουργίας μιας εικόνας docker με όλα τα απαραίτητα για τη δημιουργία της εφαρμογής. Αυτό έγινε επειδή ήθελα να χρησιμοποιήσω τη λειτουργία κρυφής μνήμης docker για να μειώσω τον χρόνο εγκατάστασης όλων των εξαρτήσεων.

Ας δούμε τα κύρια σημεία του σεναρίου dockerfile για τη δημιουργία αυτής της εικόνας.

Για να δημιουργήσετε εικόνες διαφορετικών εκδόσεων λειτουργικού συστήματος, μπορείτε να ορίσετε ένα όρισμα στο αρχείο docker μέσω του οποίου μεταβιβάζεται ο αριθμός έκδοσης κατά τη διάρκεια της κατασκευής και είναι επίσης η ετικέτα της βασικής εικόνας.

Μπορείτε να βρείτε μια πλήρη λίστα ετικετών εικόνας του Microsoft Windows Server εδώ.

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

Από προεπιλογή οι εντολές στις οδηγίες RUN μέσα στο αρχείο docker στο λειτουργικό σύστημα Windows εκτελούνται στην κονσόλα cmd.exe. Για τη διευκόλυνση της σύνταξης σεναρίων και της επέκτασης της λειτουργικότητας των εντολών που χρησιμοποιούνται, θα επαναπροσδιορίσουμε την κονσόλα εκτέλεσης εντολών στο Powershell μέσω της εντολής SHELL.

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

Το επόμενο βήμα είναι να εγκαταστήσετε τον διαχειριστή πακέτων σοκολάτας και τα απαραίτητα πακέτα:

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'

Για να εγκαταστήσετε πακέτα χρησιμοποιώντας το chocolatey, μπορείτε απλά να τα μεταβιβάσετε ως λίστα ή να τα εγκαταστήσετε ένα κάθε φορά, εάν χρειάζεται να περάσετε μοναδικές παραμέτρους για κάθε πακέτο. Στην περίπτωσή μας, χρησιμοποιήσαμε ένα αρχείο δήλωσης σε μορφή XML, το οποίο περιέχει μια λίστα με τα απαιτούμενα πακέτα και τις παραμέτρους τους. Το περιεχόμενό του μοιάζει με αυτό:

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

Στη συνέχεια, εγκαθιστούμε το περιβάλλον δημιουργίας της εφαρμογής, συγκεκριμένα, MS Build Tools 2019 - αυτή είναι μια ελαφριά έκδοση του Visual Studio 2019, η οποία περιέχει το ελάχιστο απαιτούμενο σύνολο στοιχείων για τη μεταγλώττιση κώδικα.
Για να δουλέψουμε πλήρως με το έργο μας C++, θα χρειαστούμε πρόσθετα στοιχεία, και συγκεκριμένα:

  • Φόρτος εργασίας εργαλεία C++
  • Σετ εργαλείων v141
  • Windows 10 SDK (10.0.17134.0)

Μπορείτε να εγκαταστήσετε ένα εκτεταμένο σύνολο εργαλείων αυτόματα χρησιμοποιώντας ένα αρχείο διαμόρφωσης σε μορφή JSON. Περιεχόμενα αρχείου διαμόρφωσης:

Μπορείτε να βρείτε μια πλήρη λίστα με τα διαθέσιμα στοιχεία στον ιστότοπο τεκμηρίωσης Το 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 εκτελεί το σενάριο εγκατάστασης και για ευκολία, προσθέτει τη διαδρομή προς τα εκτελέσιμα αρχεία εργαλείων δημιουργίας στη μεταβλητή περιβάλλοντος PATH. Συνιστάται επίσης να αφαιρέσετε τα περιττά αρχεία και καταλόγους για να μειώσετε το μέγεθος της εικόνας.

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)

Σε αυτό το στάδιο, η εικόνα μας για τη μεταγλώττιση της εφαρμογής C++ είναι έτοιμη και μπορούμε να προχωρήσουμε απευθείας στη δημιουργία μιας πολυβάθμιας κατασκευής docker της εφαρμογής.

Πολλαπλών σταδίων σε δράση

Θα χρησιμοποιήσουμε τη δημιουργημένη εικόνα με όλα τα εργαλεία που υπάρχουν ως εικόνα κατασκευής. Όπως και στο προηγούμενο σενάριο dockerfile, θα προσθέσουμε τη δυνατότητα δυναμικού καθορισμού του αριθμού έκδοσης/ετικέτας εικόνας για ευκολία στην επαναχρησιμοποίηση του κώδικα. Είναι σημαντικό να προσθέσετε μια ετικέτα as builder στην εικόνα συναρμολόγησης στις οδηγίες FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

Τώρα ήρθε η ώρα να δημιουργήσετε την εφαρμογή. Όλα εδώ είναι πολύ απλά: αντιγράψτε τον πηγαίο κώδικα και όλα όσα σχετίζονται με αυτόν και ξεκινήστε τη διαδικασία μεταγλώττισης.

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

Το τελικό στάδιο της δημιουργίας της τελικής εικόνας είναι να καθορίσετε τη βασική εικόνα της εφαρμογής, όπου θα βρίσκονται όλα τα τεχνουργήματα μεταγλώττισης και τα αρχεία διαμόρφωσης. Για να αντιγράψετε μεταγλωττισμένα αρχεία από την εικόνα της ενδιάμεσης συναρμολόγησης, πρέπει να καθορίσετε την παράμετρο --from=builder στις οδηγίες COPY.

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

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

Τώρα το μόνο που μένει είναι να προσθέσουμε τις απαραίτητες εξαρτήσεις για να λειτουργήσει η εφαρμογή μας και να καθορίσουμε την εντολή εκκίνησης μέσω των οδηγιών ENTRYPOINT ή CMD.

Συμπέρασμα

Σε αυτό το άρθρο, μίλησα για το πώς να δημιουργήσετε ένα πλήρες περιβάλλον μεταγλώττισης για εφαρμογές C++ μέσα σε ένα κοντέινερ στα Windows και πώς να χρησιμοποιήσετε τις δυνατότητες των εκδόσεων πολλαπλών σταδίων docker για τη δημιουργία πλήρους εικόνων της εφαρμογής μας.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο