コンテナーを使用して Azure Sphere アプリを構築する

重要

これは Azure Sphere (レガシ) のドキュメントです。 Azure Sphere (レガシ) は 2027 年 9 月 27 日に 再提供されておりユーザーは現時点で Azure Sphere (統合) に移行する必要があります。 TOC の上にある Version セレクターを使用して、Azure Sphere (統合) のドキュメントを表示します。

Note

このトピックでは、Docker Desktop for Windows を使用してコンテナー内に Azure Sphere アプリケーションをビルドする方法について説明します。 Linux 上の Docker コンテナーでアプリをビルドするには、Microsoft アーティファクト レジストリまたは MAR (Microsoft Container Registry または MCR とも呼ばれます) から同じ azurespheresdk コンテナーを使用できます。

Docker Desktop のインストール

Docker を使用して、Azure Sphere SDK がプレインストールされたスタンドアロンの Linux コンテナーを実行できます。 このイメージは、独自のデプロイのベースとして使用することもできます。 イメージ タグは、それが含まれている SDK のバージョンを参照します。

Docker コンテナーをダウンロードして実行する前に、Docker Desktop を Windows または Linux にインストールする必要があります。

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 ホエール アイコンを右クリックしたときにアクション メニューから Switch to Linux コンテナー を選択して、これを切り替えることができます。 詳細については、「Switch between Windows and Linux containers」を参照してください。

Note

Docker Desktop のホエール アイコン アニメーションが停止するまで待ちます。 アイコンは非表示の [通知] 領域にある可能性があります。 アイコンにカーソルを合わせると、Docker Desktop の状態が表示されます。

Azure Sphere SDK ビルド環境コンテナーを使用してサンプル アプリをビルドする

コンテナーを対話形式で使用するには、コンテナーを入力してコマンドを発行します。ただし、Docker が元の Azure Sphere イメージに基づいてカスタム イメージを構築するために使用できるファイルでアプリケーションをビルドするために必要な手順をキャプチャする方が効率的です。 これにより、ビルド プロセスが繰り返し可能で一貫性が確保されます。 既定では、このファイルは Dockerfile という名前で、docker コマンドが実行される$PATH内にある必要があります。

次の手順では、Azure Sphere サンプルをビルドするための Dockerfile の手順を作成するための概要を示します。 これらの手順は、独自のニーズに合わせて調整できます。

  1. mcr.microsoft.com/azurespheresdk コンテナーに基づいて新しいコンテナーを作成します。

  2. GitHub から Azure Sphere サンプル リポジトリを複製します。

  3. ビルド時にサンプルを格納するディレクトリを作成します。

  4. ビルドするサンプルを指定する環境変数を作成します。

  5. 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 環境変数を使用して、ビルドするサンプルを指定します。 ENV/ の新しい値を設定して、HelloWorld/HelloWorld_HighLevelApp とは異なるサンプルをビルドします。

Dockerfile の手順の詳細については、 Dockerfile の手順の詳細については 行ごとの説明を参照してください。

Dockerfile を使用して既定のサンプル アプリをビルドする

カスタム Dockerfile を使用してサンプル アプリをビルドするには、次の 3 つの手順が必要です。

  1. 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 オプションを使用して名前を指定します。

  2. --name オプションを使用して、コンテナーに簡単な名前を付けます。 run コマンドはコンテナーを入力し、ENV 環境変数で指定されたサンプルをビルドします。 コマンド ライン インターフェイスを使用して、次のコマンドを入力します。

    docker run --name hello_hl azsphere-sampleapp-build
    

    サンプル アプリ (HelloWorld/HelloWorld_HighLevelApp) がビルドされ、コンテナー内の /build ディレクトリに配置されます。 コンテナーの実行が完了すると、コンテナーが終了し、コマンド ライン インターフェイスに戻ります。

    Note

    このコマンドは、操作を行わずにアプリをビルドし、ビルドが完了した後にコンテナーを終了します。 終了した後も、コンテナーはアクティブです。 これは、 -it または --rm オプションを指定していないためです。 Docker Desktop が実行されている限り、後でコンテナーで docker run コマンドをリビルドせずに再度使用できます。

  3. コンテナー内からホスト コンピューター環境にビルドの結果をコピーします。 コマンド ライン インターフェイスを使用して、次のコマンドを入力します。

    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 Sphere CLI コマンドを使用してアプリケーションをデプロイできます。 詳細については、「 アプリケーションのデプロイ」を参照してください。

コンテナーからの USB 経由のデバイス操作はサポートされていません。

Dockerfile 命令の 1 行ずつ説明

で作成された 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 コマンドを使用せずにマシン上のコンテナー内で作業する場合は、exec コマンドを使用し、実行するコンテナー ID と実行するコンテナー内のスクリプト (/bin/bash) を入力します。

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 Sphere CLI コマンドの実行デバイスの回復またはサイドローディング、デバッグのために設計されていません。 コンテナーは USB 関数にアクセスできません。

Docker Linux コンテナーの制限事項

Docker Linux コンテナーは、Linux の完全インストールと同じではありません。 たとえば、Docker Linux コンテナーで Linux GUI アプリケーションを実行することはできません。

マルチステージ ビルド コンテナーを使用して依存関係を減らす

Docker マルチステージ ビルド機能を使用すると、Dockerfile で複数の FROM ステートメントを使用して依存関係を減らすことができます。 各 FROM 命令は異なるベースを使用でき、それぞれがビルドの新しいステージを開始します。

Docker マルチステージ ビルドの詳細については、「 マルチステージ ビルドの使用を参照してください。

ベスト プラクティスとして、Docker ではマルチステージ ビルドが推奨されます。 Docker のベスト プラクティスの詳細については、「 Intro Guide to Dockerfile Best Practicesを参照してください。

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 build コマンドでの名前の使用の詳細については、 Docker ビルド リファレンスを参照してください。