Freigeben über


Verwenden von Containern zum Erstellen von Azure Sphere-Apps

Hinweis

In diesem Thema wird beschrieben, wie Sie Mithilfe von Docker Desktop für Windows Azure Sphere-Anwendungen in einem Container erstellen. Zum Erstellen von Apps in einem Docker-Container unter Linux können Sie denselben azurespheresdk-Container aus dem Microsoft-Artefaktregistrierung oder MAR (auch als Microsoft Container Registry oder MCR bezeichnet) verwenden.

Installieren von Docker Desktop

Sie können Docker verwenden, um einen eigenständigen Linux-Container mit vorinstalliertem Azure Sphere SDK auszuführen. Dieses Image kann auch als Basis für Ihre eigenen Bereitstellungen verwendet werden. Das Imagetag bezieht sich auf die Version des sdk, das es enthält.

Bevor Sie einen Docker-Container herunterladen und ausführen können, müssen Sie Docker Desktop unter Windows oder Linux installieren.

Nachdem Sie Docker Desktop für Windows installiert haben, stellen Sie sicher, dass Sie die Windows-Features Hyper-V und Container aktivieren. Möglicherweise müssen Sie nach der Installation neu starten.

Starten Sie Docker Desktop nach der Installation über das Windows-Startmenü oder über das Verknüpfungssymbol, das Ihrem Desktop hinzugefügt wurde.

Linux ist der Standardcontainertyp für Docker Desktop unter Windows. Azure Sphere verwendet Linux-Container. Um Linux-Container auszuführen, müssen Sie sicherstellen, dass Docker auf den richtigen Daemon abzielt. Um zu überprüfen, ob Linux der aktuelle Standardcontainertyp ist, klicken Sie mit der rechten Maustaste auf das Docker-Walsymbol in der Taskleiste. Wenn Wechsel zu Windows-Containern angezeigt wird, haben Sie bereits den Linux-Daemon als Ziel. Wenn Sie sich im Windows-Container befinden, können Sie dies umschalten, indem Sie im Aktionsmenü auf Zu Linux-Container wechseln klicken, wenn Sie mit der rechten Maustaste auf das Docker-Walsymbol in der Taskleiste klicken. Weitere Informationen finden Sie unter Wechseln zwischen Windows- und Linux-Containern.

Hinweis

Warten Sie, bis die Animation des Docker Desktop-Walsymbols beendet wird. Das Symbol befindet sich möglicherweise im ausgeblendeten Benachrichtigungsbereich. Zeigen Sie auf das Symbol, um die Docker Desktop-status anzuzeigen.

Verwenden des Azure Sphere SDK-Buildumgebungscontainers zum Erstellen von Beispiel-Apps

Sie können einen Container interaktiv verwenden, indem Sie ihn eingeben und einen Befehl ausgeben. Es ist jedoch effizienter, die erforderlichen Schritte zum Erstellen Ihrer Anwendungen in einer Datei zu erfassen, die Docker verwenden kann, um ein benutzerdefiniertes Image basierend auf dem ursprünglichen Azure Sphere-Image zu erstellen. Dadurch wird sichergestellt, dass der Buildprozess wiederholbar und konsistent ist. Standardmäßig muss diese Datei den Namen Dockerfile tragen und sich im $PATH befinden, in dem der docker-Befehl ausgeführt wird.

Die folgenden Schritte enthalten eine Gliederung zum Erstellen von Dockerfile-Anweisungen zum Erstellen von Azure Sphere-Beispielen. Sie können diese Schritte an Ihre eigenen Anforderungen anpassen.

  1. Erstellen Sie einen neuen Container basierend auf dem mcr.microsoft.com/azurespheresdk Container.

  2. Klonen Sie das Azure Sphere-Beispielrepository von GitHub.

  3. Erstellen Sie ein Verzeichnis, in dem Ihr Beispiel gespeichert wird, wenn es erstellt wird.

  4. Erstellen Sie eine Umgebungsvariable, um das Beispiel anzugeben, das Sie erstellen möchten.

  5. Führen Sie CMake aus, um das Beispiel zu erstellen, und platzieren Sie es im angegebenen Verzeichnis.

Erstellen einer Dockerfile-Datei zum Erstellen von Beispielen

Um ein Docker-Image basierend auf dem Azure Sphere-Image, aber mit benutzerdefinierter Buildfunktionalität zu erstellen, erstellen Sie eine Textdatei (ohne Dateierweiterung) mit den folgenden Docker-Anweisungen:

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

Diese Datei verwendet die ENV-Umgebungsvariable, um das zu erstellende Beispiel anzugeben. Legen Sie einen neuen Wert für ENV fest, um ein Beispiel zu erstellen, das sich von HelloWorld/HelloWorld_HighLevelApp unterscheidet.

Weitere Informationen zu den Dockerfile-Anweisungen finden Sie unter Ausführlichere Informationen zu den Dockerfile-Anweisungen .

Erstellen der Standardbeispiel-App mithilfe der Dockerfile-Datei

Es sind drei Schritte erforderlich, um eine Beispiel-App mit einer benutzerdefinierten Dockerfile-Datei zu erstellen:

  1. Erstellen Sie das Image aus der Dockerfile-Datei mithilfe einer Befehlszeilenschnittstelle wie PowerShell, Windows-Eingabeaufforderung oder Linux-Befehlsshell:

    docker build --target azsphere-sampleapp-build --tag azsphere-sampleapp-build .
    
    

    Die --target Option gibt an, welcher Teil eines mehrstufigen Builds verwendet werden soll. Die --tag Option gibt einen Namen des Images an und darf nur in Kleinbuchstaben enthalten sein. Docker-Images dürfen immer nur Kleinbuchstaben verwenden. Wenn Sie keinen Namen mit --tagangeben, hat das Bild eine 12-stellige Zahl, mit der nicht einfach zu arbeiten ist. Vergessen Sie nicht den Punkt am Ende des Befehls. Sie können die Bilder mit dem docker images Befehl auflisten.

    Docker erstellt ein Image mit dem Namen azsphere-sampleapp-build basierend auf der Datei "Dockerfile". Wenn Ihr Dockerfile einen anderen Namen hat, verwenden Sie die --file Option, um den Namen anzugeben.

  2. Geben Sie dem Container mithilfe der Option einen einfacheren --name Namen. Der run Befehl gelangt in den Container und erstellt das von der ENV-Umgebungsvariable angegebene Beispiel. Verwenden Sie die Befehlszeilenschnittstelle, um diesen Befehl einzugeben:

    docker run --name hello_hl azsphere-sampleapp-build
    

    Die Beispiel-App (HelloWorld/HelloWorld_HighLevelApp) wird erstellt und im /build Verzeichnis innerhalb des Containers platziert. Wenn die Ausführung des Containers abgeschlossen ist, wird er beendet, und Sie gelangen zurück zur Befehlszeilenschnittstelle.

    Hinweis

    Dieser Befehl erstellt die App ohne Interaktion und beendet den Container, nachdem der Build abgeschlossen ist. Der Container ist nach dem Beenden weiterhin aktiv. Dies liegt daran, dass Sie die -it - oder --rm -Optionen nicht angegeben haben. Sie können den docker run Befehl später erneut für den Container verwenden, ohne ihn neu zu erstellen, solange Docker Desktop ausgeführt wird.

  3. Kopieren Sie die Ergebnisse Ihres Builds aus Ihrem Container in Ihre Hostcomputerumgebung. Verwenden Sie die Befehlszeilenschnittstelle, um diesen Befehl einzugeben:

    docker cp hello_hl:/build .
    

    Dieser Befehl kopiert den Inhalt des /build Verzeichnisses innerhalb des hello_h1 Containers in das Verzeichnis auf Ihrem Hostcomputer, von dem aus Sie den Befehl ausgeben. Das /build Verzeichnis wird als Arbeitsverzeichnis (WORKDIR) angegeben, in das das Beispiel kompiliert werden soll. Beachten Sie, dass Sie sich immer noch außerhalb des Containers befinden, aber Befehle mit dem Befehl docker cp für ihn ausgeben. Vergessen Sie nicht den Punkt am Ende des Befehls.

Erstellen eines anderen Beispiels mithilfe der benutzerdefinierten Dockerfile-Datei

Um ein anderes Beispiel zu erstellen, z. B. das GPIO-Beispiel, geben Sie den Pfad zum GPIO-Beispiel an.

docker run --name gpio_hl --env sample=GPIO/GPIO_HighLevelApp azsphere-sampleapp-build

Kopieren Sie nach Abschluss des Builds das Ergebnis aus Ihrem Container in Ihre Hostcomputerumgebung:

docker cp gpio_hl:/build .

Vergessen Sie nicht den Punkt am Ende des Befehls.

Nachdem Ihr Paket in Ihre Hostcomputerumgebung kopiert wurde, können Sie Azure CLI-Befehle von Windows oder Linux verwenden, um Ihre Anwendung bereitzustellen. Weitere Informationen finden Sie unter Bereitstellen der Anwendung.

Die Geräteinteraktion über USB aus einem Container wird nicht unterstützt.

Ausführliche Erläuterung der Dockerfile-Anweisungen

Jeder Teil der Dockerfile-Datei, die unter Erstellen einer Dockerfile-Datei zum Erstellen von Beispielen erstellt wurde, wird unten erläutert.

Vorbereiten auf mehrere Builds

FROM mcr.microsoft.com/azurespheresdk AS azsphere-samples-repo

Diese Zeile richtet einen neuen Build ein, azsphere-samples-repo, basierend auf dem ursprünglichen microsoft.com/azurespheresdk Container.

Herunterladen der Azure Sphere-Beispiele

RUN git clone https://github.com/Azure/azure-sphere-samples.git

In dieser Zeile werden alle Beispiele aus dem Azure Sphere-Beispielrepository geklont.

Hinzufügen eines weiteren zielfähigen mehrstufigen Builds

FROM azsphere-samples-repo AS azsphere-sampleapp-build

In dieser Zeile wird ein neuer Build hinzugefügt, der auf azsphere-samples-repo build basiert.

Festlegen des Arbeitsverzeichnisses im Container

RUN mkdir /build
WORKDIR /build

Diese Zeilen erstellen ein neues Arbeitsverzeichnis.

Erstellen einer Standardumgebungsvariablen zum Angeben eines Beispiels

ENV sample=HelloWorld/HelloWorld_HighLevelApp

Diese Zeile erstellt eine Umgebungsvariable, die das zu erstellende Beispiel angibt. In diesem Fall handelt es sich um das HelloWorld_HighLevelApp Beispiel. Die Umgebungsvariable kann überschrieben werden, um einen beliebigen Beispielnamen und Pfad anzugeben.

Ausführen von CMake und Ninja zum Erstellen eines Pakets

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

In diesem Abschnitt wird CMake verwendet, um Parameter anzugeben, die beim Aufrufen von Ninja zum Erstellen des Pakets verwendet werden.

Nach Abschluss des Builds wird die Ausführung des Containers beendet.

Docker-Tipps

Diese Tipps können Ihnen helfen, effektiver mit Docker zu arbeiten.

Verwenden sie den Befehl docker run, um den Basiscontainer interaktiv zu untersuchen.

Verwenden Sie die Befehlszeilenschnittstelle, um diesen Befehl einzugeben:

docker run --rm -it mcr.microsoft.com/azurespheresdk

In diesem Beispiel ist der Name des Images, mcr.microsoft.com/azurespheresdk aus dem der Container erstellt wird. Beachten Sie, dass die --rm Option den Container nach der Ausführung herunterfährt und die -it Option den interaktiven Zugriff auf den Container angibt.

Der Docker-Container der Azure Sphere SDK-Buildumgebung wird vom Microsoft-Artefaktregistrierung (MAR) bereitgestellt und steht der Öffentlichkeit zur Verfügung.

Wenn sich der Container bereits auf Ihrem lokalen Computer befindet, wird er nicht erneut heruntergeladen.

Der Download und die Einrichtung können einige Minuten dauern. Die Buildumgebung enthält alles, was zum Erstellen eines Pakets mit dem Azure Sphere Linux SDK erforderlich ist.

Nachdem der run Befehl abgeschlossen ist, ändert sich die Eingabeaufforderung in ein "#"-Zeichen. Sie befinden sich jetzt in einem Linux-basierten Docker-Container. Wenn Sie ls eingeben, wird das aktuelle Linux-Verzeichnis im Container angezeigt, ähnlich wie in dieser Auflistung:

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

Geben Sie ein exit , um den Container zu verlassen. Der Container steht Ihnen nicht mehr zur Verfügung, und Sie müssen ihn mit diesem Befehl erneut erstellen:

docker run --rm -it mcr.microsoft.com/azurespheresdk

Wenn Sie die --rm Option nicht verwenden, wird der Container beim Beenden nicht gelöscht.

Containeridentifikation

Wenn Sie einen neuen Container erstellen, verfügt er über eine ID wie a250ade97090 (Ihre ID ist anders). Für viele Docker-Befehle müssen Sie die ID anstelle der microsoft.com/azurespheresdk-Adresse verwenden.

Hier ist eine typische Auflistung grundlegender Informationen zu den Containern auf Ihrem System, die diesen Befehl verwenden:

docker ps --all

Das Ergebnis sieht in etwa wie folgt aus:

CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS               NAMES
a250ade97090        microsoft.com/azurespheresdk   "/bin/bash"         15 minutes ago      Up 9 seconds                            pedantic_kilby

Ihre ID ist anders. Beachten Sie, dass Docker zufällige Namen für den Containerbesitzer ausgibt. Beachten Sie, dass in diesem Beispiel nur ein Container vorhanden ist.

Arbeiten im Container

Wenn Sie in einem Container auf Ihrem Computer arbeiten möchten, ohne den Befehl ausführen zu verwenden, verwenden Sie den Befehl exec mit der Container-ID und dem Skript im Container, den Sie ausführen möchten (/bin/bash), indem Sie Folgendes eingeben:

docker exec -t a250ade97090 /bin/bash

Ihre Eingabeaufforderung ändert sich in ein "#"-Zeichen. Sie befinden sich jetzt in einem Linux-basierten Docker-Container. Wenn Sie ls eingeben, wird das aktuelle Linux-Verzeichnis im Container angezeigt:

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

Geben Sie den Befehl ein, um den exit Container zu verlassen.

Einschränkungen beim Erstellen von Azure Sphere SDK-Buildcontainern

Der Azure Sphere SDK-Buildcontainer ist nur für die Erstellung von Azure Sphere-Paketen konzipiert. Es ist nicht für die Ausführung von Azure CLI-Befehlen, das Wiederherstellen oder Querladen von Geräten oder das Debuggen konzipiert. Der Container hat keinen Zugriff auf USB-Funktionen.

Einschränkungen von Docker Linux-Containern

Ein Docker Linux-Container ist nicht identisch mit einer vollständigen Installation von Linux. Beispielsweise können Sie keine Linux-GUI-Anwendungen in einem Docker Linux-Container ausführen.

Verwenden von mehrstufigen Buildcontainern zum Reduzieren von Abhängigkeiten

Mit dem mehrstufigen Docker-Buildfeature können Sie mehrere FROM-Anweisungen in Ihrer Dockerfile-Datei verwenden, um Abhängigkeiten zu reduzieren. Jede FROM-Anweisung kann eine andere Basis verwenden, und jede von ihnen beginnt eine neue Phase des Builds.

Weitere Informationen zu mehrstufigen Docker-Builds finden Sie unter Verwenden von mehrstufigen Builds.

Mehrstufige Builds werden von Docker als bewährte Methode empfohlen. Weitere Informationen zu bewährten Docker-Methoden finden Sie im Einführungshandbuch zu bewährten Methoden für Dockerfile.

Hinzufügen eines aussagekräftigen Namens zu Ihrer Phase mit dem AS-Argument

Standardmäßig werden die Phasen nicht benannt, weisen jedoch eine ID-Nummer auf. Sie können Ihre Dockerfile-Datei besser lesbar machen, indem Sie der Phase einen aussagekräftigen Namen hinzufügen, indem Sie AS und einen Namen anfügen. Zum Beispiel:

FROM mcr.microsoft.com/azurespheresdk AS azsphere-samples-repo

Weitere Informationen zur Verwendung des AS-Arguments in mehrstufigen Befehlen finden Sie unter Benennen Ihrer Buildphasen.

Erstellen des Ziels mit einem aussagekräftigen Namen als bewährte Methode

Wenn Sie ein Ziel erstellen, können Sie ihm mithilfe der Option --tag einen aussagekräftigen Namen geben. Aussagekräftige Namen sind nützlich. Zum Beispiel:

docker build --target azsphere-sampleapp-build --tag azsphere-sampleapp-build .

Weitere Informationen zur Verwendung von Namen mit dem Docker-Buildbefehl finden Sie in der Docker-Buildreferenz.