استخدام Azure Batch لتشغيل أحمال عمل الحاوية

يتيح لك Azure Batch تشغيل عدد كبير من مهام الحوسبة الدُفعية وتوسيع نطاقها على Azure. يمكن تشغيل المهام المجمعة مباشرة على الأجهزة الظاهرية (العقد) في مجموعة الدُفعات، ولكن يمكنك أيضاً إعداد مجموعة مجمعة لتشغيل المهام في الحاويات المتوافقة مع Docker على العقد. توضح هذه المقالة كيفية إنشاء تجمع من عقد الحوسبة التي تدعم تشغيل مهام الحاوية، ثم تشغيل مهام الحاوية على التجمع.

تستخدم أمثلة التعليمة البرمجية هنا Batch .NET وPython SDKs. يمكنك أيضاً استخدام Batch SDKs وأدوات أخرى، بما في ذلك مدخل Microsoft Azure، لإنشاء تجمعات دُفعية ممكّنة للحاويات ولتشغيل مهام الحاوية.

لماذا تستخدم الحاويات؟

توفر الحاويات طريقة سهلة لتشغيل مهام Batch دون الحاجة إلى إدارة بيئة وتبعيات لتشغيل التطبيقات. تتوزيع الحاويات التطبيقات بوصفها وحدات خفيفة الوزن ومحمولة ومكتفية ذاتيًا يمكن تشغيلها في عدة بيئات مختلفة. على سبيل المثال، إنشاء حاوية واختبارها محلياً، ثم تحميل صورة الحاوية إلى سجل في Azure أو في أي مكان آخر. يضمن نموذج نشر الحاوية أن بيئة وقت تشغيل تطبيقك يتم تثبيتها وتكوينها دائماَ بشكل صحيح أينما تستضيف التطبيق. يمكن أيضًا أن تستفيد المهام المستندة إلى الحاوية في Batch من ميزات المهام غير المستندة إلى الحاوية، بما في ذلك حزم التطبيقات وإدارة ملفات الموارد وملفات الإخراج.

المتطلبات الأساسية

يجب أن تكون على دراية بمفاهيم الحاوية وكيفية إنشاء تجمع دُفعي ووظيفة دُفعية.

  • إصدارات SDK: تدعم Batch SDKs صور الحاوية اعتباراً من الإصدارات التالية:

    • Batch REST API الإصدار 2017-09-01.6.0
    • Batch .NET SDK الإصدار 8.0.0
    • Batch Python SDK الإصدار 4.0
    • Batch Java SDK الإصدار 3.0
    • Batch Node.js SDK الإصدار 3.0
  • الحسابات: في اشتراك Azure، تحتاج إلى إنشاء حساب Batch وحساب Azure Storage اختيارياً.

  • صورة الجهاز الظاهري (VM) المدعومة: يتم دعم الحاويات فقط في التجمعات التي تم إنشاؤها باستخدام تكوين الجهاز الظاهري، من صورة مدعومة (مدرجة في القسم التالي). إذا قمت بتوفير صورة مخصصة، فشاهد الاعتبارات في القسم التالي والمتطلبات في استخدام صورة مدارة لإنشاء تجمع صور مخصص.

إشعار

من إصدارات Batch SDK:

  • Batch .NET SDK الإصدار 16.0.0
  • Batch Python SDK الإصدار 14.0.0
  • Batch Java SDK الإصدار 11.0.0
  • إصدار Batch Node.js SDK 11.0.0

حاليا، containerConfiguration يتطلب Type الأمر تمرير الخاصية والقيم المدعومة هي: ContainerType.DockerCompatible و ContainerType.CriCompatible.

ضع في اعتبارك القيود التالية:

  • يوفر Batch دعم الوصول المباشر للذاكرة عن بعد (RDMA) فقط للحاويات التي تعمل على تجمعات Linux.
  • بالنسبة لأحمال عمل حاوية Windows، يجب عليك اختيار حجم جهاز ظاهري متعدد النوى لتجمعك.

هام

يقوم Docker، بشكل افتراضي، بإنشاء جسر شبكة مع مواصفات شبكة فرعية من 172.17.0.0/16. إذا كنت تحدد شبكة ظاهرية لتجمعك، فتأكد من عدم وجود نطاقات IP متعارضة.

صور الأجهزة الظاهرية المدعومة

استخدم إحدى صور Windows أو Linux المدعومة التالية لإنشاء مجموعة من عُقد حوسبة الجهاز الظاهري لأحمال عمل الحاوية. لمزيد من المعلومات حول صور Marketplace المتوافقة مع Batch، راجع قائمة صور الجهاز الظاهري.

دعم Windows

تدعم Batch صور خادم Windows التي تحتوي على تعيينات دعم الحاوية. تشير واجهة برمجة التطبيقات لسرد جميع الصور المدعومة في Batch إلى DockerCompatible إمكانية إذا كانت الصورة تدعم حاويات Docker. تسمح Batch، ولكنها لا تدعم مباشرة، الصور التي نشرتها Mirantis مع إمكانية تمت الإشارة إلى أنها DockerCompatible. قد يتم نشر هذه الصور فقط ضمن حساب Batch لوضع تخصيص تجمع اشتراك المستخدم.

يمكنك أيضا إنشاء صورة مخصصة لتمكين وظائف الحاوية على Windows.

إشعار

وحدات SKU -with-containers للصورة أو -with-containers-smalldisk متوقفة. يرجى الاطلاع على الإعلان للحصول على التفاصيل وخيارات وقت تشغيل الحاوية البديلة.

دعم Linux

بالنسبة لأحمال عمل حاوية Linux، يدعم Batch حاليا صور Linux التالية المنشورة في Azure Marketplace دون الحاجة إلى صورة مخصصة.

  • الناشر: microsoft-dsvm
    • عرض: ubuntu-hpc
  • الناشر: almalinux
    • عرض: 8-hpc-gen1
    • عرض: 8-hpc-gen2

خيارات الصورة البديلة

حاليا هناك صور أخرى نشرتها microsoft-azure-batch تلك تدعم أحمال عمل الحاوية:

  • الناشر: microsoft-azure-batch
    • عرض: ubuntu-server-container
    • العرض: ubuntu-server-container-rdma (للاستخدام حصريا على وحدات SKU للجهاز الظاهري مع Infiniband)

تحذير

يوصى باستخدام صور أخرى غير تلك التي تم نشرها بواسطة microsoft-azure-batch حيث يتم إهمال هذه الصور بسبب نهاية العمر الافتراضي للصورة الوشيكة.

ملاحظات

يكمن جذر بيانات docker للصور أعلاه في أماكن مختلفة:

  • بالنسبة لصورة HPC، أو microsoft-dsvm (العرض: ubuntu-hpc، وما إلى ذلك)، لم يتغير جذر بيانات docker من الوضع الافتراضي Docker، وهو /var/lib/docker على Linux وC :\ProgramData\Docker على Windows. توجد هذه المجلدات على قرص نظام التشغيل.

بالنسبة للصور المنشورة غير المجمعة، يكون لقرص نظام التشغيل خطر محتمل لملئه بسرعة أثناء تنزيل صور الحاوية.

الحلول المحتملة للعملاء

تغيير جذر بيانات docker في مهمة بدء عند إنشاء تجمع في BatchExplorer. فيما يلي مثال على أمر بدء المهمة:

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

هذه الصور مدعومة فقط للاستخدام في تجمعات Azure Batch وهي مُعدة لتنفيذ حاوية Docker. وهي تتميز بما يلي:

  • وقت تشغيل حاوية Moby متوافق مع Docker مثبت مسبقا.
  • برامج تشغيل NVIDIA GPU المثبتة مسبقا ووقت تشغيل حاوية NVIDIA، لتبسيط النشر على أجهزة Azure N-series الظاهرية.
  • يتم تكوين صور الجهاز الظاهري مع لاحقة -rdma مسبقا مع دعم أحجام InfiniBand RDMA VM. لا ينبغي استخدام صور الجهاز الظاهري هذه مع أحجام الأجهزة الظاهرية التي لا تحتوي على دعم InfiniBand.

يمكنك أيضا إنشاء صور مخصصة متوافقة مع حاويات Batch على أحد توزيعات Linux المتوافقة مع Batch. للحصول على دعم Docker على صورة مخصصة، قم بتثبيت وقت تشغيل مناسب متوافق مع Docker، مثل إصدار Docker أو Mirantis Container Runtime. تثبيت أداة متوافقة مع Docker-CLI فقط غير كاف؛ مطلوب وقت تشغيل متوافق مع Docker Engine.

هام

لن توفر Microsoft أو Azure Batch الدعم للمشكلات المتعلقة ب Docker (أي إصدار أو إصدار) أو وقت تشغيل حاوية Mirantis أو أوقات تشغيل Moby. يجب على العملاء الذين يختارون استخدام أوقات التشغيل هذه في صورهم التواصل مع الشركة أو الكيان الذي يوفر الدعم لمشكلات وقت التشغيل.

مزيد من الاعتبارات لاستخدام صورة Linux مخصصة:

  • للاستفادة من أداء GPU لأحجام Azure N-series عند استخدام صورة مخصصة، قم بتثبيت برامج تشغيل NVIDIA مسبقاً. تحتاج أيضاً إلى تثبيت Docker Engine Utility لـ NVIDIA GPUs، NVIDIA Docker.
  • للوصول إلى شبكة RDMA Azure، استخدم حجم VM مؤهل لـ RDMA. يتم تثبيت برامج تشغيل RDMA الضرورية في صور CentOS HPC وUbuntu التي تدعمها Batch. قد تكون هناك حاجة إلى تكوين إضافي لتشغيل أحمال عمل MPI. راجع استخدام مثيلات RDMA أو GPU في تجمع الدفعات.

تكوين الحاوية لتجمع Batch

لتمكين تجمع Batch لتشغيل أحمال عمل الحاوية، يجب عليك تحديد إعدادات ContainerConfiguration في كائن VirtualMachineConfiguration الخاص بالتجمع. توفر هذه المقالة ارتباطات إلى مرجع Batch .NET API. الإعدادات المقابلة موجودة في واجهة برمجة تطبيقات Batch Python .

يمكنك إنشاء تجمع مع تمكين حاوية مع أو بدون صور حاوية تم جلبها مسبقاً، كما هو موضح في الأمثلة التالية. تتيح لك عملية السحب (أو الإحضار المسبق) تحميل صور الحاوية مسبقا من Docker Hub أو سجل حاوية آخر على الإنترنت. للحصول على أفضل أداء، استخدم سجل حاويات Azure في نفس منطقة حساب Batch.

تتمثل ميزة الجلب المسبق لصور الحاوية في أنه عند بدء تشغيل المهام لأول مرة، لا يتعين عليهم انتظار تنزيل صورة الحاوية. يسحب تكوين الحاوية صور الحاوية إلى الأجهزة الظاهرية عند إنشاء التجمع. يمكن للمهام التي يجري تشغيلها في التجمع الرجوع إلى قائمة صور الحاوية وخيارات تشغيل الحاوية.

إشعار

يحدد Docker Hub عدد عمليات سحب الصور. تأكد من أن حمل العمل الخاص بك لا يتجاوز حدود المعدل المنشور للصور المستندة إلى Docker Hub. يوصى باستخدام Azure Container Registry مباشرة أو الاستفادة من ذاكرة التخزين المؤقت Artifact في ACR.

تجمع دون صور حاوية مسبقة الجلب

لتكوين تجمع مع تمكين الحاوية دون صور حاوية مسبقة الجلب، حدد الكائنات ContainerConfiguration وVirtualMachineConfiguration كما هو موضح في الأمثلة التالية. تستخدم هذه الأمثلة صورة Ubuntu Server لصورة تجمعات حاويات Azure Batch من Marketplace.

ملاحظة: إصدار خادم Ubuntu الذي يُستخدم في المثال لأغراض التوضيح. لا تتردد في تغيير node_agent_sku_id إلى الإصدار الذي تستخدمه.

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

صور الجلب المُسبق لتكوين الحاوية

لإحضار صور الحاوية مسبقا على التجمع، أضف قائمة صور الحاوية (container_image_names في Python) إلى ContainerConfiguration.

يوضح مثال Python الأساسي التالي كيفية الجلب المسبق لصورة حاوية Ubuntu قياسية من 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)
...

يفترض مثال C# التالي أنك تريد جلب صورة TensorFlow مسبقاً من Docker Hub. يتضمن هذا المثال مهمة بدء يتم تشغيلها في مضيف VM على عُقد التجمع. قد تقوم بتشغيل مهمة البدء في المضيف، على سبيل المثال، لتحميل خادم ملفات يمكن الوصول إليه من الحاويات.

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

الجلب المسبق للصور من سجل حاويات خاص

يمكنك أيضاً جلب صور الحاوية مسبقاً عن طريق المصادقة على خادم سجل الحاوية الخاص. في الأمثلة التالية، يجلب الكائنان ContainerConfiguration وVirtualMachineConfiguration صورة TensorFlow الخاصة مسبقاً من سجل حاوية Azure خاص. مرجع الصورة هو نفسه كما في المثال السابق.

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

عند الوصول إلى الحاويات المخزنة في Azure Container Registry، يمكن استخدام هوية مدارة للمصادقة مع الخدمة. لاستخدام هوية مدارة، تأكد أولاً من تعيين الهوية إلى التجمع وأن الهوية لها الدور AcrPull المعين لسجل الحاوية الذي ترغب في الوصول إليه. بعد ذلك، ارشد Batch إلى الهوية التي يجب استخدامها عند المصادقة مع 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);
...

إعدادات الحاوية للمهمة

لتشغيل مهمة حاوية على تجمع مع تمكين حاوية، حدد إعدادات خاصة بالحاويات. تتضمن الإعدادات الصورة المراد استخدامها، والسجل، وخيارات تشغيل الحاوية.

  • استخدم خاصية ContainerSettings لفئات المهام لتكوين الإعدادات الخاصة بالحاويات. يتم تعريف هذه الإعدادات بواسطة الفئة TaskContainerSettings. --rm لا يتطلب خيار الحاوية خيارا آخر --runtime نظرا لأنه يتم الاهتمام به بواسطة Batch.

  • إذا قمت بتشغيل المهام على صور الحاوية، فإن مهمة السحابة ومهمة مدير الوظائف تتطلب إعدادات الحاوية. ومع ذلك، لا تتطلب مهمة البدء ومهمة إعداد الوظيفة ومهمة إصدار الوظيفة إعدادات الحاوية (أي يمكن تشغيلها ضمن سياق حاوية أو مباشرة على العقدة).

  • بالنسبة إلى Linux، يقوم Batch بتعيين إذن المستخدم/المجموعة إلى الحاوية. إذا كان الوصول إلى أي مجلد داخل الحاوية يتطلب إذن المسؤول، قد تحتاج إلى تشغيل المهمة كنطاق تجمع مع مستوى رفع الامتيازات الخاص بالمسؤول. يضمن هذا تشغيل Batch للمهمة كجذر في سياق الحاوية. وإلا، فقد لا يكون لدى المستخدم غير المسؤول حق الوصول إلى هذه المجلدات.

  • بالنسبة إلى تجمعات الحاويات مع الأجهزة التي تدعم وحدة معالجة الرسومات، يقوم Batch تلقائيا بتمكين وحدة معالجة الرسومات لمهام الحاوية، لذلك يجب عدم تضمين الوسيطة –gpus .

سطر أوامر مهمة الحاوية

عند تشغيل مهمة حاوية، يستخدم Batch الأمر docker create تلقائياً لإنشاء حاوية باستخدام الصورة المحددة في المهمة. ثم تتحكم Batch في تنفيذ المهمة في الحاوية.

كما هو الحال مع مهام Batch دون حاوية، يمكنك تعيين سطر أوامر لمهمة حاوية. نظرا لأن Batch ينشئ الحاوية تلقائيا، يحدد سطر الأوامر فقط الأمر أو الأوامر التي يتم تشغيلها في الحاوية.

فيما يلي السلوكيات الافتراضية التي ينطبق عليها Batch على مهام حاوية Docker:

تأكد من مراجعة وثائق Docker بين ENTRYPOINT وCMD حتى تفهم تأثيرات التفاعل التي يمكن أن تنشأ عندما تحتوي صور الحاوية على ENTRYPOINT محدد، كما تحدد سطر أوامر مهمة.

إذا كنت ترغب في تجاوز صورة الحاوية ENTRYPOINT، يمكنك تحديد الوسيطة --entrypoint <args> ك containerRunOption. راجع ContainerRunOptions الاختيارية للوسيطات التي يمكنك توفيرها للأمر docker create الذي يستخدمه Batch لإنشاء الحاوية وتشغيلها. على سبيل المثال، لتعيين دليل عمل للحاوية، قم بتعيين الخيار --workdir <directory>.

فيما يلي بعض الأمثلة على صورة الحاوية وخيارات حاوية Batch أو أسطر أوامر المهمة وتأثيرها:

  • لم يتم تحديد ENTRYPOINT لصورة الحاوية، وشريط أوامر مهمة Batch هو "/bin/sh -c python myscript.py".
    • تقوم Batch بإنشاء الحاوية باستخدام سطر الأوامر Batch task كما هو محدد وتشغيلها في دليل عمل مهمة Batch. قد يؤدي هذا إلى فشل إذا لم يكن "myscript.py" في دليل عمل مهمة Batch.
    • إذا تم تحديد سطر أوامر المهمة على أنه "/bin/sh -c python /path/to/script/myscript.py"، فقد تعمل هذه المهمة بشكل صحيح حتى مع مجموعة دليل العمل كدليل عمل مهمة الدفعات إذا تم استيفاء كافة التبعيات للبرنامج النصي.
  • يتم تحديد ENTRYPOINT لصورة الحاوية على أنه "./myscript.sh"، و سطر أوامر مهمة Batch فارغ.
    • تقوم Batch بإنشاء الحاوية اعتمادا على ENTRYPOINT وتشغيلها في دليل عمل مهمة الدفعة. قد تؤدي هذه المهمة إلى فشل إذا لم تكن صورة الحاوية WORKDIR هي نفسها دليل عمل مهمة Batch، والتي تعتمد على عوامل مختلفة مثل نظام التشغيل ومعرف الوظيفة ومعرف المهمة وما إلى ذلك.
    • إذا تم تحديد "--workdir /path/to/script" ك containerRunOption، فقد تعمل هذه المهمة بشكل صحيح إذا تم استيفاء كافة التبعيات للبرنامج النصي.
  • لم يتم تحديد ENTRYPOINT لصورة الحاوية، سطر أوامر مهمة Batch هو "./myscript.sh"، ويتم تجاوز WORKDIR في ContainerRunOptions ك "--workdir /path/to/script".
    • تقوم Batch بإنشاء الحاوية مع دليل العمل إلى "/path/to/script" وتنفيذ سطر الأوامر "./myscript.sh"، وهو ناجح حيث تم العثور على البرنامج النصي في دليل العمل المحدد.

دليل عمل مهمة الحاوية

يتم تنفيذ مهمة حاوية Batch في دليل عمل في الحاوية مشابهة للدليل الذي تقوم Batch بإعداده لمهمة عادية (غير حاوية). يختلف دليل العمل هذا عن WORKDIR إذا تم تكوينه في الصورة، أو دليل عمل الحاوية الافتراضي (C:\ على حاوية Windows، أو / على حاوية Linux).

لمهمة حاوية Batch:

  • يتم تعيين جميع الدلائل بشكل متكرر أسفل AZ_BATCH_NODE_ROOT_DIR على العقدة المضيفة (جذر دلائل Azure Batch) في الحاوية.
  • يتم تعيين كافة متغيرات بيئة المهمة في الحاوية.
  • يتم تعيين دليل عمل المهمة AZ_BATCH_TASK_WORKING_DIR على العقدة كما هو لمهمة عادية ويتم تعيينه في الحاوية.

هام

بالنسبة لتجمعات حاويات Windows على عائلات الأجهزة الظاهرية ذات الأقراص سريعة الزوال، يتم تعيين القرص المؤقت بالكامل إلى مساحة الحاوية بسبب قيود حاوية Windows.

تسمح لك هذه التعيينات بالعمل مع مهام الحاوية بنفس الطريقة التي تعمل بها المهام دون حاوية. على سبيل المثال، تثبيت التطبيقات باستخدام حزم التطبيقات، والوصول إلى ملفات الموارد من Azure Storage، واستخدام إعدادات بيئة المهام، واستمرار ملفات إخراج المهام بعد توقف الحاوية.

بغض النظر عن كيفية تعيين WORKDIR لصورة حاوية، يتم التقاط كل stdout.txt من و stderr.txt في AZ_BATCH_TASK_DIR.

استكشاف أخطاء مهام الحاوية وإصلاحها

في حال عدم تشغيل مهمة الحاوية كما هو متوقع، فقد تحتاج إلى الحصول على معلومات حول تكوين WORKDIR أو ENTRYPOINT لصورة الحاوية. لمشاهدة التكوين، قم بتشغيل الأمر فحص صور docker.

إذا لزم الأمر، قم بضبط إعدادات مهمة الحاوية استناداً إلى الصورة:

  • حدد مساراً مطلقاً في سطر أوامر المهمة. إذا تم استخدام ENTRYPOINT الافتراضي للصورة لسطر أوامر المهمة، تأكد من تعيين مسار مطلق.
  • في خيارات تشغيل حاوية المهمة، قم بتغيير دليل العمل لمطابقة WORKDIR في الصورة. على سبيل المثال، تعيين --workdir /app.

أمثلة على مهمة الحاوية

تظهر قصاصة Python التالية سطر أوامر أساسي قيد التشغيل في حاوية تم إنشاؤها من صورة وهمية مسحوبة من Docker Hub. هنا، يزيل خيار الحاوية --rm الحاوية بعد انتهاء المهمة، ويعين الخيار --workdir دليل عمل. يتجاوز سطر الأوامر حاوية ENTRYPOINT مع أمر shell بسيط يكتب ملف صغير إلى دليل عمل المهمة على المضيف.

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
)

يوضح مثال C# التالي إعدادات الحاوية الأساسية لمهمة السحابة:

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

الخطوات التالية