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 sürüm 16.0.0
- 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/16
bir 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 bkz . Sanal makine görüntülerinin listesi.
Windows desteği
Batch, kapsayıcı desteği atamalarına sahip 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 DockerCompatible
belirtilen 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 Batch şu anda özel görüntüye gerek kalmadan Azure Market yayımlanan aşağıdaki Linux görüntülerini destekler.
- Yayınevi:
microsoft-dsvm
- Teklif:
ubuntu-hpc
- Teklif:
- Yayınevi:
almalinux
- Teklif:
8-hpc-gen1
- Teklif:
8-hpc-gen2
- Teklif:
Alternatif görüntü seçenekleri
Şu anda kapsayıcı iş yüklerini destekleyen başka görüntüler de microsoft-azure-batch
yayımlanmıştı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)
- Teklif:
Uyarı
Bu görüntüler yakın bir görüntü kullanımdan kaldırıldığından, tarafından microsoft-azure-batch
yayımlananlar dışındaki görüntülerin kullanılması önerilir.
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ü, Linux'ta /var/lib/docker ve Windows üzerinde C:\ProgramData\Docker olan Docker varsayılanı ile değiştirilmez. 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 doldurulma 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 desteklenir ve Docker kapsayıcısı yürütme için hazırlanı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ı.
- 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ı 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 kapsayıcı 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 makalede Batch .NET API başvurusunun bağlantıları sağlanır. İlgili ayarlar Batch Python API'sindedir.
Aşağıdaki örneklerde gösterildiği gibi önceden oluşturulmuş kapsayıcı görüntüleriyle veya olmadan kapsayıcı özellikli 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 kapsayıcı kayıt defteri 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 başvurabilir.
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ılı havuzu önceden oluşturulmuş kapsayıcı görüntüleri olmadan yapılandırmak için aşağıdaki örneklerde gösterildiği gibi ve VirtualMachineConfiguration
nesnelerini tanımlayınContainerConfiguration
. 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 kullandığınız sürümle değiştirebilirsiniz.
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 önceden ekleme
Havuzdaki kapsayıcı görüntülerini önceden eklemek için kapsayıcı görüntülerinin listesini (container_image_names
Python'da) öğesine ContainerConfiguration
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 konakta bir 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 ve VirtualMachineConfiguration
nesneleri, ContainerConfiguration
özel bir Azure kapsayıcı kayıt defterinden özel bir TensorFlow görüntüsünden öncesini oluşturur. 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.--rm
Batch tarafından halledildiği için 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 kök 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'nun otomatik olarak etkinleştirilmesini
–gpus
sağlar, bu nedenle bağımsız değişkeni dahil etmemeniz gerekir.
Kapsayıcı görevi 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 gibi, 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:
- Batch, kapsayıcıyı cmd olarak belirtilen görev komut satırıyla çalıştırır.
- Batch, kapsayıcı görüntüsünün belirtilen ENTRYPOINT'ini engellemez.
- Batch, WORKDIR'i Batch görevi çalışma diziniyle geçersiz kılar.
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.
ENTRYPOINT kapsayıcı görüntüsünü geçersiz kılmak isterseniz bağımsız değişkenini --entrypoint <args>
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'a docker 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ü ENTRYPOINT belirtilmemiş ve Batch görev komut satırı "/bin/sh -c python myscript.py".
- 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 kullanan kapsayıcıyı oluşturur ve Batch görevi ç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ü ENTRYPOINT belirtilmemiş, Batch görev komut satırı "./myscript.sh" ve WORKDIR, ContainerRunOptions içinde "--workdir /path/to/script" olarak geçersiz kılınır.
- Batch, "/path/to/script" çalışma diziniyle kapsayıcıyı oluşturur ve betik belirtilen çalışma dizininde bulunduğundan başarılı olan "./myscript.sh" komut satırını yürütü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 (C:\
Windows kapsayıcısında veya /
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 hem stderr.txt
de stdout.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
.
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ı ENTRYPOINT'ini konak üzerindeki görev çalışma 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.