Použití služby Azure Batch ke spouštění úloh kontejneru

Azure Batch umožňuje spouštět a škálovat velké množství výpočetních úloh služby Batch v Azure. Úlohy služby Batch se můžou spouštět přímo na virtuálních počítačích (uzlech) ve fondu Batch, ale můžete také nastavit fond Batch pro spouštění úkolů v kontejnerech kompatibilních s Dockerem na uzlech. Tento článek ukazuje, jak vytvořit fond výpočetních uzlů, které podporují spouštění úloh kontejneru, a pak spouštět úlohy kontejneru ve fondu.

Zde uvedené příklady kódu používají sady SDK Batch .NET a Python. K vytváření fondů Batch s podporou kontejnerů a ke spouštění úloh kontejnerů můžete také použít jiné sady SDK a nástroje Batch, včetně webu Azure Portal.

Proč používat kontejnery?

Kontejnery poskytují snadný způsob, jak spouštět úlohy služby Batch, aniž byste museli spravovat prostředí a závislosti pro spouštění aplikací. Kontejnery nasazují aplikace jako jednoduché, přenosné a samoobslužné jednotky, které se můžou spouštět v několika různých prostředích. Můžete například sestavit a otestovat kontejner místně a pak nahrát image kontejneru do registru v Azure nebo jinde. Model nasazení kontejneru zajišťuje, že běhové prostředí vaší aplikace je vždy správně nainstalované a nakonfigurované všude, kde hostujete aplikaci. Úlohy založené na kontejnerech ve službě Batch mohou také využívat funkce úloh, které nejsou kontejnery, včetně balíčků aplikací a správy souborů prostředků a výstupních souborů.

Požadavky

Měli byste být obeznámeni s koncepty kontejneru a s tím, jak vytvořit fond a úlohu Služby Batch.

  • Verze sady SDK: Sady SDK služby Batch podporují image kontejnerů v následujících verzích:

    • Batch REST API verze 2017-09-01.6.0
    • Batch .NET SDK verze 8.0.0
    • Batch Python SDK verze 4.0
    • Batch Java SDK verze 3.0
    • Batch Node.js SDK verze 3.0
  • Účty: V předplatném Azure musíte vytvořit účet Batch a volitelně účet Azure Storage.

  • Podporovaná image virtuálního počítače: Kontejnery se podporují jenom ve fondech vytvořených pomocí konfigurace virtuálního počítače z podporované image (uvedené v další části). Pokud zadáte vlastní image, prohlédnou si aspekty v následující části a požadavky týkající se použití spravované image k vytvoření vlastního fondu imagí.

Poznámka:

Z verzí sady Batch SDK:

  • Batch .NET SDK verze 16.0.0
  • Batch Python SDK verze 14.0.0
  • Batch Java SDK verze 11.0.0
  • Batch Node.js SDK verze 11.0.0

V současné době je nutné Type předat containerConfiguration vlastnost a podporované hodnoty jsou: ContainerType.DockerCompatible a ContainerType.CriCompatible.

Mějte na paměti následující omezení:

  • Služba Batch poskytuje podporu vzdáleného přímého přístupu do paměti (RDMA) pouze pro kontejnery, které běží ve fondech Linuxu.
  • U úloh kontejnerů s Windows byste měli zvolit velikost vícejádrových virtuálních počítačů pro váš fond.

Důležité

Docker ve výchozím nastavení vytvoří síťový most se specifikací 172.17.0.0/16podsítě . Pokud pro fond zadáváte virtuální síť , ujistěte se, že neexistují konfliktní rozsahy IP adres.

Podporované image virtuálních počítačů

Pomocí jedné z následujících podporovaných imagí Windows nebo Linuxu vytvořte fond výpočetních uzlů virtuálních počítačů pro úlohy kontejnerů. Další informace o imagích Marketplace, které jsou kompatibilní se službou Batch, najdete v tématu Seznam imagí virtuálních počítačů.

Podpora pro Windows

Služba Batch podporuje image windows serveru, které mají označení podpory kontejnerů. Rozhraní API pro výpis všech podporovaných imagí ve službě Batch označuje DockerCompatible schopnost, pokud image podporuje kontejnery Dockeru. Batch umožňuje, ale nepodporuje přímo obrázky publikované Mirantis s schopností označenou jako DockerCompatible. Tyto image je možné nasadit pouze v rámci účtu Batch v režimu přidělování fondů předplatného uživatele.

Můžete také vytvořit vlastní image , která povolí funkce kontejneru ve Windows.

Poznámka:

Skladové položky -with-containers image nebo -with-containers-smalldisk jsou vyřazené. Podrobnosti a alternativní možnosti modulu runtime kontejneru najdete v oznámení .

Podpora Linuxu

V případě linuxových úloh kontejneru služba Batch v současné době podporuje následující image Linuxu publikované na Azure Marketplace, aniž by potřebovala vlastní image.

  • Vydavatel: microsoft-dsvm
    • Nabídnout: ubuntu-hpc
  • Vydavatel: almalinux
    • Nabídnout: 8-hpc-gen1
    • Nabídnout: 8-hpc-gen2

Alternativní možnosti obrázku

V současné době jsou publikované další image, které microsoft-azure-batch podporují úlohy kontejnerů:

  • Vydavatel: microsoft-azure-batch
    • Nabídnout: ubuntu-server-container
    • Nabídka: ubuntu-server-container-rdma (Výhradně pro skladové položky virtuálních počítačů s infinibandem)

Upozorňující

Doporučujeme používat jiné obrázky než obrázky publikované, microsoft-azure-batch protože tyto obrázky jsou zastaralé kvůli blížícímu se konci životnosti obrázku.

Notes

Kořen dat Dockeru výše uvedených imagí se nachází na různých místech:

  • Pro image PROSTŘEDÍ HPC nebo microsoft-dsvm (Offer: ubuntu-hpcatd.) se kořen dat Dockeru nezmění od výchozího nastavení Dockeru, což je /var/lib/docker v Linuxu a C:\ProgramData\Docker ve Windows. Tyto složky jsou umístěné na disku s operačním systémem.

U nepublikovaných imagí, které nejsou publikované službou Batch, má disk s operačním systémem potenciální riziko rychlého naplnění při stahování imagí kontejnerů.

Potenciální řešení pro zákazníky

Při vytváření fondu ve službě BatchExplorer změňte kořen dat Dockeru v úloze zahájení. Tady je příklad příkazu Spustit úkol:

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

Tyto image se podporují jenom pro použití ve fondech Azure Batch a jsou zaměřené na spouštění kontejnerů Dockeru. Funkce:

  • Předinstalovaný modul runtime kontejneru Moby kompatibilní s Dockerem.
  • Předinstalované ovladače NVIDIA GPU a modul runtime kontejnerů NVIDIA, které zjednoduší nasazení na virtuálních počítačích řady Azure N-series.
  • Image virtuálních počítačů s příponou jsou předem nakonfigurované s podporou velikostí virtuálních -rdma počítačů RDMA infiniBand. Tyto image virtuálních počítačů by se neměly používat s velikostmi virtuálních počítačů, které nepodporují InfiniBand.

Můžete také vytvořit vlastní image kompatibilní pro kontejnery Batch v jedné z distribucí Linuxu, která je kompatibilní se službou Batch. Pro podporu Dockeru na vlastní imagi nainstalujte vhodný modul runtime kompatibilní s Dockerem, jako je verze Dockeru nebo Modulu runtime kontejneru Mirantis. Instalace nástroje kompatibilního s Docker-CLI není dostatečná; Vyžaduje se modul runtime kompatibilní s Modulem Dockeru.

Důležité

Microsoft ani Azure Batch nebudou poskytovat podporu problémů souvisejících s Dockerem (libovolnou verzí nebo edicí), modulem runtime kontejnerů Mirantis nebo moduly runtime Moby. Zákazníci, kteří se rozhodnou tyto moduly runtime používat ve svých imagích, by se měli obrátit na společnost nebo entitu poskytující podporu problémů s modulem runtime.

Další aspekty použití vlastní image Linuxu:

  • Pokud chcete využít výkon GPU velikostí řady Azure N-series při použití vlastní image, předinstalujte ovladače NVIDIA. Musíte také nainstalovat nástroj Docker Engine Utility pro GPU NVIDIA, NVIDIA Docker.
  • Pokud chcete získat přístup k síti Azure RDMA, použijte velikost virtuálního počítače podporující RDMA. Potřebné ovladače RDMA se instalují do imagí CentOS HPC a Ubuntu podporovaných službou Batch. Ke spouštění úloh MPI může být potřeba další konfigurace. Viz Použití instancí RDMA nebo GPU ve fondu Batch.

Konfigurace kontejneru pro fond Batch

Pokud chcete fondu Batch povolit spouštění úloh kontejneru, musíte zadat nastavení ContainerConfiguration v objektu VirtualMachineConfiguration fondu. Tento článek obsahuje odkazy na referenční informace k rozhraní API služby Batch .NET. Odpovídající nastavení jsou v rozhraní API Služby Batch v Pythonu.

Fond s povoleným kontejnerem můžete vytvořit s předem načtenými imagemi kontejneru nebo bez ní, jak je znázorněno v následujících příkladech. Proces vyžádané replikace (nebo předběžného načtení) umožňuje předem načíst image kontejneru z Docker Hubu nebo jiného registru kontejneru na internetu. Pokud chcete dosáhnout nejlepšího výkonu, použijte registr kontejnerů Azure ve stejné oblasti jako účet Batch.

Výhodou předběžného načítání imagí kontejneru je, že při prvním spuštění úloh nemusí čekat na stažení image kontejneru. Konfigurace kontejneru při vytváření fondu načítá image kontejnerů do virtuálních počítačů. Úlohy, které běží ve fondu, pak můžou odkazovat na seznam imagí kontejneru a možností spuštění kontejneru.

Poznámka:

Docker Hub omezuje počet vyžádání imagí. Ujistěte se, že vaše úloha nepřekračuje limity publikované rychlosti pro image založené na Docker Hubu. Doporučuje se použít Službu Azure Container Registry přímo nebo využít mezipaměť Artefaktů v ACR.

Fond bez předem načtených imagí kontejneru

Pokud chcete nakonfigurovat fond s podporou kontejneru bez předem načtených imagí kontejneru, definujte ContainerConfiguration a VirtualMachineConfiguration objekty, jak je znázorněno v následujících příkladech. Tyto příklady používají image fondů kontejnerů Služby Azure Batch pro Ubuntu Server z Marketplace.

Poznámka: Verze serveru Ubuntu použitá v příkladu je určená pro ilustraci. Nebojte se změnit node_agent_sku_id na verzi, kterou používáte.

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

Předběžné načtení imagí pro konfiguraci kontejneru

Pokud chcete předem načíst image kontejneru ve fondu, přidejte do ní seznam imagí kontejneru (container_image_names v Pythonu ContainerConfiguration).

Následující základní příklad Pythonu ukazuje, jak předem načíst standardní image kontejneru Ubuntu z Docker Hubu.

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

Následující příklad jazyka C# předpokládá, že chcete předem načíst image TensorFlow z Docker Hubu. Tento příklad zahrnuje spouštěcí úlohu, která se spouští v hostiteli virtuálního počítače na uzlech fondu. V hostiteli můžete spustit spouštěcí úlohu, například pro připojení souborového serveru, ke kterému lze přistupovat z kontejnerů.

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

Předběžné načtení imagí z privátního registru kontejneru

Image kontejneru můžete také předem načíst ověřením na privátním serveru registru kontejneru. V následujících příkladech ContainerConfiguration předčítá privátní image TensorFlow z privátního registru kontejneru Azure a VirtualMachineConfiguration objekty. Odkaz na obrázek je stejný jako v předchozím příkladu.

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

Podpora spravované identity pro ACR

Když přistupujete k kontejnerům uloženým ve službě Azure Container Registry, můžete spravovanou identitu použít k ověření ve službě. Pokud chcete použít spravovanou identitu, nejprve se ujistěte, že je identita přiřazená k fondu a že identita má přiřazenou AcrPull roli pro registr kontejneru, ke kterému chcete získat přístup. Pak službě Batch řekněte, s jakou identitou se má použít při ověřování pomocí 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);
...

Nastavení kontejneru pro úlohu

Pokud chcete spustit úlohu kontejneru ve fondu s podporou kontejneru, zadejte nastavení specifická pro kontejner. Nastavení zahrnuje image, která se má použít, registr a možnosti spuštění kontejneru.

  • ContainerSettings Ke konfiguraci nastavení specifických pro kontejner použijte vlastnost tříd úloh. Tato nastavení jsou definována TaskContainerSettings třídy. Možnost --rm kontejneru nevyžaduje jinou --runtime možnost, protože se stará o službu Batch.

  • Pokud spouštíte úlohy na imagích kontejnerů, cloudová úloha a úloha správce úloh vyžadují nastavení kontejneru. Spouštěcí úkol, úkol přípravy úlohy a úloha uvolnění úloh však nevyžadují nastavení kontejneru (to znamená, že se můžou spouštět v kontextu kontejneru nebo přímo na uzlu).

  • V případě Linuxu služba Batch mapuje oprávnění uživatele nebo skupiny k kontejneru. Pokud přístup k jakékoli složce v kontejneru vyžaduje oprávnění správce, možná budete muset spustit úlohu jako obor fondu s úrovní zvýšení oprávnění správce. Tím se zajistí, že služba Batch spustí úlohu jako kořen v kontextu kontejneru. Jinak uživatel bez oprávnění správce nemusí mít k těmto složkám přístup.

  • U fondů kontejnerů s hardwarem s podporou GPU služba Batch automaticky povolí GPU pro úlohy kontejnerů, takže byste neměli –gpus argument zahrnout.

Příkazový řádek úlohy kontejneru

Když spustíte úlohu kontejneru, Batch automaticky použije příkaz docker create k vytvoření kontejneru pomocí image zadané v úloze. Batch pak řídí provádění úkolů v kontejneru.

Stejně jako u úkolů služby Batch bez kontejneru nastavíte příkazový řádek pro úlohu kontejneru. Vzhledem k tomu, že služba Batch automaticky vytvoří kontejner, příkazový řádek určuje pouze příkaz nebo příkazy, které se spouští v kontejneru.

Toto jsou výchozí chování služby Batch pro úlohy kontejneru Dockeru:

  • Služba Batch spustí kontejner se zadaným příkazovým řádkem úlohy jako CMD.
  • Služba Batch nenaruší zadaný vstupní bod image kontejneru.
  • Služba Batch přepíše WORKDIR pracovním adresářem úkolu batch.

Ujistěte se, že si projdete dokumentaci Dockeru mezi ENTRYPOINTem a CMD, abyste porozuměli efektům interakce, které můžou nastat, když image kontejneru mají zadaný ENTRYPOINT a také zadáte příkazový řádek úkolu.

Pokud chcete přepsat image kontejneru ENTRYPOINT, můžete argument zadat --entrypoint <args> jako containerRunOption. Pro argumenty, které můžete poskytnout docker create příkazu, který Batch používá k vytvoření a spuštění kontejneru, najdete v volitelných parametrech ContainerRunOptions. Pokud chcete například nastavit pracovní adresář pro kontejner, nastavte možnost --workdir <directory> .

Tady je několik příkladů image kontejneru a možností kontejneru Batch nebo příkazového řádku úkolů a jejich efektu:

  • Není zadán parametr ENTRYPOINT image kontejneru a příkazový řádek úkolu batch je /bin/sh -c python myscript.py.
    • Služba Batch vytvoří kontejner s příkazovým řádkem úlohy Batch, jak je zadáno, a spustí ho v pracovním adresáři úkolu Batch. To může mít za následek selhání, pokud myscript.py není v pracovním adresáři úkolu batch.
    • Pokud byl příkazový řádek úkolu zadán jako "/bin/sh -c python /path/to/script/myscript.py", může tento úkol správně fungovat i s pracovním adresářem služby Batch, pokud jsou splněny všechny závislosti skriptu.
  • Položka image kontejneru je zadána jako ./myscript.sh a příkazový řádek úkolu batch je prázdný.
    • Služba Batch vytvoří kontejner, který spoléhá na ENTRYPOINT a spustí ho v pracovním adresáři úlohy Batch. Tato úloha může mít za následek selhání, pokud image kontejneru WORKDIR není stejná jako pracovní adresář úkolu Batch, který je závislý na různých faktorech, jako je operační systém, ID úlohy, ID úkolu atd.
    • Pokud byl parametr --workdir /path/to/script zadán jako kontejnerRunOption, může tato úloha fungovat správně, pokud jsou splněny všechny závislosti skriptu.
  • Není zadaný parametr ENTRYPOINT image kontejneru, příkazový řádek úkolu služby Batch je ./myscript.sh a příkaz WORKDIR se v ContainerRunOptions přepíše jako --workdir /path/to/script.
    • Služba Batch vytvoří kontejner s pracovním adresářem na /path/to/script a spustí příkazový řádek ./myscript.sh, který je úspěšný při nalezení skriptu v zadaném pracovním adresáři.

Pracovní adresář úloh kontejneru

Úloha kontejneru Batch se spustí v pracovním adresáři v kontejneru, který je podobný adresáři, který služba Batch nastaví pro běžnou úlohu (bez kontejneru). Tento pracovní adresář se liší od nástroje WORKDIR , pokud je nakonfigurovaný v imagi, nebo výchozí pracovní adresář kontejneru (C:\ v kontejneru Windows nebo / v kontejneru Linuxu).

Pro úlohu kontejneru Batch:

  • Všechny adresáře se rekurzivně pod AZ_BATCH_NODE_ROOT_DIR uzlem hostitele (kořen adresářů Azure Batch) mapují do kontejneru.
  • Všechny proměnné prostředí úloh se mapují do kontejneru.
  • Pracovní adresář AZ_BATCH_TASK_WORKING_DIR úkolu na uzlu je nastavený stejně jako pro běžný úkol a namapován do kontejneru.

Důležité

U fondů kontejnerů Windows na rodinách virtuálních počítačů s dočasnými disky se celý dočasný disk mapuje na místo v kontejneru kvůli omezením kontejnerů Windows.

Tato mapování umožňují pracovat s úlohami kontejneru úplně stejným způsobem jako s úkoly, které nejsou kontejnery. Například nainstalujte aplikace pomocí balíčků aplikací, získejte přístup k souborům prostředků ze služby Azure Storage, použijte nastavení prostředí úloh a po zastavení kontejneru zachovají výstupní soubory úloh.

Bez ohledu na to, jak je WORKDIR nastaven pro image kontejneru, a to jak a stdout.txt stderr.txt jsou zachyceny do AZ_BATCH_TASK_DIR.

Řešení potíží s úlohami kontejneru

Pokud se úloha kontejneru nespustí podle očekávání, budete možná muset získat informace o konfiguraci WORKDIR nebo ENTRYPOINT image kontejneru. Pokud chcete zobrazit konfiguraci, spusťte příkaz docker image inspect .

V případě potřeby upravte nastavení úlohy kontejneru na základě image:

  • Zadejte absolutní cestu na příkazovém řádku úkolu. Pokud se pro příkazový řádek úkolu používá výchozí VSTUPNÍ BOD obrázku, ujistěte se, že je nastavena absolutní cesta.
  • V možnostech spuštění kontejneru úlohy změňte pracovní adresář tak, aby odpovídal pracovnímu adresáři v imagi. Například nastavte --workdir /app.

Příklady úloh kontejneru

Následující fragment kódu Pythonu ukazuje základní příkazový řádek spuštěný v kontejneru vytvořeném z fiktivní image načítané z Docker Hubu. --rm V této části možnost kontejneru po dokončení úlohy odebere kontejner a --workdir možnost nastaví pracovní adresář. Příkazový řádek přepíše položku kontejneru jednoduchým příkazem prostředí, který zapíše malý soubor do pracovního adresáře úkolu na hostiteli.

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
)

Následující příklad jazyka C# ukazuje základní nastavení kontejneru pro cloudovou úlohu:

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

Další kroky