ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅! ΠΠ· ΡΡΠΌ ΠΠ½Π΄ΡΠ΅ΠΉ ΠΈ ΡΠ°Π±ΠΎΡΡ ΠΊΠ°ΡΠΎ DevOps ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° Exness Π² Π΅ΠΊΠΈΠΏΠ° Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΌΠΈ Π΄Π΅ΠΉΠ½ΠΎΡΡ Π΅ ΡΠ²ΡΡΠ·Π°Π½Π° ΡΡΡ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ, Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Docker ΠΏΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Linux. ΠΠ°ΠΏΠΎΡΠ»Π΅Π΄ΡΠΊ ΠΌΠΈ Π²ΡΠ·Π»ΠΎΠΆΠΈΡ Π° Π·Π°Π΄Π°ΡΠ° Ρ ΡΡΡΠΈΡΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ, Π½ΠΎ ΠΊΠ°ΡΠΎ ΡΠ΅Π»Π΅Π²Π° ΠΠ‘ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΡΠ°Π½Π° Windows Server ΠΈ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π½Π° C++. ΠΠ° ΠΌΠ΅Π½ ΡΠΎΠ²Π° Π±Π΅ΡΠ΅ ΠΏΡΡΠ²ΠΎΡΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΏΠΎΠ΄ Windows ΠΈ ΠΈΠ·ΠΎΠ±ΡΠΎ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° C++. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΠ²Π° ΠΏΠΎΠ»ΡΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΠΎΠΏΠΈΡ ΠΈ Π½Π°ΡΡΠΈΡ Π½ΡΠΊΠΎΠΈ ΡΡΠ½ΠΊΠΎΡΡΠΈ ΠΏΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Windows.

Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»Ρ Ρ ΠΊΠ°ΠΊΠ²ΠΈ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ²Π°Ρ ΠΈ ΠΊΠ°ΠΊ ΡΡΠΏΡΡ Π΄Π° Π³ΠΈ ΡΠ΅ΡΠ°. ΠΠ°Π΄ΡΠ²Π°ΠΌ ΡΠ΅, ΡΠ΅ ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π²Π°ΡΠΈΡΠ΅ ΡΠ΅ΠΊΡΡΠΈ ΠΈ Π±ΡΠ΄Π΅ΡΠΈ Π·Π°Π΄Π°ΡΠΈ. ΠΡΠΈΡΡΠ½ΠΎ ΡΠ΅ΡΠ΅Π½Π΅!
ΠΠ°ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ?
Π ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π½Π° ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Hashicorp Nomad ΠΈ ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ β Consul ΠΈ Vault. ΠΠ°ΡΠΎΠ²Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° Π±Π΅ΡΠ΅ ΠΈΠ·Π±ΡΠ°Π½Π° ΠΊΠ°ΡΠΎ ΡΠ½ΠΈΡΠΈΡΠΈΡΠ°Π½ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° Π³ΠΎΡΠΎΠ²ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π² ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈΠΌΠ° Docker Ρ ΠΎΡΡΠΎΠ²Π΅ Ρ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΠΠ‘ Windows Server Core 1803 ΠΈ 1809, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ ΠΎΡΠ΄Π΅Π»Π½ΠΎ Π²Π΅ΡΡΠΈΠΈ Π½Π° Docker ΠΎΠ±ΡΠ°Π·ΠΈΡΠ΅ Π·Π° 1803 ΠΈ 1809. Π Π²Π΅ΡΡΠΈΡ 1803 Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠΌΠ½ΠΈ, ΡΠ΅ Π½ΠΎΠΌΠ΅ΡΡΡ Π½Π° ΡΠ΅Π²ΠΈΠ·ΠΈΡΡΠ° Π½Π° ΡΠ±ΠΎΡΡΡΠ½ΠΈΡ Docker Ρ ΠΎΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ²ΠΏΠ°Π΄Π° Ρ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΡΠ΅Π²ΠΈΠ·ΠΈΡΡΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ Docker ΠΎΠ±ΡΠ°Π· ΠΈ Ρ ΠΎΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ ΠΎΡ ΡΠΎΠ·ΠΈ ΠΎΠ±ΡΠ°Π· ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½. ΠΠ΅ΡΡΠΈΡ 1809 Π΅ Π»ΠΈΡΠ΅Π½Π° ΠΎΡ ΡΠΎΠ·ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ. ΠΠΎΠ²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ .
ΠΠ°ΡΠΎ multi-stage?
Π£ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΈΡΠ΅ ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ½ΠΈΡΠ΅ Π΅ΠΊΠΈΠΏΠΈ Π΄ΠΎΡΡΡΠΏΡΡ Π΄ΠΎ ΡΠ±ΠΎΡΡΡΠ½ΠΈ Ρ ΠΎΡΡΠΎΠ²Π΅ Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΠΈΠ»ΠΈ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΎΡΡΡΡΡΠ²Π°, Π½ΡΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π±ΡΡΠ·ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°Π±ΠΎΡΠ° ΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° ΡΠ±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅Π·ΠΈ Ρ ΠΎΡΡΠΎΠ²Π΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌ ΠΈΠ»ΠΈ ΡΠ°Π±ΠΎΡΠ΅Π½ ΡΠΎΠ²Π°Ρ Π·Π° Visual Studio. ΠΠ°ΡΠΎΠ²Π° Π²Π·Π΅Ρ ΠΌΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ β Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° ΡΠ±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π² ΡΠ±ΠΎΡΡΡΠ½ΠΈΡ Docker ΠΎΠ±ΡΠ°Π·. ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π±ΡΡΠ·ΠΎ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ ΡΠ°ΠΌΠΎ Dockerfile ΠΈ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΎΠ±ΡΠ°Π·.
ΠΡ ΡΠ΅ΠΎΡΠΈΡ ΠΊΡΠΌ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°
Π ΠΈΠ΄Π΅Π°Π»Π½Π°ΡΠ° docker multi-stage ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠ±ΡΠ°Π·Π° ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°ΡΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π² ΡΡΡΠΈΡ dockerfile ΡΠΊΡΠΈΠΏΡ, Π² ΠΊΠΎΠΉΡΠΎ Π΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠΎ Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π±Π΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΎ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΎ Π·Π²Π΅Π½ΠΎ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, ΡΡΡΠΏΠΊΠ° Π·Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° docker-ΠΎΠ±ΡΠ°Π·Π° Ρ Π²ΡΠΈΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π’ΠΎΠ²Π° Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ, Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π½Π° docker ΠΊΠ΅ΡΠ°, Π·Π° Π΄Π° ΡΠ΅ ΡΡΠΊΡΠ°ΡΠΈ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΠΈ ΠΎΡ dockerfile ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΠΎΠ±ΡΠ°Π·.
ΠΠ° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΎΠ±ΡΠ°Π·ΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΠΠ‘ Π² dockerfile ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΠΏΡΠ΅Π· ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° Π½ΠΎΠΌΠ΅ΡΡΡ Π½Π° Π²Π΅ΡΡΠΈΡΡΠ°, ΠΈ ΡΠΎΠΉ Π΅ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ°Π³ Π½Π° Π±Π°Π·ΠΎΠ²ΠΈΡ ΠΎΠ±ΡΠ°Π·.
ΠΡΠ»Π΅Π½ ΡΠΏΠΈΡΡΠΊ Ρ ΡΠ°Π³ΠΎΠ²Π΅ Π½Π° ΠΎΠ±ΡΠ°Π·ΠΈ Microsoft Windows Server ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ .
ARG WINDOWS_OS_VERSION=1809
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSIONΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π² ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΡΠ° RUN Π²ΡΡΡΠ΅ Π² dockerfile Π² ΠΠ‘ Windows ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° cmd.exe. ΠΠ° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΠΈ ΡΠ°Π·ΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΡΠ΅ ΠΏΡΠ΅Π½Π°ΡΡΡΠΎΠΈΠΌ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π½Π° Powershell ΡΡΠ΅Π· ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΡΠ° SHELL.
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]Π‘Π»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΡΠΏΠΊΠ° Π΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ chocolatey ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ:
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 ΡΠΎΡΠΌΠ°Ρ. Π‘ΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ»:
ΠΡΠ»Π½ΠΈΡΡ ΡΠΏΠΈΡΡΠΊ Ρ Π½Π°Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° ΡΠ°ΠΉΡΠ° Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ .
{
"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 ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΠΊΡΠΈΠΏΡ Π·Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ, ΠΈ Π·Π° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΡΠ΅ Π΄ΠΎΠ±Π°Π²Ρ ΠΏΡΡ ΠΊΡΠΌ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° build tools Π² ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° 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 multi-stage ΡΠ±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
Multi-stage Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅
ΠΠ°ΡΠΎ ΡΠ±ΠΎΡΡΡΠ΅Π½ ΠΎΠ±ΡΠ°Π· ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π· Ρ Π²ΡΠΈΡΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π½Π° Π±ΠΎΡΠ΄Π°. ΠΠ°ΠΊΡΠΎ Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ dockerfile ΡΠΊΡΠΈΠΏΡ, Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠΊΠ°ΠΆΠ΅ΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° Π²Π΅ΡΡΠΈΡΡΠ°/ΡΠ΅Π³Π° Π½Π° ΠΎΠ±ΡΠ°Π·Π° Π·Π° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΠΏΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Π½Π° ΠΊΠΎΠ΄Π°. ΠΠ°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈ Π΅ΡΠΈΠΊΠ΅Ρ as builder ΠΊΡΠΌ ΡΠ±ΠΎΡΡΡΠ½ΠΈΡ ΠΎΠ±ΡΠ°Π· Π² ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ OT.
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 multi-stage Π±ΠΈΠ»Π΄ΠΎΠ²Π΅ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°ΡΠΈ ΠΎΠ±ΡΠ°Π·ΠΈ Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
