Partager via


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 du SDK : le SDK prend en charge des images conteneur dans les 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.

Notes

À 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 autorise, mais ne prend pas directement en charge les images publiées par Mirantis avec la fonctionnalité notée DockerCompatible. Ces images peuvent uniquement être déployées sous un compte Batch en mode d'allocation de pool d'abonnements utilisateur.

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

Remarque

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 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 de conteneurs :

  • Éditeur : microsoft-azure-batch
    • Offre : ubuntu-server-container
    • Offre : ubuntu-server-container-rdma (Pour une utilisation exclusive sur des références 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.

Notes

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 Azure, utilisez une taille de machine virtuelle prenant en charge 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 Batch

Pour permettre à un pool Batch d’exécuter des charges de travail sur le conteneur, vous devez spécifier les paramètres ContainerConfiguration dans l’objet VirtualMachineConfiguration 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 pour conteneurs avec ou sans images conteneur prérécupéré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 de meilleures performances, utilisez un Registre de conteneurs Azure 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 extrait des images conteneur vers les machines virtuelles une fois le pool créé. Les tâches exécutées sur le pool peuvent ensuite référencer la liste des images et des options d’exécution du conteneur.

Remarque

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 le serveur Ubuntu pour l’image de pools de conteneur Azure Batch dans 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 = batch.models.ImageReference(
    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 = batch.models.ContainerConfiguration()

new_pool = batch.models.PoolAddParameter(
    id=pool_id,
    virtual_machine_configuration=batch.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)
...
ImageReference imageReference = new ImageReference(
    publisher: "microsoft-dsvm",
    offer: "ubuntu-hpc",
    sku: "2204",
    version: "latest");

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

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 22.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 1,
    virtualMachineSize: "STANDARD_D2S_V3",
    virtualMachineConfiguration: virtualMachineConfiguration);

Prérécupérer des images pour la configuration du conteneur

Pour prérécupérer des images conteneur sur le pool, ajoutez la liste d’images conteneur (container_image_names dans Python) à 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 = batch.models.ImageReference(
    publisher='microsoft-dsvm',
    offer='ubuntu-hpc',
    sku='2204',
    version='latest')

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

container_conf = batch.models.ContainerConfiguration(
    container_image_names=['ubuntu'])

new_pool = batch.models.PoolAddParameter(
    id=pool_id,
    virtual_machine_configuration=batch.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.

ImageReference imageReference = new ImageReference(
    publisher: "microsoft-dsvm",
    offer: "ubuntu-hpc",
    sku: "2204",
    version: "latest");

ContainerRegistry containerRegistry = new ContainerRegistry(
    registryServer: "https://hub.docker.com",
    identityReference: new ComputeNodeIdentityReference() { ResourceId = "/subscriptions/SUB/resourceGroups/RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name" }
);

// Specify container configuration, prefetching Docker images
ContainerConfiguration containerConfig = new ContainerConfiguration();
containerConfig.ContainerImageNames = new List<string> { "tensorflow/tensorflow:latest-gpu" };
containerConfig.ContainerRegistries = new List<ContainerRegistry> { containerRegistry };

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 22.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Set a native host command line start task
StartTask startTaskContainer = new StartTask( commandLine: "<native-host-command-line>" );

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    virtualMachineSize: "Standard_NC6S_V3",
    virtualMachineConfiguration: virtualMachineConfiguration);

// Start the task in the pool
pool.StartTask = startTaskContainer;
...

Prérécupérer des images à partir d’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 TensorFlow privée dans un registre de conteneurs Azure privé. La référence d’image est la même que dans l’exemple précédent.

image_ref_to_use = batch.models.ImageReference(
    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 = batch.models.ContainerRegistry(
        registry_server="myRegistry.azurecr.io",
        identity_reference = ComputeNodeIdentityReference(resource_id = resource_id))

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

new_pool = batch.models.PoolAddParameter(
            id="myPool",
            virtual_machine_configuration=batch.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
ContainerRegistry containerRegistry = new ContainerRegistry(
    registryServer: "myContainerRegistry.azurecr.io",
    identityReference: new ComputeNodeIdentityReference() { ResourceId = "/subscriptions/SUB/resourceGroups/RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name" }
);

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

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 22.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 2,
    virtualMachineSize: "Standard_NC6S_V3",
    virtualMachineConfiguration: virtualMachineConfiguration);
...

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.

ContainerRegistry containerRegistry = new ContainerRegistry(
    registryServer: "myContainerRegistry.azurecr.io",
    identityReference: new ComputeNodeIdentityReference() { ResourceId = "/subscriptions/SUB/resourceGroups/RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name" }
);

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

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 22.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 2,
    virtualMachineSize: "Standard_NC6S_V3",
    virtualMachineConfiguration: virtualMachineConfiguration);
...

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 TaskContainerSettings. 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 de cloud et la tâche du 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 validation du travail ne nécessitent pas de paramètres de conteneur (autrement dit, elles 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 permet de s’assurer que Batch exécute la tâche en tant que racine dans le contexte du 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 de 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 autres tâches Batch, vous définissez une ligne de commande pour une tâche de 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’images conteneur et de conteneur Batch ou de lignes de commande de tâche et de 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 conteneur est spécifié en tant que « ./myscript.sh », et la ligne de commande de tâche Batch est vide.
    • Batch crée le conteneur en s’appuyant sur le point d’entrée ENTRYPOINT et l’exécute dans le répertoire de travail de 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 conteneur n’est pas spécifié, la ligne de commande de tâche Batch est « ./myscript.sh » et WORKDIR est substitué dans ContainerRunOptions en tant que « --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 de conteneur Batch :

  • 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âche 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 = batch.models.TaskContainerSettings(
    image_name='myimage',
    container_run_options='--rm --workdir /')
task = batch.models.TaskAddParameter(
    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";

TaskContainerSettings cmdContainerSettings = new TaskContainerSettings (
    imageName: "myimage",
    containerRunOptions: "--rm --workdir c:\\app"
    );

CloudTask containerTask = new CloudTask (
    id: "Task1",
    commandline: cmdLine);
containerTask.ContainerSettings = cmdContainerSettings;

Étapes suivantes