銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Windowsコンテナをビルドしようと思って気づいたこと

ASP.NET MVC (Coreではなくて昔からある方)が動くコンテナイメージを作って動かそうと思って気づいたことのメモです。

準備とプロジェクト作成

まずはこのページから始める。

docs.microsoft.com

自分のWindowsマシン上でビルド、実行したい場合はDocker for WindowsでWindows Containerに切り替えておく。 プロジェクトは新規に作るのであれば、Visual StudioでASP.NET MVCを選択して、Windows Containerサポートを追加するのがよい。 Dockerfileがプロジェクトに追加され、プロジェクトのビルドでイメージ作成、デバッグ実行でコンテナを実行できる。

RUNコマンドの違い

DockerfileにRUNコマンドによる操作を追加する場合、Windowsコンテナの場合は挙動が少し違うので注意が必要。

docs.microsoft.com

execフォームとshellフォームの2種類がある。execフォームはこんな感じに記載して、記述してコマンド(実行ファイル)を直接実行する。

RUN ["powershell", "Invoke-WebRequest", "https://download.example.com/path/to/installer.msi", "-OutFile", "C://instakker.msi"]

shellフォームはシェル経由の実行で、例えば次のようにMSIを実行して完了まで待機できたりする。

RUN Start-Process -Wait -FilePath msiexec -ArgumentList /i, "C:\installer.msi", /qn, 

エスケープの扱いに違いがあったりするのも注意。

実行したコンテナへのログイン

Docker for Windowsで実行したコンテナにログインしたい場合は/bin/shの代わりにpowershellを使う。

docker exec -it <container_id> powershell

適当なファイルを見たい場合 (Linuxコンテナで docker exec <container_id> cat /path/to/log.txtに相当)は、とりあえずこれで実行できた。パスに空白を含む場合は、空白の前に`を入れてエスケープ。

docker exec  <container_id> powershell  Get-Content 'C:\Program` Files\path\to\log.txt'

また気づいたら追加します。