Aracılığıyla paylaş


Kapsayıcı iş yüklerini çalıştırmak için Azure Batch kullanma

Azure Batch, Azure'da çok sayıda toplu işlem işini çalıştırmanıza ve ölçeklendirmenize olanak tanır. Batch görevleri bir Batch havuzundaki sanal makinelerde (düğümler) doğrudan çalıştırılabilir, ancak düğümlerdeki Docker uyumlu kapsayıcılarda görevleri çalıştırmak için bir Batch havuzu da ayarlayabilirsiniz. Bu makalede, kapsayıcı görevlerini çalıştırmayı destekleyen bir işlem düğümleri havuzu oluşturma ve ardından havuzda kapsayıcı görevlerini çalıştırma işlemleri açıklanmıştır.

Buradaki kod örneklerinde Batch .NET ve Python SDK'ları kullanılır. Kapsayıcı özellikli Batch havuzları oluşturmak ve kapsayıcı görevlerini çalıştırmak için Azure portalı da dahil olmak üzere diğer Batch SDK'larını ve araçlarını da kullanabilirsiniz.

Kapsayıcılar neden kullanılır?

Kapsayıcılar, uygulamaları çalıştırmak için ortamı ve bağımlılıkları yönetmek zorunda kalmadan Batch görevlerini çalıştırmak için kolay bir yol sağlar. Kapsayıcılar, uygulamaları birkaç farklı ortamda çalıştırabilen basit, taşınabilir, kendi kendine yeterli birimler olarak dağıtır. Örneğin, bir kapsayıcıyı yerel olarak derleyip test edin, ardından kapsayıcı görüntüsünü Azure'daki veya başka bir yerdeki bir kayıt defterine yükleyin. Kapsayıcı dağıtım modeli, uygulamanızın çalışma zamanı ortamının uygulamayı barındırdığınız her yerde her zaman doğru şekilde yüklenmesini ve yapılandırılmasını sağlar. Batch'teki kapsayıcı tabanlı görevler, uygulama paketleri ve kaynak dosyalarının ve çıkış dosyalarının yönetimi de dahil olmak üzere kapsayıcı olmayan görevlerin özelliklerinden de yararlanabilir.

Önkoşullar

Kapsayıcı kavramları ve Batch havuzu ve işi oluşturma hakkında bilgi sahibi olmanız gerekir.

  • SDK sürümleri: Batch SDK'ları aşağıdaki sürümlerden itibaren kapsayıcı görüntülerini destekler:

    • Batch REST API sürüm 2017-09-01.6.0
    • Batch .NET SDK sürüm 8.0.0
    • Batch Python SDK sürüm 4.0
    • Batch Java SDK sürüm 3.0
    • Batch Node.js SDK sürüm 3.0
  • Hesaplar: Azure aboneliğinizde bir Batch hesabı ve isteğe bağlı olarak bir Azure Depolama hesabı oluşturmanız gerekir.

  • Desteklenen bir sanal makine (VM) görüntüsü: Kapsayıcılar, desteklenen bir görüntüden (sonraki bölümde listelenmiştir) yalnızca Sanal Makine Yapılandırması ile oluşturulan havuzlarda desteklenir. Özel görüntü sağlarsanız, aşağıdaki bölümdeki önemli noktalara ve Özel görüntü havuzu oluşturmak için yönetilen görüntü kullanma bölümündeki gereksinimlere bakın.

Not

Batch SDK sürümlerinden:

  • Batch .NET SDK 16.0.0 sürümü
  • Batch Python SDK sürüm 14.0.0
  • Batch Java SDK sürüm 11.0.0
  • Batch Node.js SDK sürüm 11.0.0

Şu anda özelliğinin containerConfiguration geçirilmesini gerektirir Type ve desteklenen değerler şunlardır: ContainerType.DockerCompatible ve ContainerType.CriCompatible.

Aşağıdaki sınırlamaları göz önünde bulundurun:

  • Batch yalnızca Linux havuzlarında çalışan kapsayıcılar için uzaktan doğrudan bellek erişimi (RDMA) desteği sağlar.
  • Windows kapsayıcı iş yükleri için havuzunuz için çok çekirdekli bir VM boyutu seçmelisiniz.

Önemli

Docker, varsayılan olarak alt ağ belirtimiyle 172.17.0.0/16bir ağ köprüsü oluşturur. Havuzunuz için bir sanal ağ belirtiyorsanız, çakışan IP aralıkları olmadığından emin olun.

Desteklenen VM görüntüleri

Kapsayıcı iş yükleri için vm işlem düğümleri havuzu oluşturmak için aşağıdaki desteklenen Windows veya Linux görüntülerinden birini kullanın. Batch ile uyumlu Market görüntüleri hakkında daha fazla bilgi için Sanal makine görüntüleri listesine bakın.

Windows desteği

Batch, kapsayıcı desteği içeren Windows sunucu görüntülerini destekler. Batch'te desteklenen tüm görüntüleri listelemek için API, görüntü Docker kapsayıcılarını destekliyorsa bir DockerCompatible özelliği belirtir. Batch, Mirantis tarafından yayımlanan ve özelliği olarak DockerCompatiblebelirtilen görüntülere izin verir, ancak doğrudan desteklemez. Bu görüntüler yalnızca Kullanıcı Aboneliği havuzu ayırma modu Batch hesabı altında dağıtılabilir.

Ayrıca, Windows'ta kapsayıcı işlevselliğini etkinleştirmek için özel bir görüntü de oluşturabilirsiniz.

Not

Görüntü SKU'ları -with-containers veya -with-containers-smalldisk kullanımdan kaldırıldı. Ayrıntılar ve alternatif kapsayıcı çalışma zamanı seçenekleri için lütfen duyuruya bakın.

Linux desteği

Linux kapsayıcı iş yükleri için, özel bir görüntüye gerek kalmadan, şu anda Azure Marketplace'te yayımlanan aşağıdaki Linux görüntüleri Batch tarafından desteklenmektedir.

  • Yayınevi: microsoft-dsvm
    • Teklif: ubuntu-hpc
  • Yayınevi: almalinux
    • Teklif: 8-hpc-gen1
    • Teklif: 8-hpc-gen2

Alternatif görüntü seçenekleri

Şu anda, microsoft-azure-batch tarafından kapsayıcı iş yüklerini destekleyen başka görüntüler yayımlanmaktadır.

  • Yayınevi: microsoft-azure-batch
    • Teklif: ubuntu-server-container
    • Teklif: ubuntu-server-container-rdma (Infiniband ile yalnızca VM SKU'larında kullanım için)

Uyarı

microsoft-azure-batch tarafından yayımlananlar dışında başka görüntülerin kullanılması önerilir, çünkü bu görüntüler yakında ömrünü tamamlayacak olmasından dolayı kullanımdan kaldırılmıştır.

Notlar

Yukarıdaki görüntülerin docker veri kökü farklı yerlerdedir:

  • HPC görüntüsü veya microsoft-dsvm (Teklif: ubuntu-hpc, vb.) için Docker veri kökü, Docker varsayılanından değiştirilmez. Bu varsayılan, Linux'ta /var/lib/docker ve Windows üzerinde C:\ProgramData\Docker'dir. Bu klasörler işletim sistemi diskinde bulunur.

Batch tarafından yayımlanmayan görüntülerde, kapsayıcı görüntüleri indirilirken işletim sistemi diskinin hızla dolma riski vardır.

Müşteriler için olası çözümler

BatchExplorer'da havuz oluştururken başlangıç görevinde docker veri kökünü değiştirin. Aşağıda, Görevi Başlat komutunun bir örneği verilmiştir:

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

Bu görüntüler yalnızca Azure Batch havuzlarında kullanılmak üzere sunulur ve Docker kapsayıcılarının çalıştırılması için tasarlanmıştır. Bu özellikler:

  • Önceden yüklenmiş bir Docker uyumlu Moby kapsayıcı çalışma zamanı.
  • Azure N serisi VM'lerde dağıtımı kolaylaştırmak için önceden yüklenmiş NVIDIA GPU sürücüleri ve NVIDIA kapsayıcı çalışma zamanı bulunur.
  • son ekine -rdma sahip VM görüntüleri InfiniBand RDMA VM boyutları desteğiyle önceden yapılandırılır. Bu VM görüntüleri InfiniBand desteği olmayan VM boyutlarıyla kullanılmamalıdır.

Batch ile uyumlu Linux dağıtımlarından birinde Batch kapsayıcıları için uyumlu özel görüntüler de oluşturabilirsiniz. Özel görüntüde Docker desteği için, Docker veya Mirantis Container Runtime sürümü gibi uygun bir Docker uyumlu çalışma zamanını yükleyin. Yalnızca Docker-CLI uyumlu bir araç yüklemek yetersizdir; Docker Altyapısı uyumlu bir çalışma zamanı gereklidir.

Önemli

Ne Microsoft ne de Azure Batch Docker (herhangi bir sürüm veya sürüm), Mirantis Container Runtime veya Moby çalışma zamanlarıyla ilgili sorunlar için destek sağlamaz. Bu çalışma zamanlarını görüntülerinde kullanmayı seçen müşteriler, çalışma zamanı sorunları için destek sağlayan şirkete veya varlığa ulaşmalıdır.

Özel Linux görüntüsü kullanma konusunda dikkat edilmesi gereken diğer noktalar:

  • Özel görüntü kullanırken Azure N serisi boyutlarının GPU performansından yararlanmak için NVIDIA sürücülerini önceden yükleyin. Ayrıca, NVIDIA GPU'ları için Docker Engine Yardımcı Programı olan NVIDIA Docker'ı yüklemeniz gerekir.
  • Azure RDMA ağına erişmek için RDMA özellikli bir VM boyutu kullanın. Batch tarafından desteklenen CentOS HPC ve Ubuntu görüntülerine gerekli RDMA sürücüleri yüklenir. MPI iş yüklerini çalıştırmak için ek yapılandırma gerekebilir. Bkz Batch havuzunda RDMA veya GPU örneklerini kullanma.

Batch havuzu için konteyner yapılandırması

Bir Batch havuzunun kapsayıcı iş yüklerini çalıştırmasını sağlamak için havuzun VirtualMachineConfiguration nesnesinde ContainerConfiguration ayarlarını belirtmeniz gerekir. Bu makale, Batch .NET API başvurusuna ait bağlantıları vermektedir. İlgili ayarlar Batch Python API'sindedir.

Aşağıdaki örneklerde gösterildiği gibi, önceden yüklenmiş kapsayıcı imajlarla veya imajlar olmadan kapsayıcı destekli bir havuz oluşturabilirsiniz. Çekme (veya önceden yükleme) işlemi, Docker Hub'dan veya İnternet'te başka bir kapsayıcı kayıt defterinden kapsayıcı görüntülerini önceden yüklemenizi sağlar. En iyi performans için Batch hesabıyla aynı bölgede bir Azure Container Registry kullanın.

Kapsayıcı görüntülerini önceden oluşturmanın avantajı, görevler ilk kez çalışmaya başladığında kapsayıcı görüntüsünün indirilmesini beklemeleri gerekmeyecek olmasıdır. Kapsayıcı yapılandırması, havuz oluşturulduğunda kapsayıcı görüntülerini VM'lere çeker. Havuzda çalışan görevler daha sonra kapsayıcı görüntüleri ve kapsayıcı çalıştırma seçenekleri listesine referans alabilir.

Not

Docker Hub, görüntü çekme sayısını sınırlar. İş yükünüzün Docker Hub tabanlı görüntüler için yayımlanan hız sınırlarını aşmadığından emin olun. Azure Container Registry'nin doğrudan kullanılması veya ACR'de Yapıt önbelleğinden yararlanması önerilir.

Önceden oluşturulmuş kapsayıcı görüntüleri olmayan havuz

Kapsayıcı destekli bir havuzu, önceden yüklenmiş kapsayıcı görüntüleri olmadan yapılandırmak için, aşağıdaki örneklerde gösterildiği gibi ContainerConfiguration ve VirtualMachineConfiguration nesnelerini tanımlayın. Bu örneklerde Market'ten Azure Batch kapsayıcı havuzları için Ubuntu Sunucusu görüntüsü kullanılır.

Not: Örnekte kullanılan Ubuntu sunucu sürümü, çizim amaçlıdır. node_agent_sku_id'i kullandığınız sürümle değiştirmekten çekinmeyin.

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

Kapsayıcı yapılandırması için görüntüleri ön yükleme

Havuzdaki kapsayıcı görüntülerini önceden çekmek için kapsayıcı görüntülerinin listesini (container_image_names Python'da) ContainerConfiguration öğesine ekleyin.

Aşağıdaki temel Python örneğinde, Docker Hub'dan standart bir Ubuntu kapsayıcı görüntüsünün nasıl önceden derlenmiş olduğu gösterilmektedir.

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

Aşağıdaki C# örneği, Docker Hub'dan bir TensorFlow görüntüsünü önceden eklemek istediğinizi varsayar. Bu örnek, havuz düğümlerindeki VM ana bilgisayarında çalışan bir başlangıç görevi içerir. Örneğin, kapsayıcılardan erişilebilen bir dosya sunucusunu bağlamak için ana makinede başlangıç görevi çalıştırabilirsiniz.

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

Özel kapsayıcı kayıt defterinden görüntüleri önceden ekleme

Ayrıca, özel bir kapsayıcı kayıt defteri sunucusunda kimlik doğrulaması yaparak kapsayıcı görüntülerini önceden de oluşturabilirsiniz. Aşağıdaki örneklerde ContainerConfiguration ve VirtualMachineConfiguration nesneleri, özel bir Azure Container Registry'den özel bir TensorFlow görüntüsünü önceden yükler. Görüntü başvurusu, önceki örnektekiyle aynıdır.

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

ACR için yönetilen kimlik desteği

Azure Container Registry'de depolanan kapsayıcılara eriştiğinizde, hizmette kimlik doğrulaması yapmak için yönetilen kimlik kullanılabilir. Yönetilen kimlik kullanmak için önce kimliğin havuza atandığından ve kimliğin erişmek istediğiniz kapsayıcı kayıt defteri için atanmış role sahip AcrPull olduğundan emin olun. Ardından Batch'e ACR ile kimlik doğrulaması yaparken hangi kimliğin kullanılacağını belirtin.

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

Görev için kapsayıcı ayarları

Kapsayıcı etkinleştirilmiş bir havuzda kapsayıcı görevi çalıştırmak için kapsayıcıya özgü ayarları belirtin. Ayarlar; kullanılacak görüntüyü, kayıt defterini ve kapsayıcı çalıştırma seçeneklerini içerir.

  • Kapsayıcıya ContainerSettings özgü ayarları yapılandırmak için görev sınıflarının özelliğini kullanın. Bu ayarlar TaskContainerSettings sınıfı tarafından tanımlanır. Batch tarafından halledildiği için --rm kapsayıcı seçeneği başka bir --runtime seçenek gerektirmez.

  • Görevleri kapsayıcı görüntülerinde çalıştırırsanız, bulut görevi ve iş yöneticisi görevi kapsayıcı ayarları gerektirir. Ancak, başlangıç görevi, iş hazırlama görevi ve iş bırakma görevi kapsayıcı ayarları gerektirmez (başka bir ifadeyle, kapsayıcı bağlamında veya doğrudan düğümde çalıştırılabilir).

  • Linux için Batch, kullanıcı/grup iznini kapsayıcıyla eşler. Kapsayıcı içindeki herhangi bir klasöre erişim yönetici izni gerektiriyorsa, görevi yönetici yükseltme düzeyine sahip havuz kapsamı olarak çalıştırmanız gerekebilir. Bu, Batch'in görevi kapsayıcı bağlamında root kullanıcısı olarak çalıştırmasını sağlar. Aksi takdirde, yönetici olmayan bir kullanıcının bu klasörlere erişimi olmayabilir.

  • GPU özellikli donanıma sahip kapsayıcı havuzları için, Batch kapsayıcı görevleri için GPU'yu otomatik olarak etkinleştirir, bu yüzden –gpus bağımsız değişkenini dahil etmenize gerek yoktur.

Kapsayıcı görev komut satırı

Bir kapsayıcı görevi çalıştırdığınızda Batch, görevde belirtilen görüntüyü kullanarak kapsayıcı oluşturmak için otomatik olarak docker create komutunu kullanır. Batch daha sonra kapsayıcıda görev yürütmeyi denetler.

Kapsayıcı olmayan Batch görevlerde olduğu üzere, kapsayıcı görevi için bir komut satırı ayarlarsınız. Batch kapsayıcıyı otomatik olarak oluşturduğundan, komut satırı yalnızca kapsayıcıda çalışan komutu veya komutları belirtir.

Batch'in Docker kapsayıcı görevleri için geçerli olduğu varsayılan davranışlar şunlardır:

Kapsayıcı görüntülerinin belirli bir ENTRYPOINT'i olduğunda ve bir görev komut satırı belirttiğinizde ortaya çıkabilecek etkileşim etkilerini anlamak için ENTRYPOINT ile CMD arasındaki Docker belgelerini gözden geçirin.

Kapsayıcı görüntüsünün ENTRYPOINT'ini geçersiz kılmak istiyorsanız, --entrypoint <args> bağımsız değişkenini containerRunOption olarak belirtebilirsiniz. Batch'in kapsayıcıyı oluşturmak ve çalıştırmak için kullandığı komuta sağlayabileceğiniz bağımsız değişkenler için isteğe bağlı ContainerRunOptions'adocker create bakın. Örneğin, kapsayıcı için bir çalışma dizini ayarlamak için seçeneğini ayarlayın --workdir <directory> .

Kapsayıcı görüntüsüne ve Batch kapsayıcı seçeneklerine veya görev komut satırlarına ve bunların etkisine bazı örnekler aşağıda verilmiştir:

  • Kapsayıcı görüntüsü için ENTRYPOINT belirtilmemiş ve Batch görev komut satırında "/bin/sh -c python myscript.py" ifadesi yer alıyor.
    • Batch, belirtilen Batch görev komut satırıyla kapsayıcıyı oluşturur ve Batch görevi çalışma dizininde çalıştırır. Batch görevi çalışma dizininde "myscript.py" yoksa bu hataya neden olabilir.
    • Görev komut satırı "/bin/sh -c python /path/to/script/myscript.py" olarak belirtildiyse, betiğin tüm bağımlılıkları karşılanırsa, bu görev çalışma dizini olarak Batch görevi çalışma dizini olarak ayarlanmış olsa bile düzgün çalışabilir.
  • Kapsayıcı görüntüsü ENTRYPOINT "./myscript.sh" olarak belirtilir ve Batch görev komut satırı boş.
    • Batch, ENTRYPOINT'i kullanarak kapsayıcıyı oluşturur ve Batch göreviyle ilgili çalışma dizininde çalıştırır. WorkDIR kapsayıcı görüntüsü, işletim sistemi, iş kimliği, görev kimliği gibi çeşitli faktörlere bağımlı olan Batch görev çalışma diziniyle aynı değilse bu görev hataya neden olabilir.
    • "--workdir /path/to/script" bir containerRunOption olarak belirtildiyse, betiğin tüm bağımlılıkları karşılanırsa bu görev düzgün çalışabilir.
  • Kapsayıcı görüntüsü için ENTRYPOINT belirtilmemiş, Batch görevi komut satırı "./myscript.sh" şeklindedir ve WORKDIR, ContainerRunOptions içinde "--workdir /path/to/script" olarak değiştirilmiştir.
    • Batch, çalışma dizinini "/path/to/script" olarak ayarlayarak kapsayıcıyı oluşturur ve belirtilen çalışma dizininde bulunan betik nedeniyle başarılı olan "./myscript.sh" komut satırını çalıştırır.

Kapsayıcı görevi çalışma dizini

Batch kapsayıcı görevi, Batch'in normal (kapsayıcı olmayan) bir görev için ayarlamış olduğu dizine benzer bir kapsayıcıdaki çalışma dizininde yürütülür. Bu çalışma dizini, görüntüde veya varsayılan kapsayıcı çalışma dizininde (Windows kapsayıcısında veya C:\ Linux kapsayıcısında) yapılandırıldıysa WORKDIR'den / farklıdır.

Batch kapsayıcı görevi için:

  • Konak düğümünde AZ_BATCH_NODE_ROOT_DIR (Azure Batch dizinlerinin kökü) altındaki tüm dizinler özyinelemeli olarak kapsayıcıyla eşlenir.
  • Tüm görev ortamı değişkenleri kapsayıcıya eşlenir.
  • Düğümdeki görev çalışma dizini AZ_BATCH_TASK_WORKING_DIR , normal bir görevle aynı şekilde ayarlanır ve kapsayıcıya eşlenir.

Önemli

Kısa ömürlü diskleri olan VM ailelerindeki Windows kapsayıcı havuzları için kısa ömürlü diskin tamamı, Windows kapsayıcı sınırlamaları nedeniyle kapsayıcı alanına eşlenir.

Bu eşlemeler, kapsayıcı görevleriyle kapsayıcı dışı görevlerle aynı şekilde çalışmanıza olanak sağlar. Örneğin, uygulama paketlerini kullanarak uygulamaları yükleyin, Azure Depolama'dan kaynak dosyalarına erişin, görev ortamı ayarlarını kullanın ve kapsayıcı durduktan sonra görev çıktı dosyalarını kalıcı hale alın.

WORKDIR'in bir kapsayıcı görüntüsü için nasıl ayarlandığına bakılmaksızın, hem stdout.txt hem de stderr.txt içinde AZ_BATCH_TASK_DIR yakalanır.

Kapsayıcı görevleriyle ilgili sorunları giderme

Kapsayıcı göreviniz beklendiği gibi çalışmıyorsa, kapsayıcı görüntüsünün WORKDIR veya ENTRYPOINT yapılandırması hakkında bilgi almanız gerekebilir. Yapılandırmayı görmek için docker image inspect komutunu çalıştırın.

Gerekirse, kapsayıcı görevinin ayarlarını görüntüye göre ayarlayın:

  • Görev komut satırında mutlak bir yol belirtin. Görev komut satırı için görüntünün varsayılan ENTRYPOINT değeri kullanılıyorsa, mutlak bir yol ayarlandığından emin olun.
  • Görevin kapsayıcı çalıştırma seçeneklerinde, çalışma dizinini görüntüdeki WORKDIR ile eşleşecek şekilde değiştirin. Örneğin, ayarlayın --workdir /app.

Container (Kapsayıcı) Görevi Örnekleri

Aşağıdaki Python kod parçacığı, Docker Hub'dan çekilen kurgusal bir görüntüden oluşturulan bir kapsayıcıda çalışan temel bir komut satırını gösterir. Burada, --rm görev tamamlandıktan sonra kapsayıcı seçeneği kapsayıcıyı kaldırır ve --workdir seçeneği bir çalışma dizini ayarlar. Komut satırı, kapsayıcının ENTRYPOINT'ini ana bilgisayar üzerindeki görev dizinine küçük bir dosya yazan basit bir kabuk komutuyla geçersiz kılar.

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
)

Aşağıdaki C# örneği, bir bulut görevi için temel kapsayıcı ayarlarını gösterir:

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

Sonraki adımlar

  • Linux'ta Docker CE yükleme ve kullanma hakkında bilgi için Docker belgelerine bakın.
  • Özel görüntü havuzu oluşturmak için yönetilen görüntü kullanmayı öğrenin.
  • Kapsayıcı tabanlı sistemler oluşturmaya yönelik bir çerçeve olan Moby projesi hakkında daha fazla bilgi edinin.