大家好!我叫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 .