Azure Batch gebruiken om containerworkloads uit te voeren
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 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ën (virtuele machine): containers worden alleen ondersteund in pools die zijn gemaakt met de configuratie van de virtuele machine, op basis van een ondersteunde installatiekopieën (vermeld in de volgende sectie). Als u een aangepaste installatiekopieën opgeeft, raadpleegt u de overwegingen in de volgende sectie en de vereisten in Een beheerde installatiekopieën gebruiken om een aangepaste installatiekopieëngroep 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
Op dit moment moet Type
de containerConfiguration
eigenschap worden doorgegeven 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 toe, maar biedt geen rechtstreekse ondersteuning voor afbeeldingen die zijn gepubliceerd door Mirantis met de mogelijkheid die wordt vermeld als DockerCompatible
. Deze installatiekopieën kunnen alleen worden geïmplementeerd onder een Batch-account voor de pooltoewijzingsmodus Gebruikersabonnement.
U kunt ook een aangepaste installatiekopieën maken om containerfunctionaliteit in Windows in te schakelen.
Notitie
De installatiekopieën-SKU's -with-containers
of -with-containers-smalldisk
worden buiten gebruik gesteld. 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
- Aanbieden:
ubuntu-hpc
- Aanbieden:
- Uitgever:
almalinux
- Aanbieden:
8-hpc-gen1
- Aanbieden:
8-hpc-gen2
- Aanbieden:
Alternatieve afbeeldingsopties
Er zijn momenteel andere installatiekopieën die microsoft-azure-batch
ondersteuning bieden voor containerworkloads:
- Uitgever:
microsoft-azure-batch
- Aanbieden:
ubuntu-server-container
- Aanbieding:
ubuntu-server-container-rdma
(Voor exclusief gebruik op VM-SKU's met Infiniband)
- Aanbieden:
Waarschuwing
Het wordt aanbevolen om andere afbeeldingen te gebruiken dan afbeeldingen die zijn microsoft-azure-batch
gepubliceerd omdat deze afbeeldingen worden afgeschaft vanwege het einde van de levensduur van de afbeelding.
Opmerkingen
De docker-gegevenshoofdmap van de bovenstaande installatiekopieën bevindt zich op verschillende plaatsen:
- Voor de HPC-installatiekopieën of
microsoft-dsvm
(Offer:ubuntu-hpc
, enzovoort) is de docker-gegevenshoofdmap ongewijzigd van de Docker-standaard, namelijk /var/lib/docker in Linux en C:\ProgramData\Docker in 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 installatiekopieën worden alleen ondersteund voor gebruik in Azure Batch-pools en zijn afgestemd 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
-rdma
zijn 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 voor het gebruik van een aangepaste Linux-installatiekopieën:
- Als u wilt profiteren van de GPU-prestaties van grootten uit de Azure N-serie wanneer u een aangepaste installatiekopieën gebruikt, installeert u NVIDIA-stuurprogramma's vooraf. 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 pool met of zonder vooraf gemaakte containerinstallatiekopieën maken, zoals wordt weergegeven 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. Gebruik voor de beste prestaties een Azure-containerregister 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 containerinstallatiekopieën naar de VM's opgehaald wanneer de pool wordt gemaakt. Taken die in de pool worden uitgevoerd, kunnen vervolgens verwijzen naar de lijst met containerinstallatiekopieën en opties voor het uitvoeren van containers.
Notitie
Docker Hub beperkt het aantal pull-installatiekopieën. Zorg ervoor dat uw workload de gepubliceerde frequentielimieten voor docker Hub-installatiekopieën niet overschrijdt. Het is raadzaam om Azure Container Registry rechtstreeks te gebruiken of gebruik te maken van artefactcache in ACR.
Pool zonder vooraf gemaakte containerinstallatiekopieën
Als u een pool met container wilt configureren zonder vooraf gemaakte containerinstallatiekopieën, definieert ContainerConfiguration
en VirtualMachineConfiguration
objecten, zoals wordt weergegeven in de volgende voorbeelden. In deze voorbeelden wordt de installatiekopie van Ubuntu Server voor Azure Batch-containergroepen uit Marketplace gebruikt.
Opmerking: Ubuntu-serverversie die in het voorbeeld wordt gebruikt, is bedoeld voor illustratiedoeleinden. U kunt de node_agent_sku_id wijzigen in 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);
Installatiekopieën vooraf fetch 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-installatiekopieën van Docker Hub vooraf wilt maken. 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;
...
Installatiekopieën vooraf uit een privécontainerregister
U kunt ook containerinstallatiekopieën vooraf instellen door te verifiëren bij een privécontainerregisterserver. In de volgende voorbeelden maken de ContainerConfiguration
en VirtualMachineConfiguration
objecten vooraf een privé-TensorFlow-installatiekopie uit een privé-Azure-containerregister. 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 installatiekopieën die moeten worden gebruikt, register en opties voor het uitvoeren van containers.
Gebruik de
ContainerSettings
eigenschap van de taakklassen om containerspecifieke instellingen te configureren. Deze instellingen worden gedefinieerd door de klasse TaskContainerSettings . Voor de--rm
containeroptie is geen andere--runtime
optie vereist, omdat deze wordt geregeld door Batch.Als u taken uitvoert op containerinstallatiekopieën, zijn voor de cloudtaak en taakbeheer containerinstellingen vereist. Voor de begintaak, taakvoorbereidingstaak en taakreleasetaak zijn echter geen containerinstellingen vereist (dat wil gezegd, 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 in de container beheerdersmachtiging is vereist, moet u de taak mogelijk uitvoeren als poolbereik met het niveau van beheerderstoestemming. Dit zorgt ervoor dat Batch de taak uitvoert als hoofdmap in de containercontext. 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
–gpus
argument niet opnemen.
Opdrachtregel voor containertaak
Wanneer u een containertaak uitvoert, gebruikt Batch automatisch de opdracht docker create om een container te maken met behulp van de installatiekopieën die in de taak zijn opgegeven. 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 containerinstallatiekopieën.
- Batch overschrijft de WORKDIR met de werkmap 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 entryPOINT voor de containerinstallatiekopie 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 containerinstallatiekopie en Batch-containeropties of taakopdrachtregels en hun effect:
- Entrypoint voor containerinstallatiekopieën is niet opgegeven en de opdrachtregel voor batchtaken 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.
- Entrypoint voor containerinstallatiekopieën wordt opgegeven als ./myscript.sh en de opdrachtregel voor batchtaken 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 de werkmap van de containerinstallatiekopie WORKDIR niet hetzelfde is als de werkmap van de Batch-taak, die afhankelijk is van verschillende factoren, zoals het besturingssysteem, taak-id, taak-id, taak-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 voor containerinstallatiekopieën is niet opgegeven, de opdrachtregel voor batchtaken is ./myscript.sh en WORKDIR wordt overschreven in ContainerRunOptions als '--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 containertaak
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_DIR
hostknooppunt (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_DIR
van 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.
Met deze toewijzingen kunt u op dezelfde manier met containertaken werken als niet-containertaken. 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 containerinstallatiekopieën, beide stdout.txt
en stderr.txt
worden 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 containerinstallatiekopieën. Als u de configuratie wilt zien, voert u de inspect-opdracht van de Docker-installatiekopieën uit.
Pas indien nodig de instellingen van de containertaak aan op basis van de installatiekopieën:
- Geef een absoluut pad op in de opdrachtregel van de taak. Als het standaardINVOERPOINT van de installatiekopie wordt gebruikt voor de opdrachtregel van de taak, controleert u of er een absoluut pad is ingesteld.
- Wijzig in de opties voor het uitvoeren van de container van de taak de werkmap zodat deze overeenkomt met de WORKDIR in de installatiekopieën. Stel bijvoorbeeld
--workdir /app
in.
Voorbeelden van containertaken
In het volgende Python-fragment ziet u een eenvoudige opdrachtregel die wordt uitgevoerd in een container die is gemaakt op basis van een fictieve installatiekopie die is opgehaald uit Docker Hub. Hier verwijdert de --rm
containeroptie de container nadat de taak is voltooid en wordt --workdir
een werkmap ingesteld. 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.
- Meer informatie over het gebruik van een beheerde installatiekopieën om een aangepaste installatiekopieëngroep te maken.
- Meer informatie over het Moby-project, een framework voor het maken van op containers gebaseerde systemen.