Uruchamianie obciążeń kontenerów przy użyciu usługi Azure Batch
Usługa Azure Batch umożliwia uruchamianie i skalowanie dużej liczby zadań obliczania wsadowego na platformie Azure. Zadania usługi Batch mogą być uruchamiane bezpośrednio na maszynach wirtualnych (węzłach) w puli usługi Batch, ale można również skonfigurować pulę usługi Batch do uruchamiania zadań w kontenerach zgodnych z platformą Docker w węzłach. W tym artykule pokazano, jak utworzyć pulę węzłów obliczeniowych, które obsługują uruchamianie zadań kontenera, a następnie uruchamiać zadania kontenera w puli.
Przykłady kodu w tym miejscu korzystają z zestawów SDK platformy .NET i języka Python usługi Batch. Możesz również użyć innych zestawów SDK i narzędzi usługi Batch, w tym witryny Azure Portal, do tworzenia pul usługi Batch z obsługą kontenerów i uruchamiania zadań kontenera.
Dlaczego warto korzystać z kontenerów?
Kontenery umożliwiają łatwe uruchamianie zadań usługi Batch bez konieczności zarządzania środowiskiem i zależnościami w celu uruchamiania aplikacji. Kontenery wdrażają aplikacje jako lekkie, przenośne, samodzielne jednostki, które mogą działać w kilku różnych środowiskach. Na przykład skompiluj i przetestuj kontener lokalnie, a następnie przekaż obraz kontenera do rejestru na platformie Azure lub w innym miejscu. Model wdrażania kontenera zapewnia, że środowisko uruchomieniowe aplikacji jest zawsze poprawnie zainstalowane i skonfigurowane wszędzie tam, gdzie hostujesz aplikację. Zadania oparte na kontenerach w usłudze Batch mogą również korzystać z funkcji zadań niekontenerowych, w tym pakietów aplikacji i zarządzania plikami zasobów i plikami wyjściowymi.
Wymagania wstępne
Należy zapoznać się z pojęciami dotyczącymi kontenerów i sposobami tworzenia puli i zadania usługi Batch.
Wersje zestawu SDK: Zestawy SDK usługi Batch obsługują obrazy kontenerów w następujących wersjach:
- Interfejs API REST usługi Batch w wersji 2017-09-01.6.0
- Zestaw SDK platformy .NET usługi Batch w wersji 8.0.0
- Zestaw SDK języka Python usługi Batch w wersji 4.0
- Zestaw JAVA SDK usługi Batch w wersji 3.0
- Zestaw SDK usługi Batch Node.js w wersji 3.0
Konta: w ramach subskrypcji platformy Azure musisz utworzyć konto usługi Batch i opcjonalnie konto usługi Azure Storage.
Obraz obsługiwanej maszyny wirtualnej: kontenery są obsługiwane tylko w pulach utworzonych za pomocą konfiguracji maszyny wirtualnej z obsługiwanego obrazu (wymienionego w następnej sekcji). Jeśli podasz obraz niestandardowy, zapoznaj się z zagadnieniami w poniższej sekcji i wymaganiami w temacie Używanie obrazu zarządzanego do utworzenia niestandardowej puli obrazów.
Uwaga
Z wersji zestawu SDK usługi Batch:
- Zestaw SDK platformy .NET usługi Batch w wersji 16.0.0
- Zestaw SDK języka Python usługi Batch w wersji 14.0.0
- Zestaw JAVA SDK usługi Batch w wersji 11.0.0
- Zestaw SDK usługi Batch Node.js w wersji 11.0.0
Obecnie właściwość wymaga Type
przekazania, containerConfiguration
a obsługiwane wartości to: ContainerType.DockerCompatible
i ContainerType.CriCompatible
.
Pamiętaj o następujących ograniczeniach:
- Usługa Batch zapewnia zdalny bezpośredni dostęp do pamięci (RDMA) tylko dla kontenerów uruchamianych w pulach systemu Linux.
- W przypadku obciążeń kontenerów systemu Windows należy wybrać rozmiar maszyny wirtualnej z wieloma rdzeniami dla puli.
Ważne
Docker domyślnie tworzy mostek sieciowy ze specyfikacją podsieci 172.17.0.0/16
. Jeśli określasz sieć wirtualną dla puli, upewnij się, że nie ma konfliktów zakresów adresów IP.
Obsługiwane obrazy maszyn wirtualnych
Użyj jednego z następujących obsługiwanych obrazów systemu Windows lub Linux, aby utworzyć pulę węzłów obliczeniowych maszyn wirtualnych dla obciążeń kontenera. Aby uzyskać więcej informacji na temat obrazów witryny Marketplace zgodnych z usługą Batch, zobacz Lista obrazów maszyn wirtualnych.
Obsługa systemu Windows
Usługa Batch obsługuje obrazy serwera z systemem Windows, które obsługują oznaczenia kontenerów.
Interfejs API umożliwiający wyświetlenie listy wszystkich obsługiwanych obrazów w usłudze DockerCompatible
Batch oznacza możliwość, jeśli obraz obsługuje kontenery platformy Docker. Usługa Batch zezwala, ale nie obsługuje bezpośrednio obrazów opublikowanych przez Firmę Mirantis z możliwością zanotowaną jako DockerCompatible
. Te obrazy mogą być wdrażane tylko w trybie alokacji puli subskrypcji użytkownika w trybie usługi Batch.
Można również utworzyć obraz niestandardowy, aby włączyć funkcjonalność kontenera w systemie Windows.
Uwaga
Jednostki -with-containers
SKU obrazu lub -with-containers-smalldisk
są wycofane. Zapoznaj się z ogłoszeniem, aby uzyskać szczegółowe informacje i alternatywne opcje środowiska uruchomieniowego kontenera.
Pomoc techniczna dotycząca systemu Linux
W przypadku obciążeń kontenerów systemu Linux usługa Batch obsługuje obecnie następujące obrazy systemu Linux opublikowane w witrynie Azure Marketplace bez konieczności używania obrazu niestandardowego.
- Wydawca:
microsoft-dsvm
- Oferta:
ubuntu-hpc
- Oferta:
- Wydawca:
almalinux
- Oferta:
8-hpc-gen1
- Oferta:
8-hpc-gen2
- Oferta:
Opcje alternatywnego obrazu
Obecnie istnieją inne obrazy opublikowane przez microsoft-azure-batch
usługę , które obsługują obciążenia kontenerów:
- Wydawca:
microsoft-azure-batch
- Oferta:
ubuntu-server-container
- Oferta:
ubuntu-server-container-rdma
(Do użytku wyłącznie na jednostkach SKU maszyn wirtualnych za pomocą rozwiązania Infiniband)
- Oferta:
Ostrzeżenie
Zaleca się używanie obrazów innych niż te opublikowane przez microsoft-azure-batch
program , ponieważ te obrazy są przestarzałe ze względu na zbliżający się koniec życia obrazu.
Uwagi
Katalog główny danych platformy Docker powyższych obrazów znajduje się w różnych miejscach:
- W przypadku obrazu HPC lub
microsoft-dsvm
(Oferta:ubuntu-hpc
itp.) katalog główny danych platformy Docker jest niezmieniony z domyślnego ustawienia platformy Docker, czyli /var/lib/docker w systemach Linux i C:\ProgramData\Docker w systemie Windows. Te foldery znajdują się na dysku systemu operacyjnego.
W przypadku obrazów nieopublikowanych w usłudze Batch dysk systemu operacyjnego ma potencjalne ryzyko szybkiego wypełnienia obrazów kontenerów.
Potencjalne rozwiązania dla klientów
Zmień katalog główny danych platformy Docker w zadaniu uruchamiania podczas tworzenia puli w usłudze BatchExplorer. Oto przykład polecenia Uruchom zadanie:
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
Te obrazy są obsługiwane tylko do użytku w pulach usługi Azure Batch i są przeznaczone do wykonywania kontenera platformy Docker. Funkcje te:
- Wstępnie zainstalowane środowisko uruchomieniowe kontenera Moby zgodne z platformą Docker.
- Wstępnie zainstalowane sterowniki procesora GPU FIRMY NVIDIA i środowisko uruchomieniowe kontenera NVIDIA w celu usprawnienia wdrażania na maszynach wirtualnych serii N platformy Azure.
- Obrazy maszyn wirtualnych
-rdma
z sufiksem są wstępnie skonfigurowane z obsługą rozmiarów maszyn wirtualnych RDMA InfiniBand. Te obrazy maszyn wirtualnych nie powinny być używane z rozmiarami maszyn wirtualnych, które nie obsługują rozwiązania InfiniBand.
Można również tworzyć obrazy niestandardowe zgodne z kontenerami usługi Batch w jednej z dystrybucji systemu Linux, które są zgodne z usługą Batch. W przypadku obsługi platformy Docker na obrazie niestandardowym zainstaluj odpowiednie środowisko uruchomieniowe zgodne z platformą Docker, takie jak wersja platformy Docker lub Mirantis Container Runtime. Instalowanie tylko narzędzia zgodnego z interfejsem wiersza polecenia platformy Docker jest niewystarczające; Wymagane jest środowisko uruchomieniowe zgodne z aparatem platformy Docker.
Ważne
Ani firma Microsoft, ani Usługa Azure Batch nie zapewni obsługi problemów związanych z platformą Docker (dowolną wersją lub wydaniem), środowiskiem uruchomieniowym Kontenera Mirantis lub środowiskami uruchomieniowymi Moby. Klienci, którzy chcą używać tych środowisk uruchomieniowych na swoich obrazach, powinni skontaktować się z firmą lub jednostką zapewniającą obsługę problemów ze środowiskiem uruchomieniowym.
Więcej zagadnień dotyczących używania niestandardowego obrazu systemu Linux:
- Aby skorzystać z wydajności procesora GPU rozmiarów serii N platformy Azure podczas korzystania z obrazu niestandardowego, wstępnie zainstaluj sterowniki NVIDIA. Ponadto należy zainstalować narzędzie aparatu platformy Docker dla procesorów GPU NVIDIA, NVIDIA Docker.
- Aby uzyskać dostęp do sieci usługi Azure RDMA, użyj rozmiaru maszyny wirtualnej obsługującej funkcję RDMA. Niezbędne sterowniki RDMA są instalowane w obrazach CentOS HPC i Ubuntu obsługiwanych przez usługę Batch. Do uruchamiania obciążeń MPI może być konieczna dodatkowa konfiguracja. Zobacz Use RDMA or GPU instances in Batch pool (Używanie wystąpień RDMA lub GPU w puli usługi Batch).
Konfiguracja kontenera dla puli usługi Batch
Aby umożliwić puli usługi Batch uruchamianie obciążeń kontenerów, należy określić ustawienia ContainerConfiguration w obiekcie VirtualMachineConfiguration puli. Ten artykuł zawiera linki do dokumentacji interfejsu API platformy .NET usługi Batch. Odpowiednie ustawienia znajdują się w interfejsie API języka Python usługi Batch.
Pulę z obsługą kontenerów można utworzyć z wstępnie pobranymi obrazami kontenerów lub bez ich użycia, jak pokazano w poniższych przykładach. Proces ściągania (lub pobierania wstępnego) umożliwia wstępne ładowanie obrazów kontenerów z usługi Docker Hub lub innego rejestru kontenerów w Internecie. Aby uzyskać najlepszą wydajność, użyj rejestru kontenerów platformy Azure w tym samym regionie co konto usługi Batch.
Zaletą wstępnego pobierania obrazów kontenerów jest to, że gdy zadania po raz pierwszy zaczynają działać, nie muszą czekać na pobranie obrazu kontenera. Konfiguracja kontenera ściąga obrazy kontenerów na maszyny wirtualne po utworzeniu puli. Zadania uruchamiane w puli mogą następnie odwoływać się do listy obrazów kontenerów i opcji uruchamiania kontenera.
Uwaga
Usługa Docker Hub ogranicza liczbę ściągnięcia obrazów. Upewnij się, że obciążenie nie przekracza opublikowanych limitów szybkości dla obrazów opartych na usłudze Docker Hub. Zaleca się bezpośrednie używanie usługi Azure Container Registry lub korzystanie z pamięci podręcznej Artifact w usłudze ACR.
Pula bez wstępnie pobranych obrazów kontenerów
Aby skonfigurować pulę z obsługą kontenerów bez wstępnie pobranych obrazów kontenerów, zdefiniuj ContainerConfiguration
obiekty i VirtualMachineConfiguration
, jak pokazano w poniższych przykładach. W tych przykładach użyto obrazu systemu Ubuntu Server dla pul kontenerów usługi Azure Batch z witryny Marketplace.
Uwaga: wersja systemu Ubuntu Server używana w tym przykładzie służy do celów ilustracyjnych. Możesz zmienić node_agent_sku_id na używaną wersję.
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);
Wstępne pobieranie obrazów dla konfiguracji kontenera
Aby wstępnie pobrać obrazy kontenerów w puli, dodaj listę obrazów kontenerów (container_image_names
w języku Python) do pliku ContainerConfiguration
.
W poniższym podstawowym przykładzie języka Python pokazano, jak wstępnie pobrać standardowy obraz kontenera systemu Ubuntu z usługi 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)
...
W poniższym przykładzie w języku C# przyjęto założenie, że chcesz wstępnie pobrać obraz TensorFlow z usługi Docker Hub. Ten przykład obejmuje zadanie uruchamiania, które jest uruchamiane na hoście maszyny wirtualnej w węzłach puli. Możesz uruchomić zadanie uruchamiania na hoście, na przykład, aby zainstalować serwer plików, do którego można uzyskać dostęp z kontenerów.
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;
...
Wstępne pobieranie obrazów z prywatnego rejestru kontenerów
Obrazy kontenerów można również pobrać wstępnie, uwierzytelniając się na prywatnym serwerze rejestru kontenerów. W poniższych przykładach ContainerConfiguration
obiekty i VirtualMachineConfiguration
pobierają wstępnie prywatny obraz TensorFlow z prywatnego rejestru kontenerów platformy Azure. Odwołanie do obrazu jest takie samo jak w poprzednim przykładzie.
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);
...
Obsługa tożsamości zarządzanej dla usługi ACR
Gdy uzyskujesz dostęp do kontenerów przechowywanych w usłudze Azure Container Registry, tożsamość zarządzana może służyć do uwierzytelniania w usłudze. Aby użyć tożsamości zarządzanej, najpierw upewnij się, że tożsamość została przypisana do puli i że tożsamość ma AcrPull
przypisaną rolę dla rejestru kontenerów, do którego chcesz uzyskać dostęp. Następnie poinstruuj usługę Batch, której tożsamości należy użyć podczas uwierzytelniania za pomocą usługi 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);
...
Ustawienia kontenera dla zadania
Aby uruchomić zadanie kontenera w puli z obsługą kontenerów, określ ustawienia specyficzne dla kontenera. Ustawienia obejmują obraz do użycia, rejestru i opcji uruchamiania kontenera.
ContainerSettings
Użyj właściwości klas zadań, aby skonfigurować ustawienia specyficzne dla kontenera. Te ustawienia są definiowane przez klasę TaskContainerSettings . Opcja--rm
kontenera nie wymaga innej--runtime
opcji, ponieważ jest ona zajęta przez usługę Batch.Jeśli uruchamiasz zadania na obrazach kontenerów, zadanie w chmurze i zadanie menedżera zadań wymagają ustawień kontenera. Jednak zadanie podrzędne uruchamiania, zadanie przygotowania zadania i zadanie zwolnienia zadania nie wymagają ustawień kontenera (czyli mogą być uruchamiane w kontekście kontenera lub bezpośrednio w węźle).
W przypadku systemu Linux usługa Batch mapuje uprawnienie użytkownika/grupy do kontenera. Jeśli dostęp do dowolnego folderu w kontenerze wymaga uprawnień administratora, może być konieczne uruchomienie zadania jako zakresu puli z poziomem podniesienia uprawnień administratora. Dzięki temu usługa Batch uruchamia zadanie jako katalog główny w kontekście kontenera. W przeciwnym razie użytkownik niebędący administratorem może nie mieć dostępu do tych folderów.
W przypadku pul kontenerów ze sprzętem z obsługą procesora GPU usługa Batch automatycznie włącza procesor GPU dla zadań kontenerów, więc nie należy dołączać argumentu
–gpus
.
Wiersz polecenia zadania kontenera
Po uruchomieniu zadania kontenera usługa Batch automatycznie używa polecenia docker create w celu utworzenia kontenera przy użyciu obrazu określonego w zadaniu. Następnie usługa Batch kontroluje wykonywanie zadań w kontenerze.
Podobnie jak w przypadku zadań podrzędnych usługi Batch innych niż kontenery, należy ustawić wiersz polecenia dla zadania kontenera. Ponieważ usługa Batch automatycznie tworzy kontener, wiersz polecenia określa tylko polecenie lub polecenia uruchamiane w kontenerze.
Poniżej przedstawiono domyślne zachowania usługi Batch dotyczące zadań kontenera platformy Docker:
- Usługa Batch uruchomi kontener z określonym wierszem polecenia zadania jako CMD.
- Usługa Batch nie zakłóca określonego punktu WEJŚCIA obrazu kontenera.
- Usługa Batch zastąpi usługę WORKDIR katalogiem roboczym zadania usługi Batch.
Upewnij się, że zapoznasz się z dokumentacją platformy Docker między programem ENTRYPOINT i CMD, aby zrozumieć efekty interakcji, które mogą wystąpić, gdy obrazy kontenerów mają określony punkt WEJŚCIAPOINT, a także określ wiersz polecenia zadania.
Jeśli chcesz zastąpić obraz kontenera ENTRYPOINT, możesz określić --entrypoint <args>
argument jako kontenerRunOption. Zapoznaj się z opcjonalnym elementem ContainerRunOptions , aby uzyskać argumenty, które można podać do polecenia używanego docker create
przez usługę Batch do utworzenia i uruchomienia kontenera. Aby na przykład ustawić katalog roboczy dla kontenera --workdir <directory>
, ustaw opcję .
Poniżej przedstawiono kilka przykładów obrazów kontenera i opcji kontenera usługi Batch lub wierszy poleceń zadań i ich efektu:
- Nie określono punktu wejścia obrazu kontenera, a wiersz polecenia zadania usługi Batch to "/bin/sh -c python myscript.py".
- Usługa Batch tworzy kontener z wierszem polecenia zadania usługi Batch określonymi i uruchamia go w katalogu roboczym zadania usługi Batch. Może to spowodować niepowodzenie, jeśli "myscript.py" nie znajduje się w katalogu roboczym zadania usługi Batch.
- Jeśli wiersz polecenia zadania został określony jako "/bin/sh -c python /path/to/script/myscript.py", to zadanie może działać poprawnie nawet z katalogiem roboczym ustawionym jako katalog roboczy zadania usługi Batch, jeśli wszystkie zależności skryptu są spełnione.
- Parametr ENTRYPOINT obrazu kontenera jest określony jako "./myscript.sh", a wiersz polecenia zadania usługi Batch jest pusty.
- Usługa Batch tworzy kontener oparty na programie ENTRYPOINT i uruchamia go w katalogu roboczym zadania usługi Batch. To zadanie może spowodować niepowodzenie, jeśli obraz kontenera WORKDIR nie jest taki sam jak katalog roboczy zadania usługi Batch, który jest zależny od różnych czynników, takich jak system operacyjny, identyfikator zadania, identyfikator zadania itp.
- Jeśli parametr "--workdir /path/to/script" został określony jako kontenerRunOption, to to zadanie może działać poprawnie, jeśli wszystkie zależności skryptu są spełnione.
- Nie określono punktu wejścia obrazu kontenera, wiersz polecenia zadania usługi Batch to "./myscript.sh", a element WORKDIR jest zastępowany w kontenerze ContainerRunOptions jako "--workdir /path/to/script".
- Usługa Batch tworzy kontener z katalogiem roboczym na "/path/to/script" i wykonaj wiersz polecenia "./myscript.sh", który zakończył się powodzeniem, ponieważ skrypt zostanie znaleziony w określonym katalogu roboczym.
Katalog roboczy zadania kontenera
Zadanie kontenera usługi Batch jest wykonywane w katalogu roboczym w kontenerze podobnym do katalogu skonfigurowanego przez usługę Batch dla zwykłego zadania (niekontenerowego). Ten katalog roboczy różni się od katalogu WORKDIR , jeśli został skonfigurowany na obrazie, lub domyślnym katalogiem roboczym kontenera (C:\
w kontenerze systemu Windows lub /
w kontenerze systemu Linux).
W przypadku zadania kontenera usługi Batch:
- Wszystkie katalogi cyklicznie poniżej
AZ_BATCH_NODE_ROOT_DIR
węzła hosta (katalog główny katalogów usługi Azure Batch) są mapowane do kontenera. - Wszystkie zmienne środowiskowe zadania są mapowane na kontener.
- Katalog
AZ_BATCH_TASK_WORKING_DIR
roboczy zadania w węźle jest ustawiony tak samo jak w przypadku zwykłego zadania i mapowany na kontener.
Ważne
W przypadku pul kontenerów systemu Windows w rodzinach maszyn wirtualnych z dyskami efemerycznym cały efemeryczny dysk jest mapowany na miejsce kontenera ze względu na ograniczenia kontenera systemu Windows.
Te mapowania umożliwiają pracę z zadaniami kontenera w taki sam sposób jak zadania inne niż kontenery. Na przykład zainstaluj aplikacje przy użyciu pakietów aplikacji, uzyskaj dostęp do plików zasobów z usługi Azure Storage, użyj ustawień środowiska zadań i utrwali pliki wyjściowe zadania po zatrzymaniu kontenera.
Niezależnie od tego, jak element WORKDIR jest ustawiany dla obrazu kontenera, zarówno stdout.txt
jak i stderr.txt
są przechwytywane w obiekcie AZ_BATCH_TASK_DIR
.
Rozwiązywanie problemów z zadaniami kontenera
Jeśli zadanie kontenera nie jest uruchamiane zgodnie z oczekiwaniami, może być konieczne uzyskanie informacji o konfiguracji WORKDIR lub ENTRYPOINT obrazu kontenera. Aby wyświetlić konfigurację, uruchom polecenie docker image inspect .
W razie potrzeby dostosuj ustawienia zadania kontenera na podstawie obrazu:
- Określ ścieżkę bezwzględną w wierszu polecenia zadania. Jeśli domyślny punkt ENTRYPOINT obrazu jest używany w wierszu polecenia zadania, upewnij się, że ustawiono ścieżkę bezwzględną.
- W opcjach uruchamiania kontenera zadania zmień katalog roboczy, aby był zgodny z elementem WORKDIR na obrazie. Na przykład ustaw wartość
--workdir /app
.
Przykłady zadań kontenera
Poniższy fragment kodu języka Python przedstawia podstawowy wiersz polecenia uruchomiony w kontenerze utworzonym na podstawie fikcyjnego obrazu pobranego z usługi Docker Hub. --rm
W tym miejscu opcja kontenera usuwa kontener po zakończeniu zadania, a --workdir
opcja ustawia katalog roboczy. Wiersz polecenia zastępuje kontener ENTRYPOINT prostym poleceniem powłoki, które zapisuje mały plik w katalogu roboczym zadania na hoście.
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
)
W poniższym przykładzie w języku C# przedstawiono podstawowe ustawienia kontenera dla zadania w chmurze:
// 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;
Następne kroki
- Aby uzyskać informacje na temat instalowania i używania platformy Docker CE w systemie Linux, zobacz dokumentację platformy Docker.
- Dowiedz się, jak utworzyć niestandardową pulę obrazów przy użyciu obrazu zarządzanego.
- Dowiedz się więcej o projekcie Moby — strukturze tworzenia systemów opartych na kontenerach.