コンテナーを使用して Azure Sphere アプリを構築する
メモ
このトピックでは、Docker Desktop for Windows を使用してコンテナー内に Azure Sphere アプリケーションをビルドする方法について説明します。 Linux 上の Docker コンテナーにアプリをビルドするには、Microsoft アーティファクト レジストリまたは MAR (Microsoft Container Registry または MCR とも呼ばれます) から同じ azurespheresdk コンテナーを使用できます。
Docker Desktop をインストールする
Docker を使用して、Azure Sphere SDK が事前にインストールされたスタンドアロン Linux コンテナーを実行できます。 このイメージは、独自のデプロイのベースとして使用することもできます。 イメージ タグは、含まれている SDK のバージョンを参照します。
Docker コンテナーをダウンロードして実行するには、 Windows または Linux に Docker Desktop をインストールする必要があります。
Docker Desktop for Windows をインストールしたら、 Hyper-V とコンテナーの Windows 機能を有効にしてください。 インストール後に再起動が必要になる場合があります。
インストールが完了したら、Windows の [スタート] メニューから、またはデスクトップに追加されたショートカット アイコンから Docker Desktop を起動します。
Linux は、Windows 上の Docker Desktop の既定のコンテナーの種類です。 Azure Sphere では Linux コンテナーを使用します。 Linux コンテナーを実行するには、Docker が正しいデーモンをターゲットにしていることを確認する必要があります。 Linux が現在の既定の種類のコンテナーであることを確認するには、システム トレイの Docker ホエール アイコンを右クリックします。 「Windows コンテナーに切り替える」と表示されている場合は、既に Linux デーモンをターゲットにしています。 Windows コンテナーを使用している場合は、システム トレイの Docker ホエール アイコンを右クリックしたときに、アクション メニューから [ Linux コンテナーに切り替える ] を選択して、これを切り替えることができます。 詳細については、「 Windows コンテナーと Linux コンテナーの切り替え」を参照してください。
メモ
Docker Desktop のクジラアイコン アニメーションが停止するまで待ちます。 アイコンは非表示の [通知] 領域にある可能性があります。 アイコンの上にマウス ポインターを合わせると、Docker Desktop の状態が表示されます。
Azure Sphere SDK ビルド環境コンテナーを使用してサンプル アプリをビルドする
コンテナーを入力してコマンドを発行することで、対話形式でコンテナーを使用できます。ただし、Docker が元の Azure Sphere イメージに基づいてカスタム イメージを構築するために使用できるファイルでアプリケーションをビルドするために必要な手順をキャプチャする方が効率的です。 これにより、ビルド プロセスが繰り返し可能で一貫性が確保されます。 既定では、このファイルは Dockerfile という名前で、docker コマンドが実行される$PATH内にある必要があります。
次の手順では、Azure Sphere サンプルをビルドするための Dockerfile の手順を作成するための概要を示します。 これらの手順は、自分のニーズに合わせて調整できます。
mcr.microsoft.com/azurespheresdk コンテナーに基づいて新しいコンテナーを作成します。
GitHub から Azure Sphere サンプル リポジトリを複製します。
ビルド時にサンプルを格納するディレクトリを作成します。
ビルドするサンプルを指定する環境変数を作成します。
CMake を実行してサンプルをビルドし、指定したディレクトリに配置します。
サンプルをビルドするための Dockerfile を作成する
Azure Sphere イメージに基づいて Docker イメージをビルドし、カスタム ビルド機能を使用するには、次の Docker 手順でテキスト ファイル (ファイル拡張子なし) を作成します。
FROM mcr.microsoft.com/azurespheresdk AS azsphere-samples-repo
RUN git clone https://github.com/Azure/azure-sphere-samples.git
FROM azsphere-samples-repo AS azsphere-sampleapp-build
RUN mkdir /build
WORKDIR /build
ENV sample=HelloWorld/HelloWorld_HighLevelApp
CMD cmake -G "Ninja" \
-DCMAKE_TOOLCHAIN_FILE="/opt/azurespheresdk/CMakeFiles/AzureSphereToolchain.cmake" \
-DAZURE_SPHERE_TARGET_API_SET="latest-lts" \
-DCMAKE_BUILD_TYPE="Debug" \
/azure-sphere-samples/Samples/${sample} && \
ninja
このファイルでは、 ENV 環境変数を使用して、ビルドするサンプルを指定します。 HELLOWorld/HelloWorld_HighLevelApp とは異なるサンプルをビルドするには、ENV に新しい値を設定します。
Dockerfile の手順の詳細については、Dockerfile の手順の行ごとの説明を参照してください。
Dockerfile を使用して既定のサンプル アプリをビルドする
カスタム Dockerfile を使用してサンプル アプリをビルドするには、次の 3 つの手順が必要です。
PowerShell、Windows コマンド プロンプト、Linux コマンド シェルなどのコマンド ライン インターフェイスを使用して、Dockerfile からイメージをビルドします。
docker build --target azsphere-sampleapp-build --tag azsphere-sampleapp-build .
オプションは
--target
、マルチステージ ビルドのどの部分を使用するかを指定します。 オプションは--tag
イメージの名前を指定し、小文字のみを指定する必要があります。 Docker イメージでは、常に小文字のみを使用する必要があります。 で名前--tag
を指定しない場合、イメージには 12 桁の数字が含まれますが、操作が簡単ではありません。 コマンドの最後のピリオドを忘れないでください。 コマンドを使用してイメージdocker images
を一覧表示できます。Docker は、"Dockerfile" という名前のファイルに基づいて azsphere-sampleapp-build という名前のイメージを構築します。 Dockerfile に別の名前が付けられている場合は、 オプションを
--file
使用して名前を指定します。オプションを使用して、コンテナーに簡単な名前を
--name
付けます。 コマンドはrun
コンテナーを入力し、 ENV 環境変数で指定されたサンプルをビルドします。 コマンド ライン インターフェイスを使用して、次のコマンドを入力します。docker run --name hello_hl azsphere-sampleapp-build
サンプル アプリ (HelloWorld/HelloWorld_HighLevelApp) がビルドされ、コンテナー内の
/build
ディレクトリに配置されます。 コンテナーの実行が完了すると、コンテナーが終了し、コマンド ライン インターフェイスに戻ります。メモ
このコマンドは、操作を行わずにアプリをビルドし、ビルドが完了した後にコンテナーを終了します。 終了した後もコンテナーはアクティブです。 これは、 または
--rm
オプションを-it
指定しなかったためです。 Docker Desktop がdocker run
実行されている限り、コンテナーでコマンドを再構築せずに後でもう一度使用できます。コンテナー内からホスト コンピューター環境にビルドの結果をコピーします。 コマンド ライン インターフェイスを使用して、次のコマンドを入力します。
docker cp hello_hl:/build .
このコマンドは、hello_h1 コンテナー内のディレクトリの
/build
内容を、コマンドを発行するホスト コンピューター上のディレクトリにコピーします。 ディレクトリは/build
、サンプルのコンパイル先となる作業ディレクトリ (WORKDIR) として指定されます。 まだコンテナーの外部にいるが、docker cp コマンドを使用してコマンドを発行することに注意してください。 コマンドの最後のピリオドを忘れないでください。
カスタム Dockerfile を使用して別のサンプルをビルドする
GPIO サンプルなど、別のサンプルをビルドするには、GPIO サンプルへのパスを指定します。
docker run --name gpio_hl --env sample=GPIO/GPIO_HighLevelApp azsphere-sampleapp-build
ビルドが完了したら、コンテナー内からホスト コンピューター環境に結果をコピーします。
docker cp gpio_hl:/build .
コマンドの最後のピリオドを忘れないでください。
パッケージがホスト マシン環境にコピーされたら、Windows または Linux の Azure CLI コマンドを使用してアプリケーションをデプロイできます。 詳細については、「 アプリケーションのデプロイ」を参照してください。
コンテナーからの USB 経由のデバイス操作はサポートされていません。
Dockerfile 命令の行ごとの説明
「サンプルをビルドするための Dockerfile の作成」で作成 した Dockerfile の 各部分について、以下に説明します。
複数のビルドの準備
FROM mcr.microsoft.com/azurespheresdk AS azsphere-samples-repo
この行は、元の microsoft.com/azurespheresdk コンテナーに基づいて、新しいビルド azsphere-samples-repo を設定します。
Azure Sphere サンプルをダウンロードする
RUN git clone https://github.com/Azure/azure-sphere-samples.git
この行は、Azure Sphere サンプル リポジトリからすべてのサンプルを複製します。
別のターゲット可能なマルチステージ ビルドを追加する
FROM azsphere-samples-repo AS azsphere-sampleapp-build
この行は、 azsphere-samples-repo ビルドに基づいて新しいビルドを追加します。
コンテナー内の作業ディレクトリを設定する
RUN mkdir /build
WORKDIR /build
これらの行は、新しい作業ディレクトリを作成します。
サンプルを指定する既定の環境変数を作成する
ENV sample=HelloWorld/HelloWorld_HighLevelApp
この行は、ビルドするサンプルを指定する環境変数を作成します。 この場合は、HelloWorld_HighLevelAppサンプルです。 環境変数をオーバーライドして、任意のサンプル名とパスを指定できます。
CMake と Ninja を実行してパッケージをビルドする
CMD cmake -G "Ninja" \
-DCMAKE_TOOLCHAIN_FILE="/opt/azurespheresdk/CMakeFiles/AzureSphereToolchain.cmake" \
-DAZURE_SPHERE_TARGET_API_SET="latest-lts" \
-DCMAKE_BUILD_TYPE="Debug" \
/azure-sphere-samples/Samples/${sample} && \
ninja
このセクションでは、CMake を使用して、Ninja を呼び出してパッケージをビルドするときに使用するパラメーターを指定します。
ビルドが完了すると、コンテナーの実行が停止します。
Docker のヒント
これらのヒントは、Docker をより効果的に操作するのに役立つ場合があります。
docker run コマンドを使用してベース コンテナーを対話形式で探索する
コマンド ライン インターフェイスを使用して、次のコマンドを入力します。
docker run --rm -it mcr.microsoft.com/azurespheresdk
この例では、 はコンテナー mcr.microsoft.com/azurespheresdk
が作成されるイメージの名前です。 オプションは --rm
実行後にコンテナーをシャットダウンし、オプションは -it
コンテナーへの対話型アクセスを指定します。
Azure Sphere SDK ビルド環境 Docker コンテナーは、Microsoft アーティファクト レジストリ (MAR) によって提供され、一般ユーザーが利用できます。
コンテナーが既にローカル コンピューター上にある場合は、もう一度ダウンロードされません。
ダウンロードとセットアップには数分かかる場合があります。 ビルド環境には、Azure Sphere Linux SDK を使用してパッケージをビルドするために必要なすべてのものが含まれています。
コマンドが run
完了すると、コマンド プロンプトが "#" 記号に変更されます。 これで、Linux ベースの Docker コンテナー内にいます。
ls と入力すると、次の一覧と同様に、コンテナー内の現在の Linux ディレクトリが表示されます。
bin cmake-3.14.5-Linux-x86_64 etc lib makeazsphere.sh mnt opt root sbin sys usr
boot dev home lib64 media ninja proc run srv tmp var
コンテナーを終了する場合は、「」と入力 exit
します。 コンテナーは使用できなくなり、次のコマンドを使用してもう一度作成する必要があります。
docker run --rm -it mcr.microsoft.com/azurespheresdk
オプションを --rm
使用しない場合、終了してもコンテナーは削除されません。
コンテナーの識別
新しいコンテナーをビルドすると、 などの a250ade97090
ID が作成されます (ID は異なります)。 多くの Docker コマンドでは、 microsoft.com/azurespheresdk アドレスの代わりに ID を使用する必要があります。
このコマンドを使用して、システム上のコンテナーに関する基本的な情報の一般的な一覧を次に示します。
docker ps --all
結果は次のようになります。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a250ade97090 microsoft.com/azurespheresdk "/bin/bash" 15 minutes ago Up 9 seconds pedantic_kilby
ID は異なります。 Docker はコンテナー所有者のランダムな名前を構成します。 この例では、コンテナーは 1 つだけであることに注意してください。
コンテナー内での作業
run コマンドを使用せずにマシン上のコンテナー内で作業する場合は、次のように入力して、コンテナー ID と、実行するコンテナー内のスクリプト (/bin/bash) で exec コマンドを使用します。
docker exec -t a250ade97090 /bin/bash
コマンド プロンプトが "#" 記号に変更されます。 これで、Linux ベースの Docker コンテナーに入るようになりました。 ls と入力すると、コンテナー内の現在の Linux ディレクトリが表示されます。
bin cmake-3.14.5-Linux-x86_64 etc lib makeazsphere.sh mnt opt root sbin sys usr
boot dev home lib64 media ninja proc run srv tmp var
コンテナーを終了するには、コマンドを exit
入力します。
Azure Sphere SDK ビルド コンテナーの制限事項
Azure Sphere SDK ビルド コンテナーは、Azure Sphere パッケージのみをビルドするように設計されています。 これは、Azure CLI コマンドの実行、デバイスの復旧またはサイドローディング、デバッグ用 に設計されていません 。 コンテナーは USB 関数にアクセスできません。
Docker Linux コンテナーの制限事項
Docker Linux コンテナーは、Linux の完全インストールと同じではありません。 たとえば、Docker Linux コンテナーで Linux GUI アプリケーションを実行することはできません。
マルチステージ ビルド コンテナーを使用して依存関係を減らす
Docker マルチステージ ビルド機能を使用すると、Dockerfile で複数の FROM ステートメントを使用して依存関係を減らすことができます。 各 FROM 命令は異なるベースを使用でき、それぞれがビルドの新しいステージを開始します。
Docker マルチステージ ビルドの詳細については、「マルチステージ ビルドを 使用する」を参照してください。
マルチステージ ビルドは、ベスト プラクティスとして Docker によって推奨されます。 Docker のベスト プラクティスの詳細については、「 Dockerfile ベスト プラクティスの概要ガイド」を参照してください。
AS 引数を使用してわかりやすい名前をステージに追加する
既定では、ステージの名前は付けされませんが、ID 番号は付けられます。 AS と名前を追加して、わかりやすい名前をステージに追加することで、Dockerfile をより読みやすくすることができます。 例えば:
FROM mcr.microsoft.com/azurespheresdk AS azsphere-samples-repo
複数ステージ のコマンドで AS 引数を使用する方法の詳細については、「 ビルド ステージに名前を付けます」を参照してください。
ベスト プラクティスとしてわかりやすい名前でターゲットを構築する
ターゲットをビルドするときに、 --tag オプションを使用してわかりやすい名前を付けることができます。 わかりやすい名前が役立ちます。 例えば:
docker build --target azsphere-sampleapp-build --tag azsphere-sampleapp-build .
Docker ビルド コマンドで名前を使用する方法の詳細については、「 Docker ビルド リファレンス」を参照してください。