Utiliser Azure Batch pour exécuter des charges de travail de conteneur

Azure Batch vous permet d’exécuter et de mettre à l’échelle de nombreux travaux informatiques par lots sur Azure. Les tâches Batch peuvent être exécutées directement sur des machines virtuelles (nœuds) dans un pool Batch, mais vous pouvez également configurer un pool Batch pour exécuter des tâches dans des conteneurs compatibles Docker sur les nœuds. Cet article vous montre comment créer un pool de nœuds de calcul prenant en charge les tâches en cours d’exécution du conteneur, puis exécuter des tâches du conteneur dans le pool.

Les exemples de code repris ici utilisent les Kits de développement logiciel (SDK) .NET Batch et Python. Vous pouvez également utiliser d’autres kits de développement logiciel (SDK) et outils Batch, notamment le portail Azure, pour créer des pools Batch pour conteneur et pour exécuter des tâches du conteneur.

Pourquoi utiliser des conteneurs ?

Les conteneurs permettent de lancer simplement des tâches par lot sans avoir à gérer un environnement et des dépendances pour exécuter des applications. Les conteneurs déploient les applications sous la forme d’unités légères, portables et autonomes pouvant s’exécuter dans différents environnements. Par exemple, générez et testez localement un conteneur, puis chargez l’image conteneur dans un registre dans Azure ou ailleurs. Le modèle de déploiement de conteneur permet de s’assurer que l’environnement d’exécution de votre application est toujours correctement installé et configuré, où que votre application soit hébergée. Les tâches basées sur le conteneur dans Batch peuvent également tirer parti des fonctionnalités des tâches non basées sur le conteneur, notamment les packages d’applications et la gestion des fichiers de ressources et des fichiers de sortie.

Conditions préalables requises

Vous devez être familiarisé avec les concepts de conteneur et savoir comment créer un pool et une tâche Batch.

  • Versions des SDK : les SDK Batch prennent en charge les images de conteneur à partir des versions suivantes :

    • API REST (version : 6.0 du 01/09/2017)
    • Kit de développement logiciel Batch .NET SDK (version 8.0.0)
    • Kit de développement logiciel Batch Python (version 4.0)
    • Kit de développement logiciel Batch Java (version 3.0)
    • Kit de développement logiciel Batch Node.js (version 3.0)
  • Comptes : dans votre abonnement Azure, vous devez créer un compte Batch et, éventuellement, un compte de stockage Azure.

  • Une image de machine virtuelle prise en charge : les conteneurs sont uniquement pris en charge dans les pools créés avec la configuration de machine virtuelle, à partir d’une image prise en charge (figurant dans la section suivante). Si vous fournissez une image personnalisée, consultez les considérations présentées dans la section suivante et la configuration requise dans Utiliser une image managée pour créer un pool d’images personnalisées.

Note

À partir des versions du Kit de développement logiciel (SDK) Batch :

  • Kit de développement logiciel (SDK) Batch .NET (version 16.0.0)
  • Kit de développement logiciel (SDK) Batch Python (version 14.0.0)
  • Kit de développement logiciel (SDK) Batch Java (version 11.0.0)
  • Kit de développement logiciel (SDK) Batch Node.js (version 11.0.0)

Actuellement, containerConfiguration nécessite la transmission de la propriété Type et les valeurs prises en charge sont : ContainerType.DockerCompatible et ContainerType.CriCompatible.

Gardez à l’esprit les limitations suivantes :

  • Batch fournit une prise en charge de l’accès direct à la mémoire à distance (RDMA) uniquement pour les conteneurs qui s’exécutent sur des pools Linux.
  • Pour les charges de travail de conteneur Windows, vous devriez choisir une taille de machine virtuelle multicœur pour votre pool.

Important

Par défaut, Docker crée un pont réseau avec une spécification de sous-réseau de 172.17.0.0/16. Si vous spécifiez un réseau virtuel pour votre pool, vérifiez qu'il n'existe aucune plage d'adresses IP en conflit.

Images de machine virtuelle prises en charge

Utilisez une des images Windows ou Linux prises en charge suivantes afin de créer un pool de nœuds de calcul de machines virtuelles pour les charges de travail du conteneur. Pour plus d’informations sur les images de Place de marché qui sont compatibles avec Batch, consultez la liste des images de machine virtuelle.

Prise en charge de Windows

Batch prend en charge les images Windows Server qui ont des désignations de prise en charge des conteneurs. L'API permettant de lister toutes les images prises en charge dans Batch indique une fonctionnalité DockerCompatible si l'image prend en charge les conteneurs Docker. Batch permet, mais ne prend pas directement en charge, les images publiées par Mirantis dont la capacité est indiquée par DockerCompatible. Ces images ne peuvent être déployées que dans un compte Batch configuré avec le mode d’allocation de pool Abonnement utilisateur.

Vous pouvez également créer une image personnalisée pour activer la fonctionnalité conteneur sur Windows.

Note

Les références SKU -with-containers ou -with-containers-smalldisk de l’image sont supprimées. Consultez l'annonce pour obtenir des informations et d'autres options du runtime de conteneur.

Prise en charge de Linux

Pour les charges de travail de conteneur Linux, Batch prend en charge les images Linux suivantes publiées dans la Place de marché Azure, sans que vous ayez besoin d'une image personnalisée.

  • Éditeur : microsoft-dsvm
    • Offre : ubuntu-hpc
  • Éditeur : almalinux
    • Offre : 8-hpc-gen1
    • Offre : 8-hpc-gen2

Autres options d'image

Il existe actuellement d'autres images publiées par microsoft-azure-batch qui prennent en charge les charges de travail conteneurisées :

  • Éditeur : microsoft-azure-batch
    • Offre : ubuntu-server-container
    • Offre : ubuntu-server-container-rdma (Réservé exclusivement aux SKU de machine virtuelle avec Infiniband)

Avertissement

Il est recommandé d’utiliser des images autres que celles publiées par microsoft-azure-batch, car elles sont déconseillées en raison de la fin de vie imminente de l’image.

Remarques

La racine de données Docker des images ci-dessus se trouve à différents emplacements :

  • Pour l'image HPC, ou microsoft-dsvm (Offre : ubuntu-hpc, etc.), la racine des données Docker est inchangée par rapport à la valeur par défaut de Docker, qui est /var/lib/docker sous Linux et C:\ProgramData\Docker sous Windows. Ces dossiers se trouvent sur le disque du système d'exploitation.

Pour les images non-Batch publiées, le disque du système d'exploitation présente le risque potentiel d'être rapidement rempli au fur et à mesure que les images conteneur sont téléchargées.

Solutions potentielles pour les clients

Modifiez la racine de données Docker dans une tâche de démarrage lors de la création d’un pool dans BatchExplorer. Voici un exemple de la commande Démarrer la tâche :

1)  sudo systemctl stop docker
2)  sudo vi /lib/systemd/system/docker.service
    +++
    FROM:
    ExecStart=/usr/bin/docker daemon -H fd://
    TO:
    ExecStart=/usr/bin/docker daemon -g /new/path/docker -H fd://
    +++
3)  sudo systemctl daemon-reload
4)  sudo systemctl start docker

Ces images sont uniquement prises en charge dans le cadre d’une utilisation avec les pools Azure Batch et sont adaptées à une exécution dans le conteneur Docker. Elles offrent :

  • Un runtime de conteneur Moby compatible avec Docker préinstallé.
  • Des pilotes GPU NVIDIA et un runtime de conteneur NVIDIA préinstallés pour simplifier le déploiement sur les machines virtuelles Azure N-series.
  • Les images de machine virtuelle avec le suffixe -rdma sont préconfigurées avec prise en charge des tailles de machine virtuelle InfiniBand RDMA. Ces images de machine virtuelle ne doivent pas être utilisées avec les tailles de machine virtuelle qui ne prennent pas en charge InfiniBand.

Vous pouvez également créer des images personnalisées compatibles pour les conteneurs Batch sur l'une des distributions Linux compatibles avec Batch. Pour la prise en charge de Docker sur une image personnalisée, installez un runtime compatible avec Docker, comme une version de Docker ou Mirantis Container Runtime. L'installation d'un outil compatible avec Docker-CLI ne suffit pas ; un runtime compatible avec le moteur Docker est alors requis.

Important

Ni Microsoft ni Azure Batch ne prennent en charge les problèmes liés à Docker (quelle que soit la version ou l'édition), Mirantis Container Runtime ou Moby. Les clients qui choisissent d'utiliser ces runtimes dans leurs images doivent s'adresser à l'entreprise ou à l'entité qui fournit une prise en charge des problèmes liés aux runtimes.

Autres considérations relatives à l'utilisation d'une image Linux personnalisée :

  • Pour tirer parti des performances du GPU de tailles Azure N-series lors de l’utilisation d’une image personnalisée, préinstallez des pilotes NVIDIA. En outre, vous devez installer l’utilitaire moteur Docker pour GPU NVIDIA, NVIDIA Docker.
  • Pour accéder au réseau RDMA d’Azure, utilisez une taille de machine virtuelle compatible RDMA. Les pilotes RDMA nécessaires sont installés dans les images CentOS HPC et Ubuntu prises en charge par Batch. une configuration supplémentaire peut être nécessaire pour exécuter des charges de travail MPI. Consultez Utiliser des instances RDMA ou GPU dans un pool Batch.

Configuration du conteneur pour le pool de Batch

Pour permettre à un pool Batch d’exécuter des charges de travail de conteneur, vous devez spécifier les paramètres BatchVmContainerConfiguration dans l’objet BatchVmConfiguration du pool. Cet article fournit des liens vers la référence sur l’API .NET Batch. Les paramètres correspondants sont dans l’API Python Batch.

Vous pouvez créer un pool compatible avec les conteneurs, avec ou sans images de conteneur préchargées, comme indiqué dans les exemples suivants. Le processus d’extraction (ou prérécupération) vous permet de précharger les images conteneur à partir de Docker Hub ou d’un autre registre de conteneurs sur Internet. Pour des performances optimales, utilisez Azure Container Registry dans la même région que le compte Batch.

L’avantage de la prérécupération d’images conteneur est que, lors de la première exécution des tâches, ces dernières ne doivent pas attendre que l’image conteneur soit téléchargée. La configuration du conteneur télécharge les images de conteneur sur les machines virtuelles lors de la création du pool. Les tâches exécutées sur le pool peuvent ensuite faire référence à la liste des images de conteneur et aux options d’exécution des conteneurs.

Note

Docker Hub limite le nombre d’extractions d’images. Vérifiez que votre charge de travail ne dépasse pas les limites de débit publiées pour les images Docker Hub. Il est recommandé d’utiliser Azure Container Registry directement ou de tirer parti du cache d’artefacts dans ACR.

Pool sans images conteneur prérécupérées

Pour configurer un pool pour conteneurs sans images conteneur prérécupérées, définissez des objets ContainerConfiguration et VirtualMachineConfiguration, comme indiqué dans les exemples suivants. Ces exemples utilisent l’image Ubuntu Server pour les pools de conteneurs Azure Batch disponible sur la Place de marché.

Remarque : La version du serveur Ubuntu utilisée dans l’exemple est fournie à titre d’illustration. Vous pouvez remplacer node_agent_sku_id par la version que vous utilisez.

image_ref_to_use = models.BatchVmImageReference(
    publisher='microsoft-dsvm',
    offer='ubuntu-hpc',
    sku='2204',
    version='latest')

"""
Specify container configuration. This is required even though there are no prefetched images.
"""

container_conf = models.BatchContainerConfiguration(type='dockerCompatible')

new_pool = models.BatchPoolCreateOptions(
    id=pool_id,
    virtual_machine_configuration=models.VirtualMachineConfiguration(
        image_reference=image_ref_to_use,
        container_configuration=container_conf,
        node_agent_sku_id='batch.node.ubuntu 22.04'),
    vm_size='STANDARD_D2S_V3',
    target_dedicated_nodes=1)
...
BatchImageReference imageReference = new BatchImageReference()
{
    Publisher = "microsoft-dsvm",
    Offer = "ubuntu-hpc",
    Sku = "2204",
    Version = "latest"
};

// Specify container configuration. This is required even though there are no prefetched images.
BatchVmContainerConfiguration containerConfig = new BatchVmContainerConfiguration("dockerCompatible");

// VM configuration
BatchVmConfiguration vmConfiguration = new BatchVmConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 22.04")
{
    ContainerConfiguration = containerConfig
};

BatchAccountPoolData poolData = new BatchAccountPoolData()
{
    VmSize = "STANDARD_D2S_V3",
    DeploymentConfiguration = new BatchDeploymentConfiguration() { VmConfiguration = vmConfiguration },
    ScaleSettings = new BatchAccountPoolScaleSettings()
    {
        FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = 1 }
    }
};

await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, poolId, poolData);

Précharger des images pour la configuration du conteneur

Pour précharger des images de conteneur sur le pool, ajoutez la liste des images de conteneur (container_image_names en Python) au ContainerConfiguration.

L’exemple de base Python suivant montre comment prérécupérer une image conteneur Ubuntu standard à partir du Hub Docker.

image_ref_to_use = models.BatchVmImageReference(
    publisher='microsoft-dsvm',
    offer='ubuntu-hpc',
    sku='2204',
    version='latest')

"""
Specify container configuration, fetching the official Ubuntu container image from Docker Hub.
"""

container_conf = models.BatchContainerConfiguration(
    type='dockerCompatible',
    container_image_names=['ubuntu'])

new_pool = models.BatchPoolCreateOptions(
    id=pool_id,
    virtual_machine_configuration=models.VirtualMachineConfiguration(
        image_reference=image_ref_to_use,
        container_configuration=container_conf,
        node_agent_sku_id='batch.node.ubuntu 22.04'),
    vm_size='STANDARD_D2S_V3',
    target_dedicated_nodes=1)
...

L’exemple C# suivant suppose que vous souhaitez prérécupérer une image TensorFlow sur le Hub Docker. Cet exemple inclut une tâche de démarrage qui s’exécute dans l’hôte de la machine virtuelle sur les nœuds du pool. Vous pouvez lancer une tâche de démarrage dans l’hôte, par exemple, pour monter un serveur de fichiers accessible à partir des conteneurs.

BatchImageReference imageReference = new BatchImageReference()
{
    Publisher = "microsoft-dsvm",
    Offer = "ubuntu-hpc",
    Sku = "2204",
    Version = "latest"
};

BatchVmContainerRegistry containerRegistry = new BatchVmContainerRegistry()
{
    RegistryServer = "https://hub.docker.com",
    IdentityResourceId = new ResourceIdentifier("/subscriptions/SUB/resourceGroups/RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name")
};

// Specify container configuration, prefetching Docker images
BatchVmContainerConfiguration containerConfig = new BatchVmContainerConfiguration("dockerCompatible")
{
    ContainerImageNames = { "tensorflow/tensorflow:latest-gpu" },
    ContainerRegistries = { containerRegistry }
};

// VM configuration
BatchVmConfiguration vmConfiguration = new BatchVmConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 22.04")
{
    ContainerConfiguration = containerConfig
};

// Set a native host command line start task
BatchAccountPoolStartTask startTaskContainer = new BatchAccountPoolStartTask()
{
    CommandLine = "<native-host-command-line>"
};

BatchAccountPoolData poolData = new BatchAccountPoolData()
{
    VmSize = "Standard_NC6S_V3",
    DeploymentConfiguration = new BatchDeploymentConfiguration() { VmConfiguration = vmConfiguration },
    StartTask = startTaskContainer
};

await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, poolId, poolData);

Préextraire des images depuis un registre de conteneurs privé

Vous pouvez également prérécupérer des images conteneur en vous authentifiant sur un serveur de registres de conteneurs privé. Dans les exemples suivants, les objets ContainerConfiguration et VirtualMachineConfiguration prérécupèrent une image privée TensorFlow à partir d’un Azure Container Registry privé. La référence d’image est la même que dans l’exemple précédent.

image_ref_to_use = models.BatchVmImageReference(
    publisher='microsoft-dsvm',
    offer='ubuntu-hpc',
    sku='2204',
    version='latest')

# Specify a container registry
subscription_id = "yyyy-yyy-yyy-yyy-yyy"
resource_group_name = "TestRG"
user_assigned_identity_name = "testUMI"
resource_id = f"/subscriptions/{subscription_id}/resourceGroups/{resource_group_name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{user_assigned_identity_name}"

container_registry = models.ContainerRegistryReference(
        registry_server="myRegistry.azurecr.io",
        identity_reference=models.BatchNodeIdentityReference(resource_id=resource_id))

# Create container configuration, prefetching Docker images from the container registry
container_conf = models.BatchContainerConfiguration(
        type='dockerCompatible',
        container_image_names=["myRegistry.azurecr.io/samples/myImage"],
        container_registries=[container_registry])

new_pool = models.BatchPoolCreateOptions(
            id="myPool",
            virtual_machine_configuration=models.VirtualMachineConfiguration(
                image_reference=image_ref_to_use,
                container_configuration=container_conf,
                node_agent_sku_id='batch.node.ubuntu 22.04'),
            vm_size='STANDARD_D2S_V3',
            target_dedicated_nodes=1)
// Specify a container registry
BatchVmContainerRegistry containerRegistry = new BatchVmContainerRegistry()
{
    RegistryServer = "myContainerRegistry.azurecr.io",
    IdentityResourceId = new ResourceIdentifier("/subscriptions/SUB/resourceGroups/RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name")
};

// Create container configuration, prefetching Docker images from the container registry
BatchVmContainerConfiguration containerConfig = new BatchVmContainerConfiguration("dockerCompatible")
{
    ContainerImageNames = { "myContainerRegistry.azurecr.io/tensorflow/tensorflow:latest-gpu" },
    ContainerRegistries = { containerRegistry }
};

// VM configuration
BatchVmConfiguration vmConfiguration = new BatchVmConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 22.04")
{
    ContainerConfiguration = containerConfig
};

BatchAccountPoolData poolData = new BatchAccountPoolData()
{
    VmSize = "Standard_NC6S_V3",
    DeploymentConfiguration = new BatchDeploymentConfiguration() { VmConfiguration = vmConfiguration },
    ScaleSettings = new BatchAccountPoolScaleSettings()
    {
        FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = 2 }
    }
};

await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, poolId, poolData);

Prise en charge des identités managées pour ACR

Lors de l’accès aux conteneurs stockés dans Azure Container Registry, vous pouvez utiliser une identité managée pour vous authentifier auprès du service. Pour utiliser une identité managée, assurez-vous d’abord que l’identité a été attribuée au pool et que l’identité a le rôle AcrPull attribué pour le registre de conteneurs auquel vous souhaitez accéder. Ensuite, indiquez à Batch l'identité à utiliser lors de l'authentification avec ACR.

BatchVmContainerRegistry containerRegistry = new BatchVmContainerRegistry()
{
    RegistryServer = "myContainerRegistry.azurecr.io",
    IdentityResourceId = new ResourceIdentifier("/subscriptions/SUB/resourceGroups/RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name")
};

Paramètres de conteneur pour la tâche

Pour exécuter une tâche de conteneur sur un pool prenant en charge les conteneurs, spécifiez des paramètres propres aux conteneurs. Il s’agit notamment de l’image à utiliser, du registre et des options d’exécution des conteneurs.

  • Utilisez la propriété ContainerSettings des classes de tâches pour configurer les paramètres spécifiques au conteneur. Ces paramètres sont définis par la classe BatchTaskContainerSettings . L'option --rm conteneur n'a pas besoin d'une autre option --runtime puisqu'elle est prise en charge par Batch.

  • Si vous exécutez des tâches sur des images conteneur, la tâche BatchTask et le gestionnaire de travaux nécessitent des paramètres de conteneur. Toutefois, la tâche de démarrage, la tâche de préparation du travail et la tâche de mise en production des travaux ne nécessitent pas de paramètres de conteneur (autrement dit, ils peuvent s’exécuter dans un contexte de conteneur ou directement sur le nœud).

  • Pour Linux, Batch mappe l’autorisation utilisateur/groupe au conteneur. Si l’accès à un dossier au sein du conteneur nécessite une autorisation d’administrateur, vous devrez peut-être exécuter la tâche en tant qu’étendue de pool avec le niveau d’élévation administrateur. Cela garantit que Batch exécute la tâche en tant qu’utilisateur root dans le conteneur. Dans le cas contraire, un utilisateur non administrateur n’aura peut-être pas accès à ces dossiers.

  • Pour les pools de conteneurs avec un matériel compatible GPU, Batch active automatiquement le GPU pour les tâches de conteneur. Vous ne devez donc pas inclure l’argument –gpus.

Ligne de commande de la tâche du conteneur

Quand vous exécutez une tâche de conteneur, Batch utilise automatiquement la commande docker create pour créer un conteneur à l’aide de l’image spécifiée dans la tâche. Batch contrôle ensuite l’exécution de la tâche dans le conteneur.

Comme pour les tâches Batch sans conteneur, vous définissez une ligne de commande pour une tâche conteneur. Batch crée automatiquement le conteneur, la ligne de commande spécifie donc uniquement la ou les commandes à exécuter dans le conteneur.

Voici les comportements par défaut que Batch applique aux tâches de conteneur Docker :

Veillez à consulter la documentation Docker entre ENTRYPOINT et CMD afin de comprendre les effets d’interaction qui peuvent survenir lorsque les images conteneur ont un ENTRYPOINT spécifié et que vous spécifiez également une ligne de commande de tâche.

Si vous souhaitez remplacer l’image conteneur ENTRYPOINT, vous pouvez spécifier l’argument --entrypoint <args> en tant que containerRunOption. Reportez-vous aux options ContainerRunOptions facultatives pour connaître les arguments que vous pouvez fournir à la commande docker create que Batch utilise pour créer et exécuter le conteneur. Par exemple, afin de définir un répertoire de travail pour le conteneur, définissez l’option --workdir <directory>.

Voici quelques exemples d’options d’image de conteneur, d’options de conteneurs Batch ou de lignes de commande de tâche, ainsi que leur effet :

  • L’image conteneur ENTRYPOINT n’est pas spécifiée et la ligne de commande de tâche Batch est « /bin/sh -c python myscript.py ».
    • Batch crée le conteneur avec la ligne de commande de tâche Batch comme spécifié et l’exécute dans le répertoire de travail de tâche Batch. Cela peut entraîner un échec si « myscript.py » ne se trouve pas dans le répertoire de travail de la tâche Batch.
    • Si la ligne de commande de tâche a été spécifiée comme « /bin/sh -c python /path/to/script/myscript.py », cette tâche peut fonctionner même avec le répertoire de travail défini comme répertoire de travail de tâche Batch si toutes les dépendances du script sont satisfaites.
  • Le point d’entrée (ENTRYPOINT) de l’image de conteneur est défini sur « ./myscript.sh » et la ligne de commande de la tâche Batch est vide.
    • Batch crée le conteneur en se basant sur l’ENTRYPOINT et l’exécute dans le répertoire de travail de la tâche Batch. Cette tâche peut entraîner un échec si le répertoire de travail WORKDIR de l’image conteneur n’est pas identique au répertoire de travail de tâche Batch, qui dépend de différents facteurs tels que le système d’exploitation, l’ID de travail, l’ID de tâche, etc.
    • Si « --workdir /path/to/script » a été spécifié en tant que containerRunOption, cette tâche peut fonctionner si toutes les dépendances du script sont satisfaites.
  • Le point d’entrée ENTRYPOINT de l’image de conteneur n’est pas spécifié, la ligne de commande de la tâche Batch est « ./myscript.sh » et WORKDIR est redéfini dans ContainerRunOptions avec « --workdir /path/to/script ».
    • Batch crée le conteneur avec le répertoire de travail « /path/to/script » et exécute la ligne de commande « ./myscript.sh », qui réussit à mesure que le script se trouve dans le répertoire de travail spécifié.

Répertoire de travail de la tâche de conteneur

Une tâche de conteneur Batch s'exécute dans un répertoire de travail du conteneur similaire au répertoire configuré par Batch pour une tâche normale (non-conteneur). Ce répertoire de travail n'est pas WORKDIR s'il est configuré dans l'image, encore moins le répertoire de travail du conteneur par défaut (C:\ sur un conteneur Windows ou / sur un conteneur Linux).

Pour une tâche Batch dans un conteneur :

  • Tous les répertoires sous AZ_BATCH_NODE_ROOT_DIR sur le nœud hôte (la racine des répertoires Azure Batch) sont mappés de façon récursive dans le conteneur.
  • Toutes les variables d’environnement de la tâche sont mappées dans le conteneur.
  • Le répertoire de travail de tâche AZ_BATCH_TASK_WORKING_DIR sur le nœud est défini de la même façon que pour une tâche normale et mappé dans le conteneur.

Important

Pour les pools de conteneurs Windows sur les familles de machines virtuelles avec des disques éphémères, l'intégralité du disque éphémère est mappée dans l'espace du conteneur en raison des limitations des conteneurs Windows.

Ces mappages vous permettent d’utiliser les tâches de conteneur quasiment comme des tâches non-conteneur. Par exemple, vous pouvez installer des applications à l’aide de packages d’application, accéder aux fichiers de ressources du Stockage Azure, utiliser les paramètres d’environnement de tâche et conserver les fichiers de sortie de tâche une fois le conteneur arrêté.

Quelle que soit la façon dont WORKDIR est défini pour une image conteneur, stdout.txt et stderr.txt sont tous les deux capturés dans le AZ_BATCH_TASK_DIR.

Résoudre les problèmes des tâches de conteneur

Si votre tâche de conteneur ne s’exécute pas comme prévu, vous pouvez avoir besoin d’obtenir des informations sur la configuration de WORKDIR ou d’ENTRYPOINT pour l’image conteneur. Pour voir la configuration, exécutez la commande docker image inspect.

Si nécessaire, ajustez les paramètres de la tâche de conteneur en fonction de l’image :

  • Spécifiez un chemin absolu dans la ligne de commande de tâche. Si la valeur par défaut ENTRYPOINT de l’image est utilisée pour la ligne de commande de tâche, vérifiez qu’un chemin absolu est défini.
  • Dans les options d’exécution du conteneur de la tâche, changez le répertoire de travail pour qu’il corresponde à WORKDIR dans l’image. Par exemple, définissez --workdir /app.

Exemples de tâches de conteneur

L’extrait de code Python suivant montre une ligne de commande de base exécutée dans un conteneur créé à partir d’une image fictive tirée du Hub Docker. Ici, l’option de conteneur --rm supprime le conteneur une fois la tâche terminée et l’option --workdir définit un répertoire de travail. La ligne de commande remplace la valeur ENTRYPOINT du conteneur par une commande shell simple qui écrit un petit fichier dans le répertoire de travail de la tâche sur l’hôte.

task_id = 'sampletask'
task_container_settings = models.BatchTaskContainerSettings(
    image_name='myimage',
    container_run_options='--rm --workdir /')
task = models.BatchTaskCreateOptions(
    id=task_id,
    command_line='/bin/sh -c \"echo \'hello world\' > $AZ_BATCH_TASK_WORKING_DIR/output.txt\"',
    container_settings=task_container_settings
)

L’exemple C# suivant montre les paramètres de conteneur de base d’une tâche de cloud :

// Simple container task command
string cmdLine = @"c:\app\myApp.exe";

Azure.Compute.Batch.BatchTaskContainerSettings cmdContainerSettings = new Azure.Compute.Batch.BatchTaskContainerSettings("myimage")
{
    ContainerRunOptions = @"--rm --workdir c:\app"
};

BatchTaskCreateOptions containerTask = new BatchTaskCreateOptions(
    id: "Task1",
    commandLine: cmdLine)
{
    ContainerSettings = cmdContainerSettings
};

Étapes suivantes