Uruchamianie obciążeń kontenerów przy użyciu usługi Azure Batch

Uwaga

W tym artykule odwołuje się do systemu CentOS — dystrybucji systemu Linux, która zbliża się do stanu zakończenia życia (EOL). Rozważ odpowiednie użycie i planowanie. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące zakończenia życia systemu CentOS.

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

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: centos-container
    • Oferta: centos-container-rdma (Do użytku wyłącznie na jednostkach SKU maszyn wirtualnych za pomocą rozwiązania Infiniband)
    • Oferta: ubuntu-server-container
    • Oferta: ubuntu-server-container-rdma (Do użytku wyłącznie na jednostkach SKU maszyn wirtualnych za pomocą rozwiązania Infiniband)

Ważne

Zaleca się użycie obrazu maszyny microsoft-dsvmubuntu-hpc wirtualnej zamiast obrazów opublikowanych przez microsoft-azure-batchprogram . Ten obraz może być używany na dowolnej jednostce SKU maszyny wirtualnej.

Uwagi

Katalog główny danych platformy Docker powyższych obrazów znajduje się w różnych miejscach:

  • W przypadku opublikowanych microsoft-azure-batch obrazów usługi Azure Batch (oferta: centos-container-rdmaitp.) katalog główny danych platformy Docker jest mapowany na /mnt/batch/docker, który znajduje się na dysku tymczasowym.
  • W przypadku obrazu HPC lub microsoft-dsvm (Oferta: ubuntu-hpcitp.) 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.

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",
    userName: "UserName",
    password: "YourPassword"
);

// 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
container_registry = batch.models.ContainerRegistry(
        registry_server="myRegistry.azurecr.io",
        user_name="myUsername",
        password="myPassword")

# 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",
    userName: "myUserName",
    password: "myPassword");

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

W przypadku uzyskiwania dostępu do kontenerów przechowywanych w usłudze Azure Container Registry można użyć nazwy użytkownika/hasła lub tożsamości zarządzanej 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 uwzględnić 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ę TaskContainer Ustawienia. 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ń Administracja istratora, 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.

Jeśli obraz kontenera dla zadania usługi Batch jest skonfigurowany za pomocą skryptu ENTRYPOINT , możesz ustawić wiersz polecenia tak, aby używał domyślnego punktu WEJŚCIA LUB zastąpić go:

  • Aby użyć domyślnego punktu ENTRYPOINT obrazu kontenera, ustaw wiersz polecenia zadania na pusty ciąg "".

  • Aby zastąpić domyślny program ENTRYPOINT, dodaj --entrypoint argument na przykład: --entrypoint "/bin/sh - python"

  • Jeśli obraz nie ma punktu WEJŚCIA, ustaw wiersz polecenia odpowiedni dla kontenera, na przykład /app/myapp lub /bin/sh -c python myscript.py

Opcjonalne argumenty ContainerRunOptions to inne argumenty, których usługa Batch używa do docker create tworzenia i uruchamiania kontenera. Aby na przykład ustawić katalog roboczy dla kontenera --workdir <directory> , ustaw opcję . Aby uzyskać więcej opcji, zobacz dokumentację tworzenia platformy Docker.

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.

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.