Compartir vía


Usar contenedores para crear aplicaciones Azure Sphere

Nota

En este tema se describe cómo usar Docker Desktop para Windows para crear aplicaciones Azure Sphere en un contenedor. Para crear aplicaciones en un contenedor de Docker en Linux, puede usar el mismo contenedor azurespheresdk desde el Registro de artefactos Microsoft o MAR (también conocido como Microsoft Container Registry o MCR).

Instalar Docker Desktop

Puede usar Docker para ejecutar un contenedor de Linux independiente con el SDK de Azure Sphere preinstalado. Esta imagen también se puede usar como base para sus propias implementaciones. La etiqueta de imagen hace referencia a la versión del SDK que contiene.

Para poder descargar y ejecutar un contenedor de Docker, debe instalar Docker Desktop en Windows o Linux.

Después de haber instalado Docker Desktop para Windows, asegúrese de habilitar las características de Windows Hyper-V y Contenedores. Es posible que tengas que reiniciar después de la instalación.

Una vez instalada, inicie Docker Desktop desde el menú Inicio de Windows o desde el icono de acceso directo agregado al escritorio.

Linux es el tipo de contenedor predeterminado para Docker Desktop en Windows. Azure Sphere usa contenedores de Linux. Para ejecutar contenedores de Linux, debe asegurarse de que Docker se dirige al demonio correcto. Para comprobar que Linux es el tipo de contenedor predeterminado actual, haga clic con el botón derecho en el icono de Docker whale en la bandeja del sistema. Si ve Cambiar a contenedores de Windows, entonces ya está apuntando al demonio Linux. Si se encuentra en el contenedor de Windows, puede activar o desactivar esta opción seleccionando Cambiar a contenedores de Linux en el menú de acciones al hacer clic con el botón derecho en el icono de la ballena Docker en la bandeja del sistema. Para obtener más información, consulta Cambiar entre contenedores de Windows y Linux.

Nota

Espere hasta que se detenga la animación del icono de ballena de Docker Desktop. El icono puede estar en el área de notificaciones ocultas. Mantenga el mouse sobre el icono para ver el estado de Docker Desktop.

Usar el contenedor de entorno de compilación del SDK de Azure Sphere para compilar aplicaciones de ejemplo

Puede usar un contenedor de forma interactiva si lo escribe y emite el comando; sin embargo, es más eficaz capturar los pasos necesarios para crear las aplicaciones en un archivo que Docker puede usar para crear una imagen personalizada basada en la imagen original de Azure Sphere. Esto garantiza que el proceso de compilación sea repetible y coherente. De forma predeterminada, este archivo debe llamarse Dockerfile y estar en la $PATH donde se ejecuta el comando docker.

En los pasos siguientes se proporciona un esquema para crear instrucciones de Dockerfile para crear muestras de Azure Sphere. Puede ajustar estos pasos según sus propias necesidades.

  1. Cree un nuevo contenedor basado en el mcr.microsoft.com/azurespheresdk contenedor.

  2. Clone el repositorio de muestras de Azure Sphere desde GitHub.

  3. Cree un directorio en el que almacenar el ejemplo cuando se cree.

  4. Cree una variable de entorno para especificar el ejemplo que desea generar.

  5. Ejecute CMake para generar el ejemplo y colocarlo en el directorio especificado.

Crear un Dockerfile para generar ejemplos

Para crear una imagen de Docker basada en la imagen de Azure Sphere pero con funcionalidad de compilación personalizada, cree un archivo de texto (sin extensión de archivo) con las siguientes instrucciones de 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

Este archivo usa la variable de entorno ENV para especificar la muestra que se va a crear. Establezca un nuevo valor para ENV para crear una muestra diferente de HelloWorld/HelloWorld_HighLevelApp.

Vea la discusión línea a línea de las instrucciones de Dockerfile para obtener más información sobre las instrucciones de Dockerfile.

Crear la aplicación de ejemplo predeterminada con Dockerfile

Hay tres pasos necesarios para crear una aplicación de ejemplo con un Dockerfile personalizado:

  1. Cree la imagen desde Dockerfile mediante una interfaz de línea de comandos como PowerShell, símbolo del sistema de Windows o shell de comandos de Linux:

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

    La --target opción especifica qué parte de una compilación de varias fases se usará. La --tag opción especifica un nombre de la imagen y solo debe estar en minúsculas. Las imágenes docker siempre deben usar letras minúsculas únicamente. Si no especifica un nombre con --tag, la imagen tendrá un número de 12 dígitos con el que no es fácil trabajar. No olvide el punto al final del comando. Puede enumerar las imágenes con el docker images comando.

    Docker creará una imagen denominada azsphere-sampleapp-build basada en el archivo denominado "Dockerfile". Si dockerfile tiene otro nombre, use la --file opción para especificar el nombre.

  2. Asigne un nombre más sencillo al contenedor con la --name opción. El run comando especificará el contenedor y creará el ejemplo especificado por la variable de entorno ENV . Utilice la interfaz de línea de comandos para entrar este comando:

    docker run --name hello_hl azsphere-sampleapp-build
    

    La aplicación de ejemplo (HelloWorld/HelloWorld_HighLevelApp) se creará y se colocará en el /build directorio dentro del contenedor. Cuando el contenedor termine de ejecutarse, saldrá y le llevará de nuevo a la interfaz de línea de comandos.

    Nota

    Este comando genera la aplicación sin ninguna interacción y sale del contenedor una vez finalizada la compilación. El contenedor sigue activo después de salir. Esto se debe a que no ha especificado las -it opciones o --rm . Más adelante puede volver a usar el docker run comando en el contenedor sin recompilarlo, siempre y cuando Docker Desktop se esté ejecutando.

  3. Copie los resultados de la compilación desde el interior del contenedor en el entorno del equipo host. Utilice la interfaz de línea de comandos para entrar este comando:

    docker cp hello_hl:/build .
    

    Este comando copia el contenido del directorio dentro del /build contenedor de hello_h1 al directorio de su equipo host desde el que emite el comando. El /build directorio se especifica como el directorio de trabajo (WORKDIR) en el que se va a compilar el ejemplo. Tenga en cuenta que todavía está fuera del contenedor pero emitiendo comandos a él mediante el comando docker cp . No olvide el punto al final del comando.

Crear un ejemplo diferente con el archivo Dockerfile personalizado

Para crear un ejemplo diferente, por ejemplo, el ejemplo de GPIO, proporcione la ruta de acceso a la muestra de GPIO.

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

Una vez completada la compilación, copie el resultado del interior del contenedor en el entorno del equipo host:

docker cp gpio_hl:/build .

No olvide el punto al final del comando.

Después de copiar el paquete en el entorno del equipo host, puede usar los comandos de la CLI de Azure de Windows o Linux para implementar la aplicación. Para obtener más información, vea Implementar la aplicación.

No se admite la interacción del dispositivo mediante USB desde un contenedor.

Discusión línea por línea de las instrucciones de Dockerfile

A continuación se explica cada parte del Dockerfile creado en Crear un Dockerfile para generar ejemplos .

Prepararse para varias compilaciones

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

Esta línea configura una nueva compilación, azsphere-samples-repo, basada en el contenedor microsoft.com/azurespheresdk original.

Descargar las muestras de Azure Sphere

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

Esta línea clona todas las muestras del repositorio de muestras de Azure Sphere.

Agregar otra compilación de varias fases que se pueda destinar

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

Esta línea agrega una nueva compilación basada en la compilación azsphere-samples-repo .

Establecer el directorio de trabajo dentro del contenedor

RUN mkdir /build
WORKDIR /build

Estas líneas crean un nuevo directorio de trabajo.

Crear una variable de entorno predeterminada para especificar una muestra

ENV sample=HelloWorld/HelloWorld_HighLevelApp

Esta línea crea una variable de entorno que especifica el ejemplo que se va a generar. En este caso, es el HelloWorld_HighLevelApp muestra. La variable de entorno se puede reemplazar para especificar cualquier nombre de ejemplo y ruta de acceso.

Ejecutar CMake y Ninja para crear un paquete

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

Esta sección usa CMake para especificar los parámetros utilizados al invocar Ninja para crear el paquete.

Cuando finalice la compilación, el contenedor dejará de ejecutarse.

Sugerencias de Docker

Estas sugerencias pueden ayudarle a trabajar con Docker de forma más eficaz.

Use el comando docker run para explorar el contenedor base de forma interactiva

Utilice la interfaz de línea de comandos para entrar este comando:

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

En este ejemplo, mcr.microsoft.com/azurespheresdk es el nombre de la imagen desde la que se crea el contenedor. Tenga en cuenta que la --rm opción cierra el contenedor después de que se ejecute y la opción especifica el -it acceso interactivo al contenedor.

El contenedor de Docker del entorno de compilación del SDK de Azure Sphere es proporcionado por el Registro de artefactos Microsoft (MAR) y está disponible para el público.

Si el contenedor ya está en su equipo local, no se descargará de nuevo.

La descarga y la configuración pueden tardar varios minutos. El entorno de compilación incluye todo lo necesario para crear un paquete con el SDK de Linux de Azure Sphere.

Una vez completado el run comando, el símbolo del sistema cambiará a un signo "#". Ahora se encuentra dentro de un contenedor docker basado en Linux. Al escribir ls se mostrará el directorio linux actual dentro del contenedor, similar a esta lista:

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

Escriba exit para salir del contenedor. El contenedor ya no estará disponible y tendrá que crearlo de nuevo con este comando:

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

Si no usa la --rm opción, el contenedor no se eliminará al salir.

Identificación de contenedor

Cuando se crea un contenedor nuevo, este tendrá un identificador como a250ade97090 (el id. será diferente). Para muchos comandos de Docker, debe usar el Id. en lugar de la dirección microsoft.com/azurespheresdk .

Esta es una lista típica de información básica sobre los contenedores del sistema mediante este comando:

docker ps --all

El resultado será similar a este:

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

Su id. será diferente. Tenga en cuenta que Docker compone nombres aleatorios para el propietario del contenedor. Tenga en cuenta que en este ejemplo, solo hay un contenedor.

Trabajar dentro del contenedor

Si desea trabajar dentro de un contenedor en su equipo sin usar el comando de ejecución , use el comando exec con el id. de contenedor y el script en el contenedor que desea ejecutar (/bin/bash) escribiendo:

docker exec -t a250ade97090 /bin/bash

El símbolo del sistema cambiará a un signo "#". Ahora se encuentra en un contenedor de Docker basado en Linux. Escribir ls le mostrará el directorio linux actual dentro del contenedor:

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

Para salir del contenedor, escriba el exit comando.

Limitaciones de contenedor de compilación del SDK de Azure Sphere

El contenedor de compilación del SDK de Azure Sphere está diseñado solo para compilar paquetes de Azure Sphere. No está diseñado para ejecutar comandos de la CLI de Azure, recuperar o realizar instalaciones de prueba de dispositivos ni para depurar. El contenedor no tiene acceso a las funciones USB.

Limitaciones de contenedor de Docker Linux

Un contenedor de Docker Linux no es lo mismo que una instalación completa de Linux. Por ejemplo, no puede ejecutar aplicaciones de GUI de Linux en un contenedor de Linux de Docker.

Usar contenedores de compilación de varias fases para reducir las dependencias

La característica de compilación de varias fases de Docker le permite usar varias instrucciones FROM en dockerfile para reducir las dependencias. Cada instrucción FROM puede usar una base diferente y cada una de ellas comienza una nueva fase de la compilación.

Para obtener más información sobre las compilaciones de varias fases de Docker, vea Usar compilaciones de varias fases.

Docker recomienda las compilaciones de varias fases como práctica recomendada. Para obtener más información sobre los procedimientos recomendados de Docker, consulte la Guía de introducción a los procedimientos recomendados de Dockerfile.

Agregar un nombre significativo a la fase con el argumento AS

De forma predeterminada, las fases no tienen nombre, pero tienen un número de id. Puede hacer que su Dockerfile sea más legible agregando un nombre significativo a la fase anexando AS y un nombre. Por ejemplo:

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

Para obtener más información sobre el uso del argumento AS en comandos de varias fases, vea Asignar un nombre a las fases de compilación.

Crear el destino con un nombre significativo como procedimiento recomendado

Al crear un destino, puede darle un nombre significativo mediante la opción --tag . Los nombres significativos son útiles. Por ejemplo:

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

Para obtener más información sobre el uso de nombres con el comando Docker build , consulte la referencia de compilación de Docker.