Condividi tramite


Usare Azure Batch per eseguire carichi di lavoro dei contenitori

Azure Batch consente di eseguire e ridimensionare numerosi processi di batch computing in Azure. Le attività di Batch possono essere eseguite direttamente sulle macchine virtuali (nodi) in un pool di Batch, ma è anche possibile configurare un pool di Batch che esegua le attività in contenitori compatibili con Docker nei nodi. Questo articolo illustra come creare un pool di nodi di calcolo che supporti l'esecuzione di attività del contenitore e quindi eseguire le attività del contenitore nel pool.

Gli esempi di codice contenuti qui usano SDK di .NET e Python per Batch. È anche possibile usare altri SDK per Batch e strumenti, incluso il portale di Azure, per creare pool di Batch abilitati per il contenitore ed eseguire le attività del contenitore.

Perché usare i contenitori

I contenitori consentono di eseguire le attività Batch in modo semplice senza dover gestire un ambiente e le dipendenze per eseguire le applicazioni. I contenitori distribuiscono le applicazioni come unità leggere, portatili e autosufficienti che possono essere eseguite in più ambienti diversi. Ad esempio, è possibile compilare e testare in locale un contenitore, quindi caricare l'immagine del contenitore in un registro di Azure o altrove. Il modello di distribuzione del contenitore assicura che l'ambiente di runtime dell'applicazione venga sempre installato e configurato correttamente, ovunque si ospiti l'applicazione. Le attività basate sul contenitore in Batch traggono vantaggio anche dalle funzionalità di attività non del contenitore, inclusi i pacchetti dell'applicazione e la gestione dei file di risorse e di output.

Prerequisiti

È consigliabile avere familiarità con i concetti relativi ai contenitori e alla creazione di un pool e un processo di Batch.

  • Versioni di SDK: gli SDK di Batch supportano le immagini del contenitore nelle versioni seguenti:

    • API REST di Batch, versione: 2017-09-01.6.0
    • .NET SDK di Batch, versione 8.0.0
    • Python SDK di Batch, versione 4.0
    • Java SDK di Batch, versione 3.0
    • Node.js SDK di Batch, versione 3.0
  • Account: nell'abbonamento di Azure è necessario creare un account Batch e, facoltativamente, un account di Archiviazione di Azure.

  • Un'immagine di macchina virtuale supportata: i contenitori sono supportati solo nei pool creati con la Configurazione macchina virtuale da un'immagine supportata (elencata nella sezione successiva). Se si fornisce un'immagine personalizzata, vedere le considerazioni nella sezione seguente e i requisiti in Usare un'immagine gestita per creare un pool di immagini personalizzato.

Nota

Dalle versioni di Batch SDK:

  • .NET SDK di Batch, versione 16.0.0
  • Python SDK di Batch, versione 14.0.0
  • Java SDK di Batch, versione 11.0.0
  • Node.js SDK di Batch, versione 11.0.0

Attualmente, containerConfiguration richiede che la proprietà Type venga passata e i valori supportati sono: ContainerType.DockerCompatible e ContainerType.CriCompatible.

Considerare le seguenti limitazioni:

  • Batch fornisce supporto di accesso diretto alla memoria remota (RDMA) solo per i contenitori eseguiti nei pool Linux.
  • Per i carichi di lavoro di contenitori Windows, è consigliabile scegliere una dimensione di macchina virtuale multicore per il pool.

Importante

Per impostazione predefinita, Docker crea un bridge di rete con una specifica di subnet di 172.17.0.0/16. Se si specifica una rete virtuale per il pool, assicurarsi che non siano presenti intervalli IP in conflitto.

Immagini delle VM supportate

Per creare un pool di nodi di calcolo della macchina virtuale per i carichi di lavoro del contenitore, usare una delle immagini di Windows o Linux supportate seguenti. Per altre informazioni sulle immagini del Marketplace compatibili con Batch, vedere Elenco di immagini di macchine virtuali.

Supporto Windows

Batch supporta le immagini di Windows Server con designazioni del supporto per i contenitori. L'API per elencare tutte le immagini supportate in Batch indica una funzionalità di DockerCompatible se l'immagine supporta i contenitori Docker. Batch consente la presenza di, ma non supporta direttamente, le immagini pubblicate da Mirantis con funzionalità annotate come DockerCompatible. Queste immagini possono essere distribuite in un account Batch solo in modalità di allocazione pool di sottoscrizioni utente.

È anche possibile creare un'immagine personalizzata per abilitare la funzionalità del contenitore in Windows.

Nota

Gli SKU di immagine -with-containers o -with-containers-smalldisk sono stati ritirati. Vedere l'annuncio per informazioni dettagliate e opzioni di runtime del contenitore alternative.

Supporto di Linux

Per i carichi di lavoro di contenitori Linux, Batch supporta attualmente le immagini Linux seguenti pubblicate in Azure Marketplace senza la necessità di un'immagine personalizzata.

  • Server di pubblicazione: microsoft-dsvm
    • Offerta: ubuntu-hpc
  • Server di pubblicazione: almalinux
    • Offerta: 8-hpc-gen1
    • Offerta: 8-hpc-gen2

Opzioni di immagini alternative

Attualmente, sono disponibili altre immagini pubblicate da microsoft-azure-batch che supportano i carichi di lavoro dei contenitori:

  • Server di pubblicazione: microsoft-azure-batch
    • Offerta: ubuntu-server-container
    • Offerta: ubuntu-server-container-rdma (per uso esclusivo in SKU di macchine virtuali con Infiniband)

Avviso

È consigliabile usare immagini diverse da quelle pubblicate da microsoft-azure-batch, poiché queste immagini sono deprecate a causa di fine del ciclo di vita imminente.

Note

La radice dei dati docker delle immagini illustrate sopra si trova in posizioni diverse:

  • Per l'immagine HPC o microsoft-dsvm (offerta: ubuntu-hpc etc.), la radice dei dati docker rimane invariata rispetto all'impostazione predefinita di Docker, ovvero /var/lib/docker in Linux e C:\ProgramData\Docker in Windows. Queste cartelle si trovano sul disco del sistema operativo.

Per le immagini non pubblicate in Batch, il disco del sistema operativo rischia di riempirsi rapidamente durante lo scaricamento di immagini del contenitore.

Potenziali soluzioni per i clienti

Modificare la radice dei dati docker in un'attività di avvio durante la creazione di un pool in BatchExplorer. Di seguito è riportato un esempio del comando Avvia attività:

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

Queste immagini sono supportate solo per l'uso nei pool di Azure Batch e sono rivolte all'esecuzione del contenitore Docker. Forniscono:

  • Runtime del contenitore Moby preinstallato compatibile con Docker
  • Driver GPU NVIDIA preinstallati e runtime di contenitore NVIDIA per semplificare la distribuzione nelle VM di Azure serie N
  • Le immagini delle macchine virtuali con il suffisso di -rdma sono preconfigurate con supporto per le dimensioni di macchine virtuali RDMA InfiniBand. Queste immagini di macchine virtuali non devono essere usate con dimensioni di macchina virtuale che non dispongono del supporto InfiniBand.

È anche possibile creare immagini personalizzate compatibili per contenitori Batch in una delle distribuzioni Linux compatibili con Batch. Per il supporto di Docker in un'immagine personalizzata, installare un runtime compatibile con Docker appropriato, ad esempio una versione di Docker o Mirantis Container Runtime. L'installazione di uno strumento compatibile con l'interfaccia della riga di comando Docker non è sufficiente; è necessario un runtime compatibile con il motore Docker.

Importante

Né Microsoft né Azure Batch forniranno supporto per problemi relativi a Docker (qualsiasi versione o edizione), Mirantis Container Runtime o runtime Moby. I clienti che scelgono di usare questi runtime nelle immagini devono contattare l'azienda o l'entità che fornisce supporto per problemi di runtime.

Altre considerazioni sull'uso di un'immagine Linux personalizzata:

  • Per sfruttare le prestazioni della GPU delle dimensioni serie N di Azure quando si usa un'immagine personalizzata, preinstallare i driver NVIDIA. È anche necessario installare Docker Engine Utility per le GPU NVIDIA, NVIDIA Docker.
  • Per accedere alla rete RDMA di Azure, usare una dimensione di VM idonea per RDMA. I driver RDMA necessari vengono installati nelle immagini CentOS HPC e Ubuntu supportate da Batch. Potrebbe essere necessaria una configurazione aggiuntiva per eseguire carichi di lavoro MPI. Vedere Usare istanze RDMA o GPU in pool di Batch.

Configurazione del contenitore per il pool di Batch

Per abilitare un pool Batch a eseguire carichi di lavoro del contenitore, è necessario specificare le impostazioni di ContainerConfiguration nell'oggetto VirtualMachineConfiguration del pool. Questo articolo contiene collegamenti alla documentazione di riferimento sull'API Batch .NET. Le impostazioni corrispondenti si trovano nell'API Batch Python.

È possibile creare un pool abilitato per il contenitore con o senza le immagini del contenitore prelette, come illustrato negli esempi seguenti. Il processo pull (o prelettura) consente di precaricare immagini del contenitore dall'hub Docker o da un altro registro contenitori su Internet. Per prestazioni ottimali, usare un Registro Azure Container nella stessa area dell'account Batch.

Il vantaggio della prelettura è che al primo avvio dell'esecuzione le attività non devono attendere il download delle immagini del contenitore. La configurazione del contenitore esegue il pull delle immagini del contenitore nelle macchine virtuali quando viene creato il pool. Le attività eseguite nel pool potranno quindi fare riferimento all'elenco delle immagini del contenitore e alle opzioni di esecuzione del contenitore.

Nota

Docker Hub limita il numero di pull di immagini. Assicurarsi che il carico di lavoro non superi i limiti di frequenza pubblicati per le immagini basate su Hub Docker. È consigliabile usare direttamente Registro Azure Container o sfruttare Cache degli artefatti in Registro Azure Container.

Pool senza immagini del contenitore prelette

Per configurare un pool abilitato per il contenitore senza immagini del contenitore prelette, definire gli oggetti ContainerConfiguration e VirtualMachineConfiguration come illustrato nell'esempio seguente. Questi esempi usano l'immagine Ubuntu Server per pool di contenitori di Azure Batch provenienti dal Marketplace.

Nota: la versione del server Ubuntu usata nell'esempio è esclusivamente a scopo illustrativo. È possibile modificare il node_agent_sku_id a seconda della versione in uso.

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);

Prelettura delle immagini per la configurazione del contenitore

Per eseguire la prelettura delle immagini del contenitore nel pool, aggiungere l'elenco di immagini del contenitore (container_image_names in Python) a ContainerConfiguration.

Il seguente esempio di base relativo a Python illustra come eseguire la prelettura di un'immagine del contenitore Ubuntu standard dall'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'esempio seguente relativo a C# presuppone che si voglia eseguire una prelettura di un'immagine TensorFlow dall'hub Docker. Questo esempio include un'attività di avvio che viene eseguita nell'host della VM sui nodi del pool. È possibile eseguire un'attività di avvio nell'host, ad esempio, per montare un file server accessibile dai contenitori.

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;
...

Prelettura delle immagini da un contenitori privato

È anche possibile eseguire la prelettura delle immagini del contenitore eseguendo l'autenticazione a un server del registro contenitori privato. Negli esempi seguenti, gli oggetti ContainerConfiguration e VirtualMachineConfiguration eleguono la prelettura di un'immagine TensorFlow privata da un registro contenitori di Azure privato. Il riferimento all'immagine è lo stesso dell'esempio precedente.

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);
...

Supporto delle identità gestite per Registro Azure Container

Quando si accede a contenitori archiviati in Registro Azure Container, è possibile usare un'identità gestita per l'autenticazione con il servizio. Per usare un'identità gestita, verificare prima di tutto che l'identità sia stata assegnata al pool e che le sia stato assegnato il ruolo AcrPull per il registro contenitori a cui si vuole accedere. Indicare quindi a Batch l'identità da usare per l'autenticazione con Registro Azure Container.

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);
...

Impostazioni del contenitore per l'attività

Per eseguire un'attività contenitore in un pool abilitato per il contenitore, specificare le impostazioni specifiche per il contenitore. Le impostazioni includono l'immagine da usare, il registro e le opzioni di esecuzione del contenitore.

  • Usare la proprietà ContainerSettings delle classi di attività per configurare le impostazioni specifiche del contenitore. Queste impostazioni vengono definite dalla classe TaskContainerSettings. L'opzione contenitore --rm non richiede un'altra opzione --runtime, perché viene gestita da Batch.

  • Se si eseguono attività sulle immagini del contenitore, l'attività cloud e l'attività di gestione dei processi richiedono le impostazioni del contenitore. Tuttavia, l'attività di avvio, l'attività di preparazione del processo e l'attività di rilascio del processo non richiedono impostazioni dei contenitori (vale a dire, possono essere eseguite in un contesto del contenitore o direttamente nel nodo).

  • Per Linux, Batch esegue il mapping dell'autorizzazione utente/gruppo al contenitore. Se l'accesso a qualsiasi cartella all'interno del contenitore richiede l'autorizzazione Amministratore, potrebbe essere necessario eseguire l'attività come ambito del pool con livello di elevazione Amministratore. In questo modo, Batch esegue l'attività come radice nel contesto del contenitore. In caso contrario, un utente non Amministratore potrebbe non avere accesso a tali cartelle.

  • Per i pool di contenitori con hardware abilitato per GPU, Batch abilita automaticamente la GPU per le attività del contenitore, quindi non è consigliabile includere l'argomento –gpus.

Riga di comando dell'attività contenitore

Quando si esegue un'attività contenitore, Batch usa automaticamente il comando docker create per creare un contenitore usando l'immagine specificata nell'attività. Batch controlla quindi l'esecuzione dell'attività nel contenitore.

Come per le attività di Batch non contenitore, è necessario impostare una riga di comando per un'attività contenitore. Poiché Batch crea automaticamente il contenitore, la riga di comando specifica solo il comando o i comandi eseguiti nel contenitore.

Di seguito sono riportati i comportamenti predefiniti applicati da Batch da rivedere alle attività di contenitore Docker:

Assicurarsi di esaminare la documentazione di Docker tra ENTRYPOINT e CMD in modo da comprendere gli effetti di interazione che possono verificarsi quando le immagini del contenitore hanno già un ENTRYPOINT specificato e viene specificata anche una riga di comando dell'attività.

Se si vuole eseguire l'override dell'immagine del contenitore ENTRYPOINT, è possibile specificare l'argomento --entrypoint <args> come containerRunOption. Vedere l'argomento facoltativo ContainerRunOptions per gli argomenti che è possibile fornire al comando docker create usato da Batch per creare ed eseguire il contenitore. Ad esempio, per impostare una directory di lavoro per il contenitore, impostare l'opzione --workdir <directory>.

Di seguito sono riportati alcuni esempi di opzioni di immagini di contenitore e di contenitori Batch o di righe di comando delle attività e i loro effetti:

  • L'immagine del contenitore ENTRYPOINT non è specificata e la riga di comando dell'attività batch è "/bin/sh -c python myscript.py".
    • Batch crea il contenitore con la riga di comando dell'attività Batch come specificato ed esegue il contenitore nella directory di lavoro dell'attività Batch. Questo può causare un errore se "myscript.py" non si trova nella directory di lavoro dell'attività Batch.
    • Se la riga di comando dell'attività è stata specificata come "/bin/sh -c python /path/to/script/myscript.py", questa attività può funzionare correttamente anche con la directory di lavoro impostata come directory di lavoro dell'attività Batch, purché tutte le dipendenze per lo script siano soddisfatte.
  • L'immagine del contenitore ENTRYPOINT viene specificata come "./myscript.sh" e la riga di comando dell'attività Batch è vuota.
    • Batch crea il contenitore basato su ENTRYPOINT ed esegue il contenitore nella directory di lavoro dell'attività Batch. Questa attività può causare un errore se l'immagine del contenitore WORKDIR non è uguale alla directory di lavoro dell'attività Batch, il che dipende da vari fattori, quali il sistema operativo, l'ID processo, l'ID attività e così via.
    • Se "--workdir /path/to/script" è stato specificato come containerRunOption, questa attività può funzionare correttamente, purché tutte le dipendenze per lo script siano soddisfatte.
  • L'immagine del contenitore ENTRYPOINT non è specificata, la riga di comando dell'attività Batch è "./myscript.sh" e WORKDIR viene sottoposto a override in ContainerRunOptions come "--workdir /path/to/script".
    • Batch crea il contenitore con la directory di lavoro in "/path/to/script" ed esegue la riga di comando "./myscript.sh", la quale ha esito positivo poiché lo script si trova nella directory di lavoro specificata.

Directory di lavoro dell'attività contenitore

Un'attività contenitore Batch viene eseguita in una directory di lavoro nel contenitore simile alla directory impostata da Batch per un'attività normale (non contenitore). Questa directory di lavoro è diversa da WORKDIR se configurata nell'immagine o nella directory di lavoro predefinita del contenitore (C:\ in un contenitore Windows o / in un contenitore Linux).

Per un'attività contenitore Batch:

  • Per tutte le directory che appaiono in modo ricorsivo sotto AZ_BATCH_NODE_ROOT_DIR nel nodo host (la radice delle directory di Azure Batch) viene eseguito il mapping nel contenitore.
  • Il mapping di tutte le variabili di ambiente delle attività viene eseguito nel contenitore.
  • La directory di lavoro dell'attività AZ_BATCH_TASK_WORKING_DIR per il nodo viene impostata sulla stessa valida per un'attività normale e mappata nel contenitore.

Importante

Per i pool di contenitori Windows in famiglie di macchine virtuali con dischi temporanei, l'intero disco temporaneo viene mappato allo spazio del contenitore a causa di limitazioni dei contenitori di Windows.

Questi mapping consentono di usare le attività contenitore come le attività non contenitore. Ad esempio, installare applicazioni usando i pacchetti dell'applicazione, accedere ai file di risorse da Archiviazione di Azure, usare le impostazioni di ambiente delle attività e rendere persistenti i file di output di attività dopo l'arresto del contenitore.

Indipendentemente da come WORKDIR sia impostato per un'immagine del contenitore, sia stdout.txt che stderr.txt vengono acquisiti in AZ_BATCH_TASK_DIR.

Risolvere i problemi delle attività contenitore

Se l'attività contenitore non viene eseguita come previsto, potrebbe essere necessario ottenere informazioni sulla configurazione di WORKDIR o ENTRYPOINT dell'immagine del contenitore. Per visualizzare la configurazione, eseguire il comando docker image inspect.

Se necessario, modificare le impostazioni dell'attività contenitore in base all'immagine:

  • Specificare un percorso assoluto nella riga di comando dell'attività. Se l'ENTRYPOINT predefinito dell'immagine viene usato per la riga di comando dell'attività, assicurarsi che sia impostato un percorso assoluto.
  • Nelle opzioni di esecuzione del contenitore dell'attività, modificare la directory di lavoro in modo che corrisponda a WORKDIR nell'immagine. Ad esempio, impostare --workdir /app.

Esempi di attività contenitore

Il frammento di codice Python seguente mostra una riga di comando di base in esecuzione in un contenitore creato da un'immagine fittizia estratta dall'Hub Docker. In questo caso, l'opzione del contenitore --rm rimuove il contenitore al termine dell'esecuzione dell'attività e l'opzione --workdir imposta una directory di lavoro. La riga di comando esegue l'override dell'ENTRYPOINT del contenitore con un comando della shell semplice che consente di scrivere un piccolo file nella directory di lavoro dell'attività nell'host.

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'esempio C# seguente illustra le impostazioni di base del contenitore per un'attività 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;

Passaggi successivi