Windowsコンテナで Windows実行ファイル・PowerShell・Java を動かす

この記事の内容

  • Azure Container Instances を使って Windows コンテナを実行する仕組みの紹介
  • コンテナ内で Windows の .exe ファイル・PowerShell スクリプト・Java プログラムを同時に動かす方法
  • ベースイメージの選定とMavenによる依存ライブラリ取得の手順
  • Azure Container Registry へのイメージプッシュと実行の流れ
  • ハマりポイント(対応OSバージョンとDockerエンジンの切り替え)

なぜ Windows コンテナを選んだか

今回実装したのは、Azure Container Instances を使ってコンテナを起動し、その中で以下の3つを実行するという仕組みです。

  • Windows の .exe ファイル(外部からデータを取得する既存ツール)
  • PowerShell スクリプト
  • Java プログラム

これらをサーバーレスサービスで直接実行しようとすると、環境面での制約が多く難しい状況でした。そこで、必要な実行環境をすべて含んだコンテナを自作し、Azure Container Instances で動かすというアプローチを取りました。


ベースイメージの選定

Windows の .exe ファイルを動かしたいため、イメージは Windows Server Core ベースのものを使用しています。

さらに Java プログラムも実行する必要があるため、OpenJDK が組み込まれたイメージを選定しました。

本来は Nano Server ベースを使いたかったのですが、PowerShell が含まれていないため断念しました。結果として、PowerShell と OpenJDK の両方が入ったイメージを採用しています。サイズが大きくなる点はデメリットですが、今回の要件上やむを得ない選択です。

このイメージを使うことで、以下がすべて動作します。

実行したいもの動く理由
Windows .exeWindows ベースイメージのため
PowerShellPowerShell 入りイメージのため
Java プログラムOpenJDK 入りイメージのため

Javaの依存ライブラリ取得(Maven)

Java プログラムの実行に必要なライブラリは、Maven(mvn) を使って取得しています。

Dockerfile の中で以下のような流れを実施しています。

  1. Maven の zip ファイルを展開したものとライブラリをコンテナにコピー
  2. Maven のディレクトリに移動
  3. pom.xml に依存関係を記述
  4. mvn dependency:copy-dependencies などのコマンドを実行してライブラリを取得
  5. ライブラリファイルが生成される
<!-- pom.xml に依存ライブラリを記述 -->
<dependencies>
  <dependency>
    <!-- 必要なライブラリを記述 -->
  </dependency>
</dependencies>

これにより、Java の実行に必要な jar ファイル群が揃い、Java プログラムが動作するようになります。


全体の処理フロー

一連の処理はすべて PowerShell スクリプトの中に記述しています。

  • Windows .exe の実行
  • Java プログラムの起動
  • その他必要なスクリプト処理

どんな処理であっても「必要な動作環境をコンテナ内で作り込み、その中で実行する」という設計が可能です。使い捨てのコンテナとして動かす使い方にも、この構成は非常に相性が良いと感じています。


ビルドとAzure Container Registryへのプッシュ

Dockerfile が完成したら、以下の手順でイメージをビルドしてプッシュします。

# イメージのビルド
docker build -t <イメージ名>:<タグ> .

# Azure Container Registry にプッシュ
docker push <ACRのURL>/<イメージ名>:<タグ>

Azure Container Registry(ACR)にイメージをプッシュしておき、Azure Container Instances 側がそのイメージを引っ張ってきて実行するという流れになります。


ハマりポイント

1. Azure Container Instances でサポートされる Windows OS バージョン

Azure Container Instances が対応している Windows OS バージョンには制限があります。Windows Server 2022 などの新しいバージョンはまだ対応していないため、対応している古いバージョンのイメージを使う必要があります。これは事前に確認しておく必要があります。

2. Docker Desktop のエンジン切り替え

Windows コンテナをローカルでビルド・実行するには、Docker Desktop を Windows コンテナモードに切り替える必要があります。

デフォルトでは Linux コンテナモードで動作しているため、タスクトレイの Docker アイコンから「Switch to Windows containers…」を選んで切り替えてください。

Linux コンテナエンジンが動いている状態でビルドや操作を行うと、途中から謎のエラーメッセージ(「コンテナユーザーが存在しない」など)が出ることがあります。情報がほとんどネット上にないため調査に時間がかかりますが、原因はエンジンの切り替え忘れである場合がほとんどです。


定期実行させるには

このコンテナを定期的に起動したい場合は、以下の方法が候補になります。

  • Logic Apps のトリガーから Azure Container Instances を起動する
  • Azure Automation からスケジュール実行する

用途やお好みに合わせて選択するのが良いでしょう。


まとめ

Windows の .exe・PowerShell・Java という組み合わせをサーバーレス環境で動かすのは難しいですが、Windows コンテナに実行環境ごとまとめてしまえば、あとは Azure Container Instances に任せるだけで動きます。

ローカルで動作確認できているものであれば、Dockerfile を少し書いてファイルをコピーするだけで同じ動作をコンテナ化できます。使い捨てのバッチ処理や定期実行スクリプトにも、こうしたコンテナ活用は非常に有効な選択肢です。

ハマりポイントとして「ACR の対応 Windows バージョン」と「Docker Desktop のエンジン切り替え」の2点を押さえておけば、比較的すんなり動くと思います。