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 .exe | Windows ベースイメージのため |
| PowerShell | PowerShell 入りイメージのため |
| Java プログラム | OpenJDK 入りイメージのため |
Javaの依存ライブラリ取得(Maven)
Java プログラムの実行に必要なライブラリは、Maven(mvn) を使って取得しています。
Dockerfile の中で以下のような流れを実施しています。
- Maven の zip ファイルを展開したものとライブラリをコンテナにコピー
- Maven のディレクトリに移動
pom.xmlに依存関係を記述mvn dependency:copy-dependenciesなどのコマンドを実行してライブラリを取得- ライブラリファイルが生成される
<!-- 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点を押さえておけば、比較的すんなり動くと思います。