Windows Containers で Containerized Build してみる

@asmichi

Source Code

WHY?

おまえは何がしたいんだ

WHY?

  • .NET の子プロセス生成ライブラリが欲しい
    標準のものより細かく制御できるやつが
  • 当然、ネイティブ実装が必要

NuGet パッケージにネイティブ実装を付随させる

.nuget/packages/Libuv/1.10.0/runtimes
(snip)
+-- linux-x64
|   +-- native
|       +-- libuv.so
+-- osx
|   +-- native
|       +-- libuv.dylib
(snip)
+-- win-x64
|   +-- native
|       +-- libuv.dll
+-- win-x86
    +-- native
        +-- libuv.dll
                    

Architecture-specific folders

WHY?

  • これをビルドしたい
  • VM だとファイル転送するのがだるいでござる
  • そうだ、 Windows Containers なら
    Linux と Windows 両方が使えるぞ

macOS は Mac 以外で動作させられるようになってから出直してきてください

Windows 上で Linux コンテナが動くの!?

Linux Containers on Windows (LCOW)

Linux Containers on Windows (LCOW)

  • Windows 上で Linux コンテナを動かす
  • 軽量 VM 内で Linux を動かして
    その上でコンテナを実行する
docker run -it --rm `
--mount "type=bind,readonly,source=C:\home,target=/home/ichi" `
ubuntu:18.04

Linux Containers with Hyper-V isolation

Linux Containers with Hyper-V isolation

>dir "C:\Program Files\Linux Containers"


    Directory: C:\Program Files\Linux Containers

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2019/02/22    18:58        6611330 initrd.img
-a----        2019/02/22    18:58        7660304 kernel

あとはやるだけ

  • Dockerfile を書く
    • Windows 1809 + VS2017 Build Tools
    • Ubuntu 18.04

あとはやるだけ

docker build -t foo -f foo.Dockerfile .

docker run foo --name fooContainer `
    --mount "type=bind,readonly,source=c:/src,target=c:/src"

docker cp fooContainer:c:/bin bin

できた

>dir .\bin\NativeLib\ -Recurse -File | %{ Resolve-Path -Relative $_ }
.\bin\NativeLib\linux-x64\Debug\libNativeLib.so
.\bin\NativeLib\linux-x64\Release\libNativeLib.so
.\bin\NativeLib\win-x64\Debug\libNativeLib.dll
.\bin\NativeLib\win-x64\Debug\libNativeLib.ilk
.\bin\NativeLib\win-x64\Debug\libNativeLib.pdb
.\bin\NativeLib\win-x64\Release\libNativeLib.dll
.\bin\NativeLib\win-x64\Release\libNativeLib.dll.manifest
.\bin\NativeLib\win-x64\Release\libNativeLib.pdb
.\bin\NativeLib\win-x86\Debug\libNativeLib.dll
.\bin\NativeLib\win-x86\Debug\libNativeLib.ilk
.\bin\NativeLib\win-x86\Debug\libNativeLib.pdb
.\bin\NativeLib\win-x86\Release\libNativeLib.dll
.\bin\NativeLib\win-x86\Release\libNativeLib.dll.manifest
.\bin\NativeLib\win-x86\Release\libNativeLib.pdb

おわり

Dockerfile

Ubuntu 18.04

FROM ubuntu:18.04
RUN apt-get update && apt-get -y install make gcc cmake ninja-build

VS2017 Build Tools Native desktop

# escape=`
# Copyright (C) Microsoft Corporation. All rights reserved.
# Licensed under the MIT license. See LICENSE.txt in the project root for license information.
ARG FROM_IMAGE=mcr.microsoft.com/dotnet/framework/runtime:4.7.2-windowsservercore-ltsc2019
FROM ${FROM_IMAGE}

# Reset the shell.
SHELL ["cmd", "/S", "/C"]

# Set up environment to collect install errors.
COPY Install.cmd C:\TEMP\
ADD https://aka.ms/vscollect.exe C:\TEMP\collect.exe

# Install Node.js LTS
ADD https://nodejs.org/dist/v8.11.3/node-v8.11.3-x64.msi C:\TEMP\node-install.msi
RUN start /wait msiexec.exe /i C:\TEMP\node-install.msi /l*vx "%TEMP%\MSI-node-install.log" /qn
ADDLOCAL=ALL

# Download channel for fixed install.
ARG CHANNEL_URL=https://aka.ms/vs/15/release/channel
ADD ${CHANNEL_URL} C:\TEMP\VisualStudio.chman

# Download and install Build Tools for Visual Studio 2017 for native desktop workload.
ADD https://aka.ms/vs/15/release/vs_buildtools.exe C:\TEMP\vs_buildtools.exe
RUN C:\TEMP\Install.cmd C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
    --channelUri C:\TEMP\VisualStudio.chman `
    --installChannelUri C:\TEMP\VisualStudio.chman `
    --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended`
    --installPath C:\BuildTools

# Use developer command prompt and start PowerShell if no other command specified.
ENTRYPOINT C:\BuildTools\Common7\Tools\VsDevCmd.bat &&
CMD ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]