Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met Azure Batch kunt u grote aantallen batch-rekentaken uitvoeren en schalen in Azure. Batchtaken kunnen rechtstreeks worden uitgevoerd op virtuele machines (nodes) in een Batch-groep, maar u kunt ook een Batch-groep instellen om taken uit te voeren in containers die compatibel zijn met Docker op de nodes. In dit bericht leest u hoe u een groep met rekennodes maakt die ondersteuning bieden voor het uitvoeren van containertaken en vervolgens containertaken uitvoert in de groep.
De codevoorbeelden hier gebruiken de Batch .NET- en Python SDK's. U kunt ook andere Batch SDK's en hulpprogramma's, waaronder Azure Portal, gebruiken om Batch-pools met containerfuncties te maken en containertaken uit te voeren.
Redenen om containers te gebruiken
Containers bieden een eenvoudige manier om Batch-taken uit te voeren zonder dat u een omgeving en afhankelijkheden hoeft te beheren om toepassingen uit te voeren. Containers implementeren toepassingen als lichtgewicht, draagbare, zelfvoorzienende eenheden die in verschillende omgevingen kunnen worden uitgevoerd. Bouw en test bijvoorbeeld een container lokaal en upload de containerinstallatiekopieën naar een register in Azure of elders. Het containerimplementatiemodel zorgt ervoor dat de runtime-omgeving van uw toepassing altijd correct is geïnstalleerd en geconfigureerd waar u de toepassing ook host. Op containers gebaseerde taken in Batch kunnen ook profiteren van functies van niet-containertaken, waaronder toepassingspakketten en beheer van resourcebestanden en uitvoerbestanden.
Vereisten
U moet bekend zijn met containerconcepten en weten hoe u een Batch-pool en taak maakt.
SDK-versies: De Batch SDK's ondersteunen containerinstallatiekopieën vanaf de volgende versies:
- Batch REST API-versie 2017-09-01.6.0
- Batch .NET SDK versie 8.0.0
- Batch Python SDK versie 4.0
- Batch Java SDK versie 3.0
- Batch Node.js SDK versie 3.0
Accounts: In uw Azure-abonnement moet u een Batch-account en eventueel een Azure Storage-account maken.
Een ondersteunde VM-installatiekopie: Containers worden alleen ondersteund in pools die zijn gemaakt met de configuratie van de virtuele machine, op basis van een ondersteunde installatiekopie (vermeld in de volgende sectie). Als u een aangepaste afbeelding opgeeft, raadpleegt u de overwegingen in de volgende sectie en de vereisten in Een beheerde image gebruiken om een aangepaste imagepool te maken.
Notitie
Van Batch SDK-versies:
- Batch .NET SDK versie 16.0.0
- Batch Python SDK versie 14.0.0
- Batch Java SDK versie 11.0.0
- Batch Node.js SDK versie 11.0.0
Momenteel moet containerConfiguration de eigenschap Type doorgeven en de ondersteunde waarden zijn: ContainerType.DockerCompatible en ContainerType.CriCompatible.
Houd rekening met de volgende beperkingen:
- Batch biedt alleen RDMA-ondersteuning (Remote Direct Memory Access) voor containers die worden uitgevoerd in Linux-pools.
- Voor Windows-containerworkloads moet u een VM-grootte met meerdere kernen voor uw pool kiezen.
Belangrijk
Docker maakt standaard een netwerkbrug met een subnetspecificatie van 172.17.0.0/16. Als u een virtueel netwerk voor uw pool opgeeft, moet u ervoor zorgen dat er geen conflicterende IP-bereiken zijn.
Ondersteunde VM-installatiekopieën
Gebruik een van de volgende ondersteunde Windows- of Linux-installatiekopieën om een pool met VM-rekenknooppunten te maken voor containerworkloads. Zie Lijst met installatiekopieën van virtuele machines voor meer informatie over Marketplace-installatiekopieën die compatibel zijn met Batch.
Windows-ondersteuning
Batch ondersteunt Windows-serverinstallatiekopieën met containerondersteuningsaanduidingen.
De API voor het weergeven van alle ondersteunde installatiekopieën in Batch geeft een DockerCompatible mogelijkheid aan als de installatiekopieën Docker-containers ondersteunen. Batch staat het toe, maar biedt geen rechtstreekse ondersteuning voor afbeeldingen die door Mirantis zijn gepubliceerd, met als vermelde capaciteit DockerCompatible. Deze afbeeldingen kunnen alleen worden ingezet onder een Batch-account in de modus "Gebruikersabonnement" voor "pooltoewijzing".
U kunt ook een aangepaste afbeelding maken om containerfunctionaliteit in Windows in te schakelen.
Notitie
De afbeeldings-SKU's -with-containers of -with-containers-smalldisk zijn buiten gebruik. Zie de aankondiging voor details en alternatieve opties voor containerruntime.
Ondersteuning voor Linux
Voor Linux-containerworkloads ondersteunt Batch momenteel de volgende Linux-installatiekopieën die zijn gepubliceerd in Azure Marketplace zonder dat hiervoor een aangepaste installatiekopieën nodig zijn.
- Uitgever:
microsoft-dsvm- Aanbieding:
ubuntu-hpc
- Aanbieding:
- Uitgever:
almalinux- Aanbieding:
8-hpc-gen1 - Aanbieding:
8-hpc-gen2
- Aanbieding:
Alternatieve afbeeldingsopties
Er zijn momenteel andere installatiekopieën die microsoft-azure-batch ondersteuning bieden voor containerworkloads:
- Uitgever:
microsoft-azure-batch- Aanbieding:
ubuntu-server-container - Aanbieding:
ubuntu-server-container-rdma(Voor exclusief gebruik op VM-SKU's met Infiniband)
- Aanbieding:
Waarschuwing
Het wordt aanbevolen om andere afbeeldingen te gebruiken dan de afbeeldingen die zijn gepubliceerd door microsoft-azure-batch, omdat deze als verouderd worden verklaard en binnenkort niet meer gebruikt kunnen worden.
Opmerkingen
De docker-dataroot van de bovenstaande images bevindt zich op verschillende plaatsen.
- Voor de HPC-images of
microsoft-dsvm(Aanbieding:ubuntu-hpc, enzovoort) is de docker-gegevenshoofdmap onveranderd ten opzichte van de Docker-standaardinstelling, namelijk /var/lib/docker op Linux en C:\ProgramData\Docker op Windows. Deze mappen bevinden zich op de besturingssysteemschijf.
Voor niet-Batch gepubliceerde installatiekopieën bestaat het risico dat de besturingssysteemschijf snel wordt opgevuld wanneer containerinstallatiekopieën worden gedownload.
Mogelijke oplossingen voor klanten
Wijzig de docker-gegevenshoofdmap in een begintaak bij het maken van een pool in BatchExplorer. Hier volgt een voorbeeld van de opdracht Taak starten:
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
Deze afbeeldingen worden alleen ondersteund voor gebruik in Azure Batch-pools en zijn gericht op de uitvoering van Docker-containers. Ze hebben de volgende functies:
- Een vooraf geïnstalleerde Docker-compatibele Moby-containerruntime.
- Vooraf geïnstalleerde NVIDIA GPU-stuurprogramma's en NVIDIA-containerruntime, om de implementatie te stroomlijnen op vm's uit de Azure N-serie.
- VM-installatiekopieën met het achtervoegsel
-rdmazijn vooraf geconfigureerd met ondersteuning voor InfiniBand RDMA-VM-grootten. Deze VM-installatiekopieën mogen niet worden gebruikt met VM-grootten die geen Ondersteuning voor InfiniBand hebben.
U kunt ook aangepaste installatiekopieën maken die compatibel zijn met Batch-containers op een van de Linux-distributies die compatibel zijn met Batch. Installeer voor Docker-ondersteuning op een aangepaste installatiekopieën een geschikte Docker-compatibele runtime, zoals een versie van Docker of Mirantis Container Runtime. Het installeren van alleen een docker-CLI-compatibel hulpprogramma is onvoldoende; er is een compatibele Runtime voor Docker Engine vereist.
Belangrijk
Microsoft of Azure Batch biedt geen ondersteuning voor problemen met betrekking tot Docker (een versie of editie), Mirantis Container Runtime of Moby-runtimes. Klanten die ervoor kiezen om deze runtimes in hun installatiekopieën te gebruiken, moeten contact opnemen met het bedrijf of de entiteit die ondersteuning biedt voor runtimeproblemen.
Meer overwegingen bij gebruik van een aangepaste Linux-image:
- Om te profiteren van de GPU-prestaties van Azure N-serie groottes bij gebruik van een aangepaste image, pre-installeert u NVIDIA-stuurprogramma's. U moet ook het Docker Engine Utility installeren voor NVIDIA GPU's, NVIDIA Docker.
- Gebruik een VM-grootte die geschikt is voor RDMA om toegang te krijgen tot het Azure RDMA-netwerk. Vereiste RDMA-stuurprogramma's worden geïnstalleerd in de CentOS HPC- en Ubuntu-installatiekopieën die worden ondersteund door Batch. Er is mogelijk extra configuratie nodig om MPI-workloads uit te voeren. Zie RDMA- of GPU-exemplaren gebruiken in Batch-pool.
Containerconfiguratie voor Batch-pool
Als u een Batch-pool wilt inschakelen voor het uitvoeren van containerworkloads, moet u ContainerConfiguration-instellingen opgeven in het VirtualMachineConfiguration-object van de pool. Dit artikel bevat koppelingen naar de Batch .NET API-verwijzing. De bijbehorende instellingen bevinden zich in de Batch Python-API .
U kunt een container-geschikte pool met of zonder vooraf ingeladen containerafbeeldingen maken, zoals getoond in de volgende voorbeelden. Met het pull-proces (of prefetch) kunt u containerinstallatiekopieën vooraf laden vanuit Docker Hub of een ander containerregister op internet. Voor de beste prestaties gebruikt u een Azure Container Registry in dezelfde regio als het Batch-account.
Het voordeel van het vooraf fetching van containerinstallatiekopieën is dat wanneer taken voor het eerst worden uitgevoerd, ze niet hoeven te wachten totdat de containerinstallatiekopieën zijn gedownload. Met de containerconfiguratie worden containerafbeeldingen naar de VM's opgehaald wanneer de pool wordt gemaakt. Taken die in de pool worden uitgevoerd, kunnen vervolgens verwijzen naar de lijst met containervoorbeelden en containeruitvoeringsopties.
Notitie
Docker Hub beperkt het aantal image pulls. Zorg ervoor dat uw workload de snelheidslimieten van gepubliceerde Docker Hub-images niet overschrijdt. Het is raadzaam om Azure Container Registry rechtstreeks te gebruiken of gebruik te maken van artefactcache in ACR.
Pool zonder vooringeladen containerafbeeldingen
Om een container-ingeschakelde pool te configureren zonder vooraf opgehaalde containerafbeeldingen, definieer ContainerConfiguration en VirtualMachineConfiguration objecten, zoals wordt weergegeven in de volgende voorbeelden. In deze voorbeelden wordt de installatiekopie van Ubuntu Server voor Azure Batch-containerpools uit de Marketplace gebruikt.
Opmerking: Ubuntu-serverversie die in het voorbeeld wordt gebruikt, is bedoeld voor illustratiedoeleinden. U kunt de node_agent_sku_id aanpassen aan de versie die u gebruikt.
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);
Afbeeldingen vooraf ophalen voor containerconfiguratie
Als u containerinstallatiekopieën in de pool vooraf wilt instellen, voegt u de lijst met containerinstallatiekopieën (container_image_names in Python) toe aan de ContainerConfiguration.
In het volgende eenvoudige Python-voorbeeld ziet u hoe u een standaard Ubuntu-containerinstallatiekopie kunt voorbereiden vanuit Docker Hub.
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)
...
In het volgende C#-voorbeeld wordt ervan uitgegaan dat u een TensorFlow-afbeelding van Docker Hub wilt vooraanhaken. Dit voorbeeld bevat een begintaak die wordt uitgevoerd op de VM-host op de poolknooppunten. U kunt bijvoorbeeld een begintaak uitvoeren op de host om een bestandsserver te koppelen die toegankelijk is vanuit de containers.
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;
...
Vooraf afbeeldingen ophalen uit een privécontainerregister
U kunt ook containerinstallatiekopieën vooraf instellen door te verifiëren bij een privécontainerregisterserver. In de volgende voorbeelden halen de ContainerConfiguration en VirtualMachineConfiguration objecten een privé-TensorFlow-afbeelding vooraf op vanuit een privé-Azure Container Registry. De afbeeldingsreferentie is hetzelfde als in het vorige voorbeeld.
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);
...
Ondersteuning voor beheerde identiteiten voor ACR
Wanneer u toegang krijgt tot containers die zijn opgeslagen in Azure Container Registry, kan een beheerde identiteit worden gebruikt om te verifiëren met de service. Als u een beheerde identiteit wilt gebruiken, moet u eerst controleren of de identiteit is toegewezen aan de pool en of de identiteit de AcrPull rol heeft toegewezen voor het containerregister waartoe u toegang wilt hebben. Geef vervolgens Batch de opdracht met welke identiteit moet worden gebruikt bij het verifiëren met 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);
...
Containerinstellingen voor de taak
Als u een containertaak wilt uitvoeren in een pool met containermogelijkheden, geeft u containerspecifieke instellingen op. Instellingen omvatten de afbeelding die moet worden gebruikt, register en opties voor het uitvoeren van containers.
Gebruik de
ContainerSettingseigenschap van de taakklassen om containerspecifieke instellingen te configureren. Deze instellingen worden gedefinieerd door de klasse TaskContainerSettings . Voor de--rmcontaineroptie is geen andere--runtimeoptie vereist, omdat deze wordt geregeld door Batch.Als u taken uitvoert op containerinstallatiekopieën, zijn voor de cloudtaak en taakbeheer containerinstellingen vereist. Echter, voor de begintaak, taakvoorbereidingstaak en taakreleasetaak zijn geen containerinstellingen vereist (dat wil zeggen, ze kunnen worden uitgevoerd binnen een containercontext of rechtstreeks op het knooppunt).
Voor Linux wijst Batch de machtiging gebruiker/groep toe aan de container. Als voor toegang tot een map binnen de container beheerdersrechten vereist zijn, moet u mogelijk de taak uitvoeren in het kader van de pool met verhoogde beheerdersrechten. Dit zorgt ervoor dat Batch de taak als root in de containercontext laat draaien. Anders heeft een niet-beheerder mogelijk geen toegang tot deze mappen.
Voor containergroepen met hardware met GPU schakelt Batch automatisch GPU in voor containertaken, dus u moet het
–gpusargument niet opnemen.
Opdrachtregel voor containertaak
Wanneer u een containertaak uitvoert, gebruikt Batch automatisch de opdracht docker create om een container te maken met de image die in de taak is gespecificeerd. Batch beheert vervolgens de taakuitvoering in de container.
Net als bij niet-container Batch-taken stelt u een opdrachtregel in voor een containertaak. Omdat Batch automatisch de container maakt, geeft de opdrachtregel alleen de opdrachten of opdrachten op die in de container worden uitgevoerd.
Hier volgen de standaardgedragen die Batch toepast op Docker-containertaken:
- Batch voert de container uit met de opgegeven taakopdrachtlijn als de CMD.
- Batch heeft geen invloed op het opgegeven ENTRYPOINT van de containerimage.
- Batch overschrijft de WORKDIR met de werkmap voor batchtaken.
Zorg ervoor dat u de Docker-documentatie tussen ENTRYPOINT en CMD bekijkt, zodat u begrijpt welke interactie-effecten kunnen optreden wanneer containerinstallatiekopieën een opgegeven ENTRYPOINT hebben en u ook een taakopdrachtregel opgeeft.
Als u de ENTRYPOINT van de container-image wilt overschrijven, kunt u het --entrypoint <args> argument opgeven als een containerRunOption. Raadpleeg de optionele ContainerRunOptions voor argumenten die u kunt opgeven voor de docker create opdracht die Batch gebruikt om de container te maken en uit te voeren. Als u bijvoorbeeld een werkmap voor de container wilt instellen, stelt u de --workdir <directory> optie in.
Hier volgen enkele voorbeelden van containerimages en Batch-containeropties of taakopdrachtdraden en hun effect:
- Het ENTRYPOINT van de containerafbeelding is niet gespecificeerd en de commandoregel voor Batch taken is "/bin/sh -c python myscript.py".
- Batch maakt de container met de opdrachtregel van de Batch-taak zoals opgegeven en voert deze uit in de werkmap batchtaken. Dit kan leiden tot een fout als 'myscript.py' zich niet in de werkmap van de Batch-taak bevindt.
- Als de opdrachtregel voor de taak is opgegeven als '/bin/sh -c python /path/to/script/myscript.py', werkt deze taak mogelijk correct, zelfs met de werkmap die is ingesteld als de werkmap batchtaak als aan alle afhankelijkheden voor het script wordt voldaan.
- Het ENTRYPOINT voor de containerafbeelding is opgegeven als "./myscript.sh" en het commando voor de batchtaak is leeg.
- Batch maakt de container die afhankelijk is van het ENTRYPOINT en voert deze uit in de werkmap batchtaken. Deze taak kan mislukken als het container-image WORKDIR niet hetzelfde is als de werkmap van de Batch-taak, die afhankelijk is van verschillende factoren zoals het besturingssysteem, taak-ID, job-ID, enzovoort.
- Als '--workdir /path/to/script' is opgegeven als een containerRunOption, werkt deze taak mogelijk correct als aan alle afhankelijkheden voor het script wordt voldaan.
- ENTRYPOINT van container image is niet gespecificeerd, de opdrachtregel voor Batch-taken is "./myscript.sh", en WORKDIR wordt in ContainerRunOptions overschreven met '--workdir /path/to/script'.
- Batch maakt de container met de werkmap naar '/path/to/script' en voert de opdrachtregel './myscript.sh' uit, wat is gelukt omdat het script wordt gevonden in de opgegeven werkmap.
Werkmap voor containertaken
Een Batch-containertaak wordt uitgevoerd in een werkmap in de container die vergelijkbaar is met de map die Batch instelt voor een reguliere (niet-container)-taak. Deze werkmap verschilt van de WORKDIR als deze is geconfigureerd in de installatiekopieën, of de standaardwerkmap voor containers (C:\ in een Windows-container of / in een Linux-container).
Voor een Batch-containertaak:
- Alle mappen recursief onder het
AZ_BATCH_NODE_ROOT_DIRhostknooppunt (de hoofdmap van Azure Batch-directory's) worden toegewezen aan de container. - Alle omgevingsvariabelen voor taken worden toegewezen aan de container.
- De werkmap
AZ_BATCH_TASK_WORKING_DIRvan de taak op het knooppunt wordt hetzelfde ingesteld als voor een normale taak en toegewezen aan de container.
Belangrijk
Voor Windows-containergroepen op VM-families met tijdelijke schijven wordt de hele tijdelijke schijf toegewezen aan containerruimte vanwege beperkingen van Windows-containers.
Dankzij deze toewijzingen kunt u zowel met containertaken als met niet-containertaken werken. Installeer bijvoorbeeld toepassingen met behulp van toepassingspakketten, open resourcebestanden uit Azure Storage, gebruik taakomgevingsinstellingen en bewaar taakuitvoerbestanden nadat de container is gestopt.
Ongeacht hoe de WORKDIR is ingesteld voor een containerafbeelding, worden zowel stdout.txt als stderr.txt vastgelegd in de AZ_BATCH_TASK_DIR.
Problemen met containertaken oplossen
Als uw containertaak niet wordt uitgevoerd zoals verwacht, moet u mogelijk informatie ophalen over de WORKDIR- of ENTRYPOINT-configuratie van de containerimage. Voer de opdracht docker image inspect uit om de configuratie te bekijken.
Pas indien nodig de instellingen van de containertaak aan op basis van de image:
- Geef een absoluut pad op in de opdrachtregel van de taak. Als de standaard ENTRYPOINT van de image wordt gebruikt voor de opdrachtregel van de taak, zorg ervoor dat er een absoluut pad is ingesteld.
- Wijzig in de uitvoeropties van de container van de taak de werkmap zodat deze overeenkomt met de WORKDIR in de image. Stel bijvoorbeeld
--workdir /appin.
Voorbeelden van containertaken
In het volgende Python-fragment ziet u een eenvoudig commando dat wordt uitgevoerd in een container die is gemaakt op basis van een fictieve afbeelding die is opgehaald uit Docker Hub. Hier verwijdert de optie --rm de container nadat de taak is voltooid, en stelt de optie --workdir een werkmap in. De opdrachtregel overschrijft de container ENTRYPOINT met een eenvoudige shell-opdracht waarmee een klein bestand naar de werkmap van de taak op de host wordt geschreven.
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
)
In het volgende C#-voorbeeld ziet u basiscontainerinstellingen voor een cloudtaak:
// 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;
Volgende stappen
- Zie de Docker-documentatie voor informatie over het installeren en gebruiken van Docker CE in Linux.
- Leer hoe je een beheerd image gebruikt om een aangepaste image pool te maken.
- Meer informatie over het Moby-project, een framework voor het maken van op containers gebaseerde systemen.