áááºá¹ááá¬áá« áá°ááŒá®ážáááºážáá»á¬áž! áá»áœááºáá±á¬á·áºáá¬ááẠAndrey áá«á Exness ááŸá¬ DevOps á¡ááºáá»ááºáá®áá¬á¡ááŒá Ạdevelopment team ááŸá¬ áá¯ááºááá¯ááºáá«áááºá áá»áœááºáá±á¬á·áºáá²á· á¡áááá¡á¬áá¯á¶á áá¯ááºááŸá¯ááá±á¬á· operating system áá±á«áºááŸá¬ run áá±áá²á· Docker application ááœá±ááᯠáááºáá±á¬ááºááŒááºážá ááŒáá·áºáá»ááºááŒááºážáá²á· ááááºážááááºážááŒááºážáá² ááŒá áºáá«áááºá Linux (ááá¯ááŸá á OS áá¯áááºááœáŸááºážáááº)á áááŒá¬áá±ážáá®áá áá»áœááºá¯ááºááœáẠá¡áá¬ážáá°áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážáá«ááá·áº á¡áá¯ááºáá áºáá¯ááŸááá²á·áá±á¬áºáááºážá ááá±á¬áá»ááºááá áºááŸáẠOS ááẠWindows Server ááŸáá·áº C++ ááá±á¬áá»ááºá¡á á¯á¶á áá»áœááºáá±á¬á·áºá¡ááœáẠOS á¡á±á¬ááºááŸá Docker ááœááºááááºáá¬áá»á¬ážááŸáá·áº á€áááºááŸá¬ ááááá¯á¶ážáá®ážáááºáá±á¬ á¡ááŒááºá¡ááŸááºáááºááœááºááŸá¯ááŒá áºáááºá Windows ááŸáá·áº C++ á¡ááá®áá±ážááŸááºážáá»á¬áž áá±áá¯áá»á¡á¬ážááŒáá·áºá áááºážá á áááºáááºá á¬ážááœááºá¡ááœá±á·á¡ááŒá¯á¶áá áºáá¯ááᯠáá±ážá áœááºážáá²á·ááŒá®áž OS ááœáẠcontainerizing á¡ááá®áá±ážááŸááºážáá»á¬ážá ááŸá¯ááºááœá±ážááŸá¯á¡áá»áá¯á·ááᯠáááºááŒá¬ážáá±ážáá²á·áááºá Windows.

áá®áá±á¬ááºážáá«ážááŸá¬ áááºááá¯á¡áááºá¡áá²ááœá±áá²á· áááºááá¯ááºáá²á·ááááºááá¯áᬠááŒá±á¬ááŒáá»ááºáá«áááºá ááá·áºáááºááŸáááŸáá·áº á¡áá¬áááºá áááºáá±á«áºááŸá¯áá»á¬ážá¡ááœáẠá¡áá±á¬ááºá¡áá°ááŒá áºáááºáᯠáá»áŸá±á¬áºááá·áºáá«áááºá áááºááŸá¯áá¶á á¬ážáá«á
á¡áááºááŒá±á¬áá·áºááœááºááááºáá¬áá»á¬áž
áá¯áá¹ááá®ááœáẠHashicorp Nomad container orchestrator ááŸáá·áº áááºá ááºá¡á áááºá¡ááá¯ááºážáá»á¬ážááŒá áºááá·áº Consul ááŸáá·áº Vault ááá¯á·á ááŸáááŒá®ážáá¬áž á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶áá áºáá¯ááŸááááºá ááá¯á·ááŒá±á¬áá·áºá application containerization ááᯠá¡ááŒá®ážáááºááŒá±ááŸááºážáá»ááºáá±ážá¡ááºáááºá¡ááœáẠáá±á«ááºážá ááºážáá¬ážáá±á¬áááºážáááºážáá áºáá¯á¡ááŒá Ạááœá±ážáá»ááºáá²á·áááºá ááá±á¬áá»ááºá á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááœáẠOS áá¬ážááŸááºážáá»á¬ážáá«ááŸááá±á¬ Docker host áá»á¬áž áá«áááºáá±á¬ááŒá±á¬áá·áº Windows Server Core 1803 ááŸáá·áº 1809 ááá¯á¡áá¯á¶ážááŒá¯áá±áá«á 1803 ááŸáá·áº 1809 á¡ááœáẠDocker image áá¬ážááŸááºážáá»á¬ážááᯠáá®ážááŒá¬ážáááºáá±á¬ááºááá«áááºá version 1803 ááœáẠDocker build host á revision number ááẠbase Docker image á revision number ááŸáá·áº ဠimage á០container ááᯠlaunch áá¯ááºááá·áº host ááŸáá·áº ááá¯ááºáá®ááááºááᯠááŸááºáá¬ážáá¬ážááẠá¡áá±ážááŒá®ážáá«áááºá Version 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 image tag áá»á¬ážá á á¬áááºážá¡ááŒáá·áºá¡á á¯á¶ Windows Server ááœá±á·ááá¯ááºáááºá .
ARG WINDOWS_OS_VERSION=1809
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSIONáá¯á¶áá±á¡á¬ážááŒáá·áº ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááœáẠááœáŸááºááŒá¬ážáá»ááºáá»á¬áž RUN OS áá²á· dockerfile áá²ááŸá¬ Windows cmd.exe console ááœáẠexecute áá¯ááºáá¬ážáááºá script áá±ážáá¬ážáááœááºáá°á
á±áááºááŸáá·áº á¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ command áá»á¬ážá áá¯ááºáá±á¬ááºáá»ááºááᯠááá¯ážáá»á²á·ááá¯ááºáááºá¡ááœááºá á¡á±á¬ááºáá«ááœáŸááºááŒá¬ážáá»ááºááᯠá¡áá¯á¶ážááŒá¯á command execution console ááᯠ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'áá»á±á¬ááááºááᯠá¡áá¯á¶ážááŒá¯á áááºáá±á·áá»áºáá»á¬ážááᯠááá·áºááœááºážáááºá áááºááẠáááºážááá¯á·ááᯠá á¬áááºážáá áºáá¯á¡ááŒá Ạááá¯ážááŸááºážá áœá¬ áá»á±á¬áºááŒááºááá¯ááºáááºá ááá¯á·ááá¯áẠáááºáá±á·áá»áºáá áºáá¯á á®á¡ááœáẠáá°ážááŒá¬ážáá±á¬áá±á¬ááºááá·áºáááºáá»ááºáá»á¬ážááᯠáá»á±á¬áºááŒááºáááºááá¯á¡ááºáá«á áááºážááá¯á·ááᯠáá áºááŒáááºáá»áŸáẠáá áºáá¯á á® ááá·áºááœááºážááá¯ááºáááºá áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá ááá¯á¡ááºáá±á¬ áááºáá±á·áá»áºáá»á¬ážááŸáá·áº áááºážááá¯á·á ááá·áºáááºáá»ááºáá»á¬ážá á¬áááºážáá«ááŸááá±á¬ 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 (áá.á.ááááá.á)
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 ááẠáááºáááºááŸá¯ 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.
áá±á¬ááºáá»ááº
áá®áá±á¬ááºážáá«ážááŸá¬ C++ application ááœá±á¡ááœáẠcontainer áá áºáá¯áá²ááŸá¬ compilation environment á¡ááŒáá·áºá¡á á¯á¶áá áºáᯠáááºááá¯áááºáá®ážáááá²ááá¯áᬠááŸááºážááŒáá²á·áá«áááºá Windows ááŸáá·áº áá»áœááºá¯ááºááá¯á·á application á á¡ááŒáá·áºá¡á image áá»á¬ážááᯠáááºáá®ážááẠDocker á multi-stage build á áœááºážáááºáá»á¬ážááᯠáááºááá¯á·á¡áá¯á¶ážááŒá¯ááááºáááºážá
source: www.habr.com
