ИзползванС Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠ΅Ρ‚Π°ΠΏΠ΅Π½ Π΄ΠΎΠΊΠ΅Ρ€ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° изобраТСния Π½Π° Windows

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ всички! Казвам сС АндрСй ΠΈ работя ΠΊΠ°Ρ‚ΠΎ DevOps ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ Π² Exness Π² Π΅ΠΊΠΈΠΏΠ° Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° ΠΌΠΈ дСйност Π΅ ΡΠ²ΡŠΡ€Π·Π°Π½Π° с ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅, внСдряванС ΠΈ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° прилоТСния Π² docker ΠΏΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π° систСма Linux (Π½Π°Ρ€ΠΈΡ‡Π°Π½Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ ОБ). НСотдавна ΠΈΠΌΠ°Ρ… Π·Π°Π΄Π°Ρ‡Π° със ΡΡŠΡ‰ΠΈΡ‚Π΅ дСйности, Π½ΠΎ Ρ†Π΅Π»Π΅Π²Π°Ρ‚Π° ОБ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° бСшС Windows Server ΠΈ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ C++ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ. Π—Π° ΠΌΠ΅Π½ Ρ‚ΠΎΠ²Π° бСшС ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ Π±Π»ΠΈΠ·ΠΊΠΎ взаимодСйствиС с Π΄ΠΎΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ ΠΏΠΎΠ΄ Windows OS ΠΈ ΠΊΠ°Ρ‚ΠΎ цяло с C++ прилоТСния. Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ°Ρ… интСрСсСн ΠΎΠΏΠΈΡ‚ ΠΈ Π½Π°ΡƒΡ‡ΠΈΡ… Π·Π° някои ΠΎΡ‚ Ρ‚ΡŠΠ½ΠΊΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° прилоТСния Π² Windows.

ИзползванС Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠ΅Ρ‚Π°ΠΏΠ΅Π½ Π΄ΠΎΠΊΠ΅Ρ€ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° изобраТСния Π½Π° Windows

Π’ Ρ‚Π°Π·ΠΈ статия искам Π΄Π° Π²ΠΈ Ρ€Π°Π·ΠΊΠ°ΠΆΠ° с ΠΊΠ°ΠΊΠ²ΠΈ трудности Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° сС сблъскам ΠΈ ΠΊΠ°ΠΊ успях Π΄Π° Π³ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°. Надявам сС, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π° Π²Π°ΡˆΠΈΡ‚Π΅ настоящи ΠΈ Π±ΡŠΠ΄Π΅Ρ‰ΠΈ прСдизвикатСлства. Наслади сС Π½Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅Ρ‚ΠΎ!

Π—Π°Ρ‰ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ?

ΠšΠΎΠΌΠΏΠ°Π½ΠΈΡΡ‚Π° Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π° със ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰Π° инфраструктура Π·Π° контСйнСрния оркСстратор Hashicorp Nomad ΠΈ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈΡ‚Π΅ с Π½Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ - Consul ΠΈ Vault. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ контСйнСризацията Π½Π° прилоТСнията бСшС ΠΈΠ·Π±Ρ€Π°Π½Π° ΠΊΠ°Ρ‚ΠΎ ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π° прСдоставянС Π½Π° цялостно Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Въй ΠΊΠ°Ρ‚ΠΎ инфраструктурата Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π΄ΠΎΠΊΠ΅Ρ€ хостовС с Windows Server Core OS вСрсии 1803 ΠΈ 1809, Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС изградят ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ вСрсии Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ изобраТСния Π·Π° 1803 ΠΈ 1809. Π’ΡŠΠ² вСрсия 1803 Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Π΅ рСвизионният Π½ΠΎΠΌΠ΅Ρ€ Π½Π° компилацията Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ хоста трябва Π΄Π° съвпада с Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° вСрсията Π½Π° Π±Π°Π·ΠΎΠ²ΠΎΡ‚ΠΎ Π΄ΠΎΠΊΠ΅Ρ€ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ хоста, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Ρ‰Π΅ бъдС стартиран ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΡŠΡ‚ ΠΎΡ‚ Ρ‚ΠΎΠ²Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ВСрсия 1809 няма Ρ‚Π°ΠΊΡŠΠ² Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Ρ‚ΡƒΠΊ.

Π—Π°Ρ‰ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠ΅Ρ‚Π°ΠΏΠ΅Π½?

Π˜Π½ΠΆΠ΅Π½Π΅Ρ€ΠΈΡ‚Π΅ Π½Π° Π΅ΠΊΠΈΠΏΠ° Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° нямат ΠΈΠ»ΠΈ ΠΈΠΌΠ°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° хостовС; няма Π½Π°Ρ‡ΠΈΠ½ Π·Π° Π±ΡŠΡ€Π·ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°Π±ΠΎΡ€Π° ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Ρ‚Π΅Π·ΠΈ хостовС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ инсталиранС Π½Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ инструмСнти ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π½ΠΎ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ Π·Π° Visual Studio. Π—Π°Ρ‚ΠΎΠ²Π° Π²Π·Π΅Ρ…ΠΌΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄Π° инсталирамС всички ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π² ΠΎΠ±Ρ€Π°Π·Π° Π½Π° Docker Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅. Ако Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±ΡŠΡ€Π·ΠΎ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ само Π΄ΠΎΠΊΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° ΠΈ Π΄Π° стартиратС ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° Π·Π° създаванС Π½Π° Ρ‚ΠΎΠ²Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

ΠžΡ‚ тСория към дСйствиС

Π’ ΠΈΠ΄Π΅Π°Π»Π½ΠΎΡ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠ΅Ρ‚Π°ΠΏΠ½ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Docker, срСдата Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ сС подготвя Π² ΡΡŠΡ‰ΠΈΡ Dockerfile скрипт, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ΠΎ самото ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Но Π² нашия случай бСшС Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡ‚ΡŠΠΏΠΊΠ°Ρ‚Π° Π·Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ създаванС Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с всичко Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. Π’ΠΎΠ²Π° бСшС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ исках Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ функцията Π·Π° Π΄ΠΎΠΊΠ΅Ρ€ кСш, Π·Π° Π΄Π° намаля Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° инсталиранС Π½Π° всички зависимости.

НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ основнитС Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° скрипта Π½Π° dockerfile Π·Π° създаванС Π½Π° Ρ‚ΠΎΠ²Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Π—Π° Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ изобраТСния Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ вСрсии Π½Π° ОБ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² Π΄ΠΎΠΊΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€Π΅Π· ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΏΡ€Π΅Π΄Π°Π²Π° Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° вСрсията ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° компилацията, ΠΈ Ρ‚ΠΎΠΉ ΡΡŠΡ‰ΠΎ Π΅ Ρ‚Π°Π³ΡŠΡ‚ Π½Π° Π±Π°Π·ΠΎΠ²ΠΎΡ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ пълСн списък Π½Π° Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ Π·Π° изобраТСния Π½Π° Microsoft Windows Server Ρ‚ΡƒΠΊ.

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

По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ Π² инструкциитС RUN Π²ΡŠΡ‚Ρ€Π΅ Π² dockerfile Π½Π° Windows OS Ρ‚Π΅ сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° 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++ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ към ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ ΠΌΠ½ΠΎΠ³ΠΎΠ΅Ρ‚Π°ΠΏΠ½Π° компилация Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ.

ΠœΠ½ΠΎΠ³ΠΎΠ΅Ρ‚Π°ΠΏΠ½ΠΎΡΡ‚ Π² дСйствиС

Π©Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡŠΠ·Π΄Π°Π΄Π΅Π½ΠΎΡ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с всички инструмСнти Π½Π° Π±ΠΎΡ€Π΄Π° ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅. ΠšΠ°ΠΊΡ‚ΠΎ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ скрипт Π½Π° 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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€