Condividi tramite


Usare i contenitori per creare app Azure Sphere

Nota

Questo argomento descrive come usare Docker Desktop per Windows per creare applicazioni Azure Sphere in un contenitore. Per creare app in un contenitore Docker su Linux, è possibile usare lo stesso contenitore azuresfera dal Registro artefatti Microsoft o MAR (noto anche come Microsoft Container Registry o MCR).

Installare Docker Desktop

È possibile usare Docker per eseguire un contenitore Linux autonomo con Azure Sphere SDK preinstallo. Questa immagine può essere usata anche come base per le distribuzioni personalizzate. Il tag immagine fa riferimento alla versione dell'SDK che contiene.

Prima di scaricare ed eseguire un contenitore Docker, è necessario installare Docker Desktop in Windows o Linux.

Dopo aver installato Docker Desktop per Windows, assicurati di abilitare le funzionalità di Windows Hyper-V e Containers. Potrebbe essere necessario riavviare dopo l'installazione.

Una volta installato, avvia Docker Desktop dal menu Start di Windows o dall'icona di scelta rapida aggiunta al desktop.

Linux è il tipo di contenitore predefinito per Docker Desktop in Windows. Azure Sphere usa contenitori Linux. Per eseguire i contenitori Linux, devi assicurarti che Docker abbia come targeting il daemon corretto. Per verificare che Linux sia il tipo di contenitore predefinito corrente, fai clic con il pulsante destro del mouse sull'icona della balena Docker nell'area di notifica. Se vedi Passa a contenitori di Windows, significa che stai già puntando al daemon Linux. Se utilizzi il contenitore Windows, puoi attivare o disattivare questa opzione selezionando Passa ai contenitori Linux dal menu di azione quando fai clic con il pulsante destro del mouse sull'icona della balena Docker nell'area di notifica. Per ulteriori informazioni, vedi Passare tra contenitori Windows e Linux.

Nota

Attendi l'interruzione dell'animazione dell'icona delle balene docker desktop. L'icona potrebbe trovarsi nell'area delle notifiche nascosta. Passare il puntatore del mouse sull'icona per visualizzare lo stato del desktop di Docker.

Usare il contenitore di ambiente di compilazione azure sphere SDK per creare app di esempio

È possibile utilizzare un contenitore in modo interattivo immettendolo e rilasciando il comando; tuttavia, è più efficiente acquisire i passaggi necessari per creare le applicazioni in un file che Docker può usare per creare un'immagine personalizzata basata sull'immagine Azure Sphere originale. In questo modo il processo di compilazione sarà ripetibile e coerente. Per impostazione predefinita, il file deve essere denominato Dockerfile e trovarsi nella $PATH in cui viene eseguito il comando docker.

I passaggi seguenti forniscono una struttura per la creazione di istruzioni Dockerfile per creare campioni di Azure Sphere. È possibile modificare questi passaggi in base alle proprie esigenze.

  1. Creare un nuovo contenitore basato sul contenitore mcr.microsoft.com/azurespheresdk.

  2. Clonare il repository campioni di Azure Sphere da GitHub.

  3. Creare una directory in cui archiviare l'esempio quando viene compilato.

  4. Creare una variabile di ambiente per specificare l'esempio da compilare.

  5. Eseguire CMake per compilare l'esempio e inserirlo nella directory specificata.

Creare un dockerfile per la creazione di campioni

Per creare un'immagine Docker basata sull'immagine Azure Sphere ma con funzionalità di compilazione personalizzate, creare un file di testo (senza estensione file) con le istruzioni seguenti:

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

Questo file usa la variabile di ambiente ENV per specificare l'esempio da creare. Imposta un nuovo valore per ENV per creare un campione diverso da HelloWorld/HelloWorld_HighLevelApp.

Per altre informazioni sulle istruzioni di Dockerfile, vedere Discussione riga per riga delle istruzioni su Dockerfile .

Creare l'app di esempio predefinita usando Dockerfile

Per creare un'app di esempio usando un dockerfile personalizzato sono necessari tre passaggi:

  1. Crea l'immagine da Dockerfile utilizzando un'interfaccia della riga di comando come PowerShell, il prompt dei comandi di Windows o la shell dei comandi di Linux:

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

    L'opzione --target specifica la parte di una build a più fasi da usare. L'opzione --tag specifica un nome dell'immagine e deve contenere solo caratteri minuscoli. Le immagini docker devono sempre usare solo lettere minuscole. Se non si specifica un nome con --tag, l'immagine avrà un numero di 12 cifre che non è facile da usare. Non dimenticare il punto alla fine del comando. È possibile elencare le immagini con il docker images comando.

    Docker compila un'immagine denominata azsfera-sampleapp-build basata sul file denominato "Dockerfile". Se al dockerfile viene assegnato un nome diverso, usare l'opzione --file per specificare il nome.

  2. Assegnare al contenitore un nome più semplice usando l'opzione --name . Il run comando immetterà il contenitore e creerà l'esempio specificato dalla variabile di ambiente ENV . Usare l'interfaccia della riga di comando per immettere questo comando:

    docker run --name hello_hl azsphere-sampleapp-build
    

    L'app di esempio (HelloWorld/HelloWorld_HighLevelApp) verrà creata e inserita nella /build directory all'interno del contenitore. Al termine dell'esecuzione, il contenitore verrà chiuso e si tornerà all'interfaccia della riga di comando.

    Nota

    Questo comando crea l'app senza alcuna interazione e chiude il contenitore al termine della build. Il contenitore è ancora attivo dopo la chiusura. Il motivo è che non è stata specificata l'opzione -it o --rm . In seguito sarà possibile usare di nuovo il docker run comando nel contenitore senza ricompilarlo, a condizione che Docker Desktop sia in esecuzione.

  3. Copiare i risultati della build dall'interno del contenitore all'ambiente computer host. Usare l'interfaccia della riga di comando per immettere questo comando:

    docker cp hello_hl:/build .
    

    Questo comando copia il contenuto della /build directory all'interno del contenitore di hello_h1 nella directory del computer host da cui si esegue il comando. La /build directory viene specificata come directory di lavoro (WORKDIR) in cui deve essere compilato l'esempio. Si noti che si è ancora al di fuori del contenitore, ma l'emissione di comandi ad esso utilizzando il comando docker cp . Non dimenticare il punto alla fine del comando.

Creare un esempio diverso usando il file Docker personalizzato

Per creare un campione diverso, ad esempio l'esempio GPIO, fornire il percorso del campione GPIO.

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

Al termine della build, copiare il risultato dall'interno del contenitore nell'ambiente computer host:

docker cp gpio_hl:/build .

Non dimenticare il punto alla fine del comando.

Dopo aver copiato il pacchetto nell'ambiente del computer host, è possibile usare i comandi CLI di Azure da Windows o Linux per distribuire l'applicazione. Per altre informazioni, vedere Distribuire l'applicazione.

L'interazione del dispositivo tramite USB da un contenitore non è supportata.

Discussione riga per riga delle istruzioni di Dockerfile

Ogni parte del Dockerfile creato in Create a Dockerfile for building samples è illustrata di seguito.

Prepararsi per più build

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

Questa linea configura una nuova build, azsfera-samples-repo, basata sul contenitore di microsoft.com/azurespheresdk originale.

Scarica i campioni di Azure Sphere

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

Questa linea clona tutti i campioni del repository campioni azure sphere.

Aggiungere un'altra build multi-stage di destinazione

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

Questa linea aggiunge una nuova build basata sulla build azsfera-samples-repo .

Impostare la directory di lavoro all'interno del contenitore

RUN mkdir /build
WORKDIR /build

Queste righe creano una nuova directory di lavoro.

Creare una variabile di ambiente predefinita per specificare un esempio

ENV sample=HelloWorld/HelloWorld_HighLevelApp

Questa riga crea una variabile di ambiente che specifica il campione da creare. In questo caso, è l'esempio HelloWorld_HighLevelApp. La variabile di ambiente può essere sottoposta a override per specificare qualsiasi nome e percorso di esempio.

Esegui CMake e Ninja per creare un pacchetto

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

Questa sezione utilizza CMake per specificare i parametri usati per richiamare Ninja per creare il pacchetto.

Al termine della compilazione, il contenitore verrà interrotto.

Suggerimenti per Docker

Questi suggerimenti possono aiutarti a usare Docker in modo più efficace.

Usare il comando Esegui docker per esplorare il contenitore di base in modo interattivo

Usare l'interfaccia della riga di comando per immettere questo comando:

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

In questo esempio è mcr.microsoft.com/azurespheresdk il nome dell'immagine da cui viene creato il contenitore. Si noti che l'opzione --rm chiude il contenitore dopo l'esecuzione e l'opzione specifica l'accesso -it interattivo al contenitore.

Il contenitore Docker dell'ambiente di compilazione azure sphere SDK viene fornito dal Registro artefatti Microsoft (MAR) ed è disponibile al pubblico.

Se il contenitore è già nel computer locale, non verrà scaricato di nuovo.

Il download e la configurazione possono richiedere alcuni minuti. L'ambiente di compilazione include tutto il necessario per creare un pacchetto utilizzando azure sphere linux SDK.

Al termine del run comando, il prompt dei comandi diventerà un segno "#". Ora ti trovi all'interno di un contenitore Docker basato su Linux. Digitando ls visualizzerai la directory Linux corrente all'interno del contenitore, in modo simile a questo elenco:

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

Digitare exit per uscire dal contenitore. Il contenitore non sarà più disponibile e sarà necessario crearlo di nuovo con questo comando:

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

Se non si usa l'opzione --rm , il contenitore non verrà eliminato quando si esce.

Identificazione del contenitore

Quando si crea un nuovo contenitore, questo avrà un ID, ad a250ade97090 esempio (l'ID sarà diverso). Per molti comandi Docker, è necessario usare l'ID invece dell'indirizzo di microsoft.com/azurespheresdk .

Ecco un tipico elenco di informazioni di base sui contenitori nel sistema utilizzando questo comando:

docker ps --all

Il risultato sarà simile al seguente:

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

L'ID sarà diverso. Si noti che Docker crea nomi casuali per il proprietario del contenitore. Si noti che in questo esempio è presente un solo contenitore.

Lavorare all'interno del contenitore

Se si vuole lavorare all'interno di un contenitore nel computer senza usare il comando esegui , usare il comando exec con l'ID contenitore e lo script nel contenitore da eseguire (/bin/bash) digitando:

docker exec -t a250ade97090 /bin/bash

Il prompt dei comandi diventerà un segno "#". Ora ti trovi in un contenitore Docker basato su Linux. Digitando ls visualizzerai la directory Linux corrente all'interno del contenitore:

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

Per uscire dal contenitore, digitare il exit comando.

Limitazioni del contenitore della build azure sphere SDK

Il contenitore di build azure sphere SDK è progettato per creare solo pacchetti Azure Sphere. Non è progettato per l'esecuzione di comandi CLI di Azure, il ripristino o il sideload di dispositivi o il debug. Il contenitore non ha accesso alle funzioni USB.

Limitazioni del contenitore Docker Linux

Un contenitore Docker Linux non è lo stesso di un'installazione completa di Linux. Ad esempio, non è possibile eseguire applicazioni GUI Linux in un contenitore Docker Linux.

Usare i contenitori di compilazione in più fasi per ridurre le dipendenze

La funzionalità di compilazione a più fasi Docker consente di usare più istruzioni FROM in Dockerfile per ridurre le dipendenze. Ogni istruzione FROM può usare una base diversa e ognuna di esse inizia una nuova fase della build.

Per altre informazioni sulle build a più fasi di Docker, vedere Usare le build a più fasi.

Le build a più fasi sono consigliate da Docker come procedura consigliata. Per altre informazioni sulle procedure consigliate di Docker, vedere Guida introduttiva alle procedure consigliate per Dockerfile.

Aggiungere un nome significativo al passaggio con l'argomento AS

Per impostazione predefinita, i passaggi non sono denominati, ma hanno un numero ID. È possibile rendere il file Docker più leggibile aggiungendo un nome significativo al passaggio aggiungendo AS e un nome. Per esempio:

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

Per altre informazioni sull'uso dell'argomento AS nei comandi a più fasi, vedere Assegnare un nome alle fasi della build.

Creare la destinazione con un nome significativo come procedura consigliata

Quando si crea una destinazione, è possibile assegnarle un nome significativo usando l'opzione --tag . I nomi significativi sono utili. Per esempio:

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

Per altre informazioni sull'uso dei nomi con il comando di compilazione Docker, vedere il riferimento alla build di Docker.