á¡á¬ážáá¯á¶ážáááºá¹ááá¬áá«! áá»áœááºá¯ááºáá¡áááºááŸá¬ Andrey ááŒá áºááŒá®áž ááœá¶á·ááŒáá¯ážááá¯ážáááºáá±ážá¡ááœá²á·ááœáẠExness ááœáẠDevOps á¡ááºáá»ááºáá®áá¬á¡ááŒá Ạáá¯ááºáá±á¬ááºáá«áááºá áá»áœááºá¯ááºáá¡ááááá¯ááºáá±á¬ááºáá»ááºááẠLinux áááºáááºááŸá¯á áá áºá¡á±á¬ááºááŸá docker ááœáẠá¡ááá®áá±ážááŸááºážáá»á¬ážáááºáá±á¬ááºááŒááºážá ááŒáá·áºáá»ááºááŒááºážááŸáá·áº áá¶á·ááá¯ážáá±ážááŒááºážááŸáá·áº áááºááá¯ááºááẠ(áá±á¬ááºááœáẠOS áá¯áááºááœáŸááºážáááº)á áááŒá¬áá±ážáá®á áá»áœááºá¯ááºááœáẠá¡áá¬ážáá°áá¯ááºáá±á¬ááºááŸá¯áá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºá áá¬áá áºáá¯ááŸááá²á·áá±á¬áºáááºáž ááá±á¬áá»ááºááá áºááŸáẠOS ááŸá¬ Windows Server ááŸáá·áº C++ ááá±á¬áá»ááºáá»á¬ážááŒá áºáááºá áá»áœááºá¯ááºá¡ááœááºá áááºážááẠWindows OS á¡á±á¬ááºááŸá docker containers ááŸáá·áº áá±áá¯áá»á¡á¬ážááŒáá·áº C++ á¡ááá®áá±ážááŸááºážáá»á¬ážááŸáá·áº ááááá¯á¶áž á¡áá®ážáááºá¡ááŒááºá¡ááŸááºáááºááœááºááŸá¯ááŒá áºáááºá á€á¡ááœááºááŒá±á¬áá·áº áá»áœááºá¯ááºááẠá áááºáááºá á¬ážá áá¬áá±á¬ááºážáá±á¬ á¡ááœá±á·á¡ááŒá¯á¶áá áºáá¯ááá²á·ááŒá®áž Windows ááœáẠááœááºááááºáá¬ááŒá¯áá¯ááºááŒááºážááá¯ááºáᬠá¡ááá®áá±ážááŸááºážáá»á¬ážá ááŸá¯ááºááœá±ážááŸá¯á¡áá»áá¯á·ááᯠáá±á·áá¬áá²á·áááºá
áá®áá±á¬ááºážáá«ážááŸá¬ áááºááá¯á¡áááºá¡áá²ááœá±áá²á· áááºááá¯ááºáá²á·ááááºááá¯áᬠááŒá±á¬ááŒáá»ááºáá«áááºá ááá·áºáááºááŸáááŸáá·áº á¡áá¬áááºá áááºáá±á«áºááŸá¯áá»á¬ážá¡ááœáẠá¡áá±á¬ááºá¡áá°ááŒá áºáááºáᯠáá»áŸá±á¬áºááá·áºáá«áááºá áááºááŸá¯áá¶á á¬ážáá«á
á¡áááºááŒá±á¬áá·áºááœááºááááºáá¬áá»á¬áž
áá¯áá¹ááá®ááœáẠHashicorp Nomad ááœááºááááºáá¬áá¶á
á¯á¶áá®ážááá¯ááºážááŸáá·áº áááºá
ááºá¡á
áááºá¡ááá¯ááºážáá»á¬áž - Consul ááŸáá·áº Vault á¡ááœáẠáááºááŸáá¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠáá»á¬áž ááŸááááºá ááá¯á·ááŒá±á¬áá·áº áá»áŸá±á¬ááºááœáŸá¬áááºááŒááºážá¡á¬áž ááŒá®ážááŒáá·áºá
á¯á¶áá±á¬ ááŒá±ááŸááºážáá»ááºáá±ážáá±á¬ááºáááºá¡ááœáẠáá±á«ááºážá
ááºážáá¬ážáá±á¬áááºážáááºážá¡ááŒá
Ạááœá±ážáá»ááºáá²á·áááºá ááá±á¬áá»ááºá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááœáẠWindows Server Core OS áá¬ážááŸááºáž 1803 ááŸáá·áº 1809 áá«ááŸááá±á¬ docker host áá»á¬ážáá«áááºáá±á¬ááŒá±á¬áá·áºá 1803 ááŸáá·áº 1809 á¡ááœáẠdocker áá¯á¶áá»á¬ážá áá®ážááŒá¬ážáá¬ážááŸááºážáá»á¬ážááᯠáááºáá±á¬ááºááẠááá¯á¡ááºáá«áááºá áá¬ážááŸááºáž 1803 ááœááºá build docker host á ááŒááºáááºááŒááºáááºááŸá¯áá¶áá«ááºááᯠááŸááºáá¬ážáá¬ážááẠá¡áá±ážááŒá®ážáá«áááºá á¡ááŒá±áᶠdocker áá¯ááºáá¯á¶á áááºážááŒááºááŸá¯áá¶áá«ááºááŸáá·áº á€áá¯á¶á០ááœááºááááºáá¬ááᯠá
áááºááá·áºáá±áá¬ááŸáá·áº ááá¯ááºáá®ááá«áááºá áá¬ážááŸááºáž 1809 ááœááºááá¯áá²á·ááá¯á·áá±á¬á¡á¬ážáááºážáá»ááºáááŸááá«á á
á¬áá»á¬ážáá»á¬ážáááºááá¯á·ááááºá
á¡áááºááŒá±á¬áá·áº multi-stage?
ááœá¶á·ááŒáá¯ážáá±ážá¡ááœá²á· á¡ááºáá»ááºáá®áá¬áá»á¬ážááẠhost áá»á¬ážáááºáá±á¬ááºááẠááá¯á·ááá¯áẠá¡ááœááºá¡ááá·áºá¡áááºáááŸáá ဠhost áá»á¬ážáá±á«áºááœáẠá¡ááá®áá±ážááŸááºážáá áºáá¯áááºáá±á¬ááºáááºá¡ááœáẠá¡á áááºá¡ááá¯ááºážá¡á á¯á¶ááᯠáá»ááºááŒááºá áœá¬á á®áá¶ááá·áºááœá²ááẠáááºážáááºážáááŸááá«á á¥ááá¬á Visual Studio á¡ááœáẠáá±á¬ááºáááºáááááá¬á¡á á¯á¶áá áºáᯠááá¯á·ááá¯áẠá¡áá¯ááºááá¬áááᯠááá·áºááœááºážáá«á ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááá®áá±ážááŸááºážááᯠáááºáá±á¬ááºáááºá¡ááœáẠDocker áá¯á¶ááœáẠááá¯á¡ááºáá±á¬ á¡á áááºá¡ááá¯ááºážá¡á¬ážáá¯á¶ážááᯠááá·áºááœááºážááẠáá¯á¶ážááŒááºáá²á·áááºá ááá¯á¡ááºáá«á áááºááẠdockerfile ááá¯áá¬áá»ááºááŒááºá áœá¬ááŒá±á¬ááºážáá²ááá¯ááºááŒá®áž á€áá¯á¶áááºáá®ážáááºá¡ááœáẠááá¯ááºááá¯ááºážááá¯ááœáá·áºááá¯ááºáááºá
áá®á¡áá¯áá®á០áá¯ááºáá±á¬ááºáá»ááºá¡áá
á á¶áጠDocker multi-stage áá¯ááºáá¯á¶áááºáá±á¬ááºááŸá¯ááœááºá á¡ááá®áá±ážááŸááºážáááºáá±á¬ááºáááºá¡ááœáẠáááºáááºážáá»ááºááᯠá¡ááá®áá±ážááŸááºážááá¯ááºááá¯ááºáááºáá±á¬ááºáá¬ážááá·áºá¡ááá¯ááºáž Dockerfile script áá áºáá¯áááºážááœáẠááŒááºáááºáá¬ážáááºá ááá¯á·áá±á¬áºáá»áœááºá¯ááºááá¯á·áááá á¹á ááœááºá á¡áááºá¡áááºááá·áºááºáá áºáá¯áááºááá·áºáá²á·áááºá ááŒá±á¬ááááºá á¡ááá®áá±ážááŸááºážáááºáá±á¬ááºáááºááá¯á¡ááºááá»áŸááŸáá·áºá¡áá° docker áá¯á¶áá áºáá¯áááºáá®ážááŒááºážáááá¬áááŒá±ááŸááºážá ááŸá®ááá¯ááŸá¯á¡á¬ážáá¯á¶ážá áááºáááºáá»áááºááᯠáá»áŸá±á¬á·áá»ááẠdocker cache á¡ááºá¹áá«áááºááᯠá¡áá¯á¶ážááŒá¯ááá¯áá±á¬ááŒá±á¬áá·áº áááºážááᯠáá¯ááºáá±á¬ááºáá²á·ááŒááºážááŒá áºáááºá
á€áá¯á¶ááá¯áááºáá®ážáááºá¡ááœáẠdockerfile script áá¡áááá¡áá»ááºáá»á¬ážááá¯ááŒáá·áºááŒáá«á áá¯á·á
ááá°áá®áá±á¬ OS áá¬ážááŸááºážáá»á¬ážá áá¯ááºáá¯á¶áá»á¬ážááᯠáááºáá®ážáááºá¡ááœááºá áááºáá±á¬ááºáá±á ááºá¡ááœááºáž áá¬ážááŸááºážáá¶áá«ááºááᯠáá»á±á¬áºááœá¬ážááá·áº dockerfile ááœáẠá¡ááŒá±á¬ááºážááŒáá»ááºáá áºáá¯ááᯠáááºáááºááŸááºááá¯ááºááŒá®áž áááºážááẠbase image á tag áááºážááŒá áºáááºá
Microsoft Windows Server image tags á á¬áááºážá¡ááŒáá·áºá¡á á¯á¶ááᯠááœá±á·ááá¯ááºáá«áááºá
áá®ááŸá¬ .
ARG WINDOWS_OS_VERSION=1809
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION
áá¯á¶áá±á¡á¬ážááŒáá·áº ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááœáẠááœáŸááºááŒá¬ážáá»ááºáá»á¬áž RUN
Windows OS ááŸá dockerfile á¡ááœááºážááŸá áááºážááá¯á·ááᯠcmd.exe ááœááºááá¯ážááºááœáẠáá¯ááºáá±á¬ááºáááºá scripts áá»á¬ážáá±ážáá¬ážááŒááºážááŸáá·áºá¡áá¯á¶ážááŒá¯ááá·áº command áá»á¬ážááá¯ááºáá±á¬ááºááá¯ááºá
áœááºážááá¯áá»á²á·ááœááºáááºá¡áááºááŒá±á
á±áááºá¡ááœááºá ááœáŸááºááŒá¬ážáá»ááºááŸáááá·áº Powershell ááŸá command execution console ááá¯ááŒááºáááºáááºááŸááºáá«áááºá 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'
áá»á±á¬ááááºááᯠá¡áá¯á¶ážááŒá¯á áááºáá±á·áá»áºáá»á¬ážááᯠááá·áºááœááºážáááºá áááºááẠáááºážááá¯á·ááᯠá á¬áááºážáá áºáá¯á¡ááŒá Ạááá¯ážááŸááºážá áœá¬ áá»á±á¬áºááŒááºááá¯ááºáááºá ááá¯á·ááá¯áẠáááºáá±á·áá»áºáá áºáá¯á á®á¡ááœáẠáá°ážááŒá¬ážáá±á¬áá±á¬ááºááá·áºáááºáá»ááºáá»á¬ážááᯠáá»á±á¬áºááŒááºáááºááá¯á¡ááºáá«á áááºážááá¯á·ááᯠáá áºááŒáááºáá»áŸáẠáá áºáá¯á á® ááá·áºááœááºážááá¯ááºáááºá áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá ááá¯á¡ááºáá±á¬ áááºáá±á·áá»áºáá»á¬ážááŸáá·áº áááºážááá¯á·á ááá·áºáááºáá»ááºáá»á¬ážá á¬áááºážáá«ááŸááá±á¬ 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++ áááááá¬áá»á¬áž
- áááááá¬á¡á á¯á¶ 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 ááẠáááºáááºááŸá¯ script ááᯠáá¯ááºáá±á¬ááºááŒá®áž á¡áááºááŒá±á
á±áááºá¡ááœááºá áááºáááºážáá»áẠááááºážááŸááºááá¯á· áááºáá±á¬ááºááá¯ááºáá±á¬ áááááá¬áá»á¬áž áááºáááºááá¯ááºáá±á¬ ááá¯ááºáá»á¬ážááá¯á· áááºážááŒá±á¬ááºážááᯠáá±á«ááºážááá·áºááẠ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 áááºáá±á¬ááºááŸá¯ááᯠáááºáá®ážááŒááºážááá¯á· ááá¯ááºááá¯ááºáááºáááºáá¯ááºáá±á¬ááºááá¯ááºáá«áááºá
áá¬ááºáá¯á¶áá±á«ááºážáá»á¬ážá áœá¬ ááŸá¯ááºááŸá¬ážáá±á¬ááºááœááºáááºá
áááºá¹áá±á¬áá±á«áºááœáẠáááááá¬á¡á¬ážáá¯á¶ážááŒáá·áº áááºáá®ážáá¬ážáá±á¬áá¯á¶ááᯠáá»áœááºá¯ááºááá¯á· á¡áá¯á¶ážááŒá¯áá«áááºá áááẠdockerfile script ááœááºáá²á·ááá¯á·á áá¯ááºááŒááºáááºá¡áá¯á¶ážááŒá¯áááœááºáá°á
á±áááºá¡ááœáẠáá¬ážááŸááºážáá¶áá«ááº/áá¯ááºáá¯á¶áááºááºááᯠááá¯ááºážááá
áºááŒáá·áº áááºááŸááºááá¯ááºááá·áº á
áœááºážáááºááᯠáá±á«ááºážááá·áºáá«áááºá áá¶ááááºááá·áºááẠá¡áá±ážááŒá®ážáááºá as builder
ááœáŸááºááŒá¬ážáá»ááºááœáẠá
á¯áá±ážáá¯á¶áá®ááá¯á· FROM
.
ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder
ááᯠapplication ááá¯áááºáá±á¬ááºáááºá¡áá»áááºááŒá áºáááºá á€áá±áá¬ááœáẠá¡áá¬á¡á¬ážáá¯á¶ážááẠá¡ááœááºááá¯ážááŸááºážáá«áááº- á¡áááºážá¡ááŒá áºáá¯ááºááŸáá·áº áááºážááŸáá·áºáááºá ááºáá±ááá·áºá¡áá¬á¡á¬ážáá¯á¶ážááᯠáá°ážáá°ááŒá®áž á á¯á ááºážááŸá¯áá¯ááºáááºážá ááºááᯠá áááºáá«á
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 ./
ááᯠáá»ááºááŸááá±áá±ážáááºááŸá¬ áá»áœááºá¯ááºááá¯á·á á¡ááá®áá±ážááŸááºážá¡ááœáẠááá¯á¡ááºáá±á¬ ááŸá®ááá¯ááŸá¯áá»á¬ážááᯠáá±á«ááºážááá·áºáááºááŸáá·áº ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááŸáá
áºááá·áº launch command ááᯠáááºááŸááºáááºááŒá
áºáááºá ENTRYPOINT
ááá¯á·ááá¯áẠCMD
.
áá±á¬ááºáá»ááº
á€áá±á¬ááºážáá«ážááœááºá Windows á¡á±á¬ááºááŸáááœááºááááºáá¬á¡ááœááºáž C++ á¡ááá®áá±ážááŸááºážáá»á¬ážá¡ááœáẠááŒáá·áºá á¯á¶áá±á¬á á¯á ááºážááŸá¯áááºáááºážáá»ááºááá¯áááºáá®ážáááºážááŸáá·áº áá»áœááºá¯ááºááá¯á·áá¡ááá®áá±ážááŸááºážáá¡ááŒáá·áºá¡ááá¯á¶áá»á¬ážááá¯áááºáá®ážáááºá¡ááœáẠdocker multi-stage builds áá»á¬ážáá áœááºážáááºáá»á¬ážááá¯á¡áá¯á¶ážááŒá¯áááºážá¡ááŒá±á¬ááºážááŒá±á¬áá²á·áááºá
source: www.habr.com