大家好!我叫Andrey,我是Exness开发团队的DevOps工程师。我的主要活动涉及在Linux操作系统(以下称为OS)下的docker中组装,部署和支持应用程序。不久前,我从事一项具有相同活动的任务,但是Windows Server和一组C ++项目成为该项目的目标操作系统。对我而言,这是Windows下首次与docker容器进行紧密交互,并且通常与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 multi-stage dockerfile , . , , docker- . , docker cache, .
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. :
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 , 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 Studio\Installer' ;\
$env:PATH = 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin;' + $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 multi-stage .