ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅! ΠΠ°Π·Π²Π°ΠΌ ΡΠ΅ ΠΠ½Π΄ΡΠ΅ΠΉ ΠΈ ΡΠ°Π±ΠΎΡΡ ΠΊΠ°ΡΠΎ 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?
ΠΠ½ΠΆΠ΅Π½Π΅ΡΠΈΡΠ΅ ΠΎΡ Π΅ΠΊΠΈΠΏΠΈΡΠ΅ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½ΡΠΌΠ°Ρ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠ±ΠΎΡΡΡΠ½ΠΈ Ρ ΠΎΡΡΠΎΠ²Π΅ ΠΈΠ»ΠΈ ΡΠΎΠΉ Π΅ ΡΠΈΠ»Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½, Π½ΡΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π±ΡΡΠ·ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°Π±ΠΎΡ ΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅Π·ΠΈ Ρ ΠΎΡΡΠΎΠ²Π΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ toolset ΠΈΠ»ΠΈ workload Π·Π° Visual Studio. ΠΠ°ΡΠΎΠ²Π° Π²Π·Π΅Ρ ΠΌΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ β Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π² ΡΠ±ΠΎΡΡΡΠ½ΠΈΡ docker ΠΎΠ±ΡΠ°Π·. ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΌΠΎΠΆΠ΅ Π±ΡΡΠ·ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ°ΠΌΠΎ dockerfile ΠΈ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΠΎΠ±ΡΠ°Π·.
ΠΡ ΡΠ΅ΠΎΡΠΈΡ ΠΊΡΠΌ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°
Π ΠΈΠ΄Π΅Π°Π»Π½Π°ΡΠ° Docker ΠΌΠ½ΠΎΠ³ΠΎΠ΅ΡΠ°ΠΏΠ½Π° ΡΠ±ΠΎΡΠΊΠ° ΠΎΠ±ΡΠ°Π·ΡΡ ΡΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Ρ Π² ΡΡΡΠΈΡ 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++ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ΅ ΡΠ° Π½ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:
- Workload C++ tools
- Toolset 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 ΠΊ ΡΠ±ΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ°Π· Π² ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ 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 Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½ΠΈ ΠΎΠ±ΡΠ°Π·ΠΈ Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
