適用於 Python 的 Azure 容器執行個體程式庫Azure Container Instances libraries for Python

使用適用於 Python 的 Microsoft Azure 容器執行個體程式庫,來建立和管理 Azure 容器執行個體。Use the Microsoft Azure Container Instances libraries for Python to create and manage Azure container instances. 如需詳細資訊,請參閱 Azure 容器執行個體概觀Learn more by reading the Azure Container Instances overview.

管理 APIManagement APIs

使用管理程式庫來建立和管理 Azure 中的 Azure 容器執行個體。Use the management library to create and manage Azure container instances in Azure.

透過 pip 安裝管理套件:Install the management package via pip:

pip install azure-mgmt-containerinstance

範例來源Example source

如果您想要查看下列程式碼範例在相關情境中的應用,您可以在下列 GitHub 存放庫中找到這些範例:If you'd like to see the following code examples in context, you can find them in the following GitHub repository:

Azure-Samples/aci-docs-sample-pythonAzure-Samples/aci-docs-sample-python

AuthenticationAuthentication

驗證 SDK 用戶端 (如下列範例中的 Azure 容器執行個體與資源管理員用戶端) 最簡單的方式之一是使用檔案式驗證One of the easiest ways to authenticate SDK clients (like the Azure Container Instances and Resource Manager clients in the following example) is with file-based authentication. 檔案式驗證會查詢 AZURE_AUTH_LOCATION 環境變數,以取得認證檔案的路徑。File-based authentication queries the AZURE_AUTH_LOCATION environment variable for the path to a credentials file. 若要使用檔案式驗證:To use file-based authentication:

  1. 使用 Azure CLICloud Shell 建立認證檔案:Create a credentials file with the Azure CLI or Cloud Shell:

    az ad sp create-for-rbac --sdk-auth > my.azureauth

    如果您使用 Cloud Shell 產生認證檔案,請將其內容複製到 Python 應用程式可以存取的本機檔案中。If you use the Cloud Shell to generate the credentials file, copy its contents into a local file that your Python application can access.

  2. AZURE_AUTH_LOCATION 環境變數設定為所產生認證檔案的完整路徑。Set the AZURE_AUTH_LOCATION environment variable to the full path of the generated credentials file. 例如 (在 Bash 中):For example (in Bash):

    export AZURE_AUTH_LOCATION=/home/yourusername/my.azureauth
    

一旦您建立了認證檔案,並填入 AZURE_AUTH_LOCATION 環境變數後,請使用 client_factorymodule to initialize the ResourceManagementClientContainerInstanceManagementClient 物件的 get_client_from_auth_file 方法。Once you've created the credentials file and populated the AZURE_AUTH_LOCATION environment variable, use the get_client_from_auth_file method of the client_factory module to initialize the ResourceManagementClient and ContainerInstanceManagementClient objects.

# Authenticate the management clients with Azure.
# Set the AZURE_AUTH_LOCATION environment variable to the full path to an
# auth file. Generate an auth file with the Azure CLI or Cloud Shell:
# az ad sp create-for-rbac --sdk-auth > my.azureauth
auth_file_path = getenv('AZURE_AUTH_LOCATION', None)
if auth_file_path is not None:
    print("Authenticating with Azure using credentials in file at {0}"
          .format(auth_file_path))

    aciclient = get_client_from_auth_file(ContainerInstanceManagementClient)
    resclient = get_client_from_auth_file(ResourceManagementClient)
else:
    print("\nFailed to authenticate to Azure. Have you set the"
          " AZURE_AUTH_LOCATION environment variable?\n")

若要深入了解 Azure 的 Python 管理程式庫中有哪些可用驗證方法,請參閱使用適用於 Python 的 Azure 管理程式庫來進行驗證For more details about the available authentication methods in the Python management libraries for Azure, see Authenticate with the Azure Management Libraries for Python.

建立容器群組 - 單一容器Create container group - single container

此範例會建立一個容器群組搭配單一容器This example creates a container group with a single container

def create_container_group(aci_client, resource_group,
                           container_group_name, container_image_name):
    """Creates a container group with a single container.

    Arguments:
        aci_client {azure.mgmt.containerinstance.ContainerInstanceManagementClient}
                    -- An authenticated container instance management client.
        resource_group {azure.mgmt.resource.resources.models.ResourceGroup}
                    -- The resource group in which to create the container group.
        container_group_name {str}
                    -- The name of the container group to create.
        container_image_name {str}
                    -- The container image name and tag, for example:
                       microsoft\aci-helloworld:latest
    """
    print("Creating container group '{0}'...".format(container_group_name))

    # Configure the container
    container_resource_requests = ResourceRequests(memory_in_gb=1, cpu=1.0)
    container_resource_requirements = ResourceRequirements(
                                        requests=container_resource_requests)
    container = Container(name=container_group_name,
                          image=container_image_name,
                          resources=container_resource_requirements,
                          ports=[ContainerPort(port=80)])

    # Configure the container group
    ports = [Port(protocol=ContainerGroupNetworkProtocol.tcp, port=80)]
    group_ip_address = IpAddress(ports=ports,
                                 dns_name_label=container_group_name,
                                 type="Public")
    group = ContainerGroup(location=resource_group.location,
                           containers=[container],
                           os_type=OperatingSystemTypes.linux,
                           ip_address=group_ip_address)

    # Create the container group
    aci_client.container_groups.create_or_update(resource_group.name,
                                                 container_group_name,
                                                 group)

    # Get the created container group
    container_group = aci_client.container_groups.get(resource_group.name,
                                                      container_group_name)

    print("Once DNS has propagated, container group '{0}' will be reachable at"
          " http://{1}".format(container_group_name,
                               container_group.ip_address.fqdn))

建立容器群組 - 多個容器Create container group - multiple containers

此範例會建立一個容器群組搭配兩個容器:分別是應用程式容器和側車容器。This example creates a container group with two containers: an application container and a sidecar container.

def create_container_group_multi(aci_client, resource_group,
                                 container_group_name,
                                 container_image_1, container_image_2):
    """Creates a container group with two containers in the specified
       resource group.

    Arguments:
        aci_client {azure.mgmt.containerinstance.ContainerInstanceManagementClient}
                    -- An authenticated container instance management client.
        resource_group {azure.mgmt.resource.resources.models.ResourceGroup}
                    -- The resource group in which to create the container group.
        container_group_name {str}
                    -- The name of the container group to create.
        container_image_1 {str}
                    -- The first container image name and tag, for example:
                       microsoft\aci-helloworld:latest
        container_image_2 {str}
                    -- The second container image name and tag, for example:
                       microsoft\aci-tutorial-sidecar:latest
    """
    print("Creating container group '{0}'...".format(container_group_name))

    # Configure the containers
    container_resource_requests = ResourceRequests(memory_in_gb=2, cpu=1.0)
    container_resource_requirements = ResourceRequirements(requests=container_resource_requests)

    container_1 = Container(name=container_group_name + '-1',
                            image=container_image_1,
                            resources=container_resource_requirements,
                            ports=[ContainerPort(port=80)])

    container_2 = Container(name=container_group_name + '-2',
                            image=container_image_2,
                            resources=container_resource_requirements)

    # Configure the container group
    ports = [Port(protocol=ContainerGroupNetworkProtocol.tcp, port=80)]
    group_ip_address = IpAddress(ports=ports, dns_name_label=container_group_name, type='Public')
    group = ContainerGroup(location=resource_group.location,
                           containers=[container_1, container_2],
                           os_type=OperatingSystemTypes.linux,
                           ip_address=group_ip_address)

    # Create the container group
    aci_client.container_groups.create_or_update(resource_group.name,
                                                 container_group_name, group)

    # Get the created container group
    container_group = aci_client.container_groups.get(resource_group.name,
                                                      container_group_name)

    print("Once DNS has propagated, container group '{0}' will be reachable at"
          " http://{1}".format(container_group_name,
                               container_group.ip_address.fqdn))

立工作型容器群組Create task-based container group

此範例會建立一個容器群組搭配單一工作型容器。This example creates a container group with a single task-based container. 此範例會示範多個功能:This example demonstrates several features:

  • 命令列覆寫 - 指定自訂命令列,但這不同於在容器 Dockerfile CMD 列中指定的內容。Command line override - A custom command line, different from that which is specified in the container's Dockerfile CMD line, is specified. 命令列覆寫可讓您指定容器啟動時要執行的自訂命令列,並覆寫容器中內建的預設命令列。Command line override allows you to specify a custom command line to execute at container startup, overriding the default command line baked-in to the container. 關於要在容器啟動時執行多個命令,適用下列方式:Regarding executing multiple commands at container startup, the following applies:

    如果您想要使用數個命令列引數執行單一命令,例如 echo FOO BAR,則必須將其以字串清單方式提供給容器command 屬性。If you want to run a single command with several command-line arguments, for example echo FOO BAR, you must supply them as a string list to the command property of the Container. 例如︰For example:

    command = ['echo', 'FOO', 'BAR']

    然而,如果您想要(或可能會) 使用多個引數來執行多個命令,則必須執行殼層,並將鏈結的命令做為引數傳遞。If, however, you want to run multiple commands with (potentially) multiple arguments, you must execute a shell and pass the chained commands as an argument. 例如,這樣會執行 echotail 命令:For example, this executes both an echo and a tail command:

    command = ['/bin/sh', '-c', 'echo FOO BAR && tail -f /dev/null']

  • 環境變數 - 針對容器群組中的容器指定兩個環境變數。Environment variables - Two environment variables are specified for the container in the container group. 使用環境變數來修改執行階段的指令碼或應用程式行為,或是將動態資訊傳遞至容器中執行的應用程式。Use environment variables to modify script or application behavior at runtime, or otherwise pass dynamic information to an application running in the container.

  • 重新啟動原則 - 使用 "Never" 的重新啟動原則設定容器,適用於作為批次工作一部份執行的工作型容器。Restart policy - The container is configured with a restart policy of "Never," useful for task-based containers that are executed as part of a batch job.

  • 使用 AzureOperationPoller 進行作業輪詢 - 叫用建立方法之後會對作業進行輪詢,以判斷作業何時完成,並可取得容器群組的記錄。Operation polling with AzureOperationPoller - After the create method is invoked, the operation is polled to determine when it has completed and the container group's logs can be obtained.

def run_task_based_container(aci_client, resource_group, container_group_name,
                             container_image_name, start_command_line=None):
    """Creates a container group with a single task-based container who's
       restart policy is 'Never'. If specified, the container runs a custom
       command line at startup.

    Arguments:
        aci_client {azure.mgmt.containerinstance.ContainerInstanceManagementClient}
                    -- An authenticated container instance management client.
        resource_group {azure.mgmt.resource.resources.models.ResourceGroup}
                    -- The resource group in which to create the container group.
        container_group_name {str}
                    -- The name of the container group to create.
        container_image_name {str}
                    -- The container image name and tag, for example:
                       microsoft\aci-helloworld:latest
        start_command_line {str}
                    -- The command line that should be executed when the
                       container starts. This value can be None.
    """
    # If a start command wasn't specified, use a default
    if start_command_line is None:
        start_command_line = "python wordcount.py http://shakespeare.mit.edu/romeo_juliet/full.html"

    # Configure some environment variables in the container which the
    # wordcount.py or other script can read to modify its behavior.
    env_var_1 = EnvironmentVariable(name='NumWords', value='5')
    env_var_2 = EnvironmentVariable(name='MinLength', value='8')

    print("Creating container group '{0}' with start command '{1}'"
          .format(container_group_name, start_command_line))

    # Configure the container
    container_resource_requests = ResourceRequests(memory_in_gb=1, cpu=1.0)
    container_resource_requirements = ResourceRequirements(requests=container_resource_requests)
    container = Container(name=container_group_name,
                          image=container_image_name,
                          resources=container_resource_requirements,
                          command=start_command_line.split(),
                          environment_variables=[env_var_1, env_var_2])

    # Configure the container group
    group = ContainerGroup(location=resource_group.location,
                           containers=[container],
                           os_type=OperatingSystemTypes.linux,
                           restart_policy=ContainerGroupRestartPolicy.never)

    # Create the container group
    result = aci_client.container_groups.create_or_update(resource_group.name,
                                                          container_group_name,
                                                          group)

    # Wait for the container create operation to complete. The operation is
    # "done" when the container group provisioning state is one of:
    # Succeeded, Canceled, Failed
    while result.done() is False:
        sys.stdout.write('.')
        time.sleep(1)

    # Get the provisioning state of the container group.
    container_group = aci_client.container_groups.get(resource_group.name,
                                                      container_group_name)
    if str(container_group.provisioning_state).lower() == 'succeeded':
        print("\nCreation of container group '{}' succeeded."
              .format(container_group_name))
    else:
        print("\nCreation of container group '{}' failed. Provisioning state"
              "is: {}".format(container_group_name,
                              container_group.provisioning_state))

    # Get the logs for the container
    logs = aci_client.container.list_logs(resource_group.name, 
                                          container_group_name, 
                                          container.name)

    print("Logs for container '{0}':".format(container_group_name))
    print("{0}".format(logs.content))

列出容器群組List container groups

此範例會列出資源群組中的容器群組,然後列印其中的部分屬性。This example lists the container groups in a resource group and then prints a few of their properties.

當您列出容器群組時,每個所傳回群組的 instance_view 都是 NoneWhen you list container groups,the instance_view of each returned group is None. 若要取得容器群組內的容器詳細資料,您必須再 get (取得) 容器群組,這會傳回其中已填入 instance_view 屬性的群組。To get the details of the containers within a container group, you must then get the container group, which returns the group with its instance_view property populated. 請參閱下一節<取得現有的容器群組>,透過範例了解如何在容器群組的 instance_view 中逐一查看其中容器。See the next section, Get an existing container group, for an example of iterating over a container group's containers in its instance_view.

def list_container_groups(aci_client, resource_group):
    """Lists the container groups in the specified resource group.

    Arguments:
       aci_client {azure.mgmt.containerinstance.ContainerInstanceManagementClient}
                   -- An authenticated container instance management client.
       resource_group {azure.mgmt.resource.resources.models.ResourceGroup}
                   -- The resource group containing the container group(s).
    """
    print("Listing container groups in resource group '{0}'...".format(resource_group.name))

    container_groups = aci_client.container_groups.list_by_resource_group(resource_group.name)

    for container_group in container_groups:
        print("  {0}".format(container_group.name))

取得現有的容器群組Get an existing container group

此範例會從資源群組中取得特定容器群組,且會列印出這些容器群組的屬性 (包括其容器) 和值。This example gets a specific container group from a resource group, and then prints a few of its properties (including its containers) and their values.

取得作業 returns a container group with its instance_view已填入,這可讓您逐一查看群組中的每個容器。The get operation returns a container group with its instance_view populated, which allows you to iterate over each container in the group. 只有 get 作業會填入容器群組的 instance_vew 屬性 - 列出訂用帳戶或資源群組中的容器群組並不會填入執行個體檢視,因為此作業的本質可能相當耗費資源 (例如列出數百個容器群組時,每個容器群組可能包含多個容器)。Only the get operation populates the instance_vew property of the container group--listing the container groups in a subscription or resource group doesn't populate the instance view due to the potentially expensive nature of the operation (for example, when listing hundreds of container groups, each potentially containing multiple containers). 如同之前在<列出容器群組>一節中所述,執行 list 之後,您必須接著 get 特定容器群組,才能取得其中容器執行個體的詳細資料。As mentioned previously in the List container groups section, after a list, you must subsequently get a specific container group to obtain its container instance details.

def print_container_group_details(aci_client, resource_group, container_group_name):
    """Gets the specified container group and then prints a few of its properties and their values.

    Arguments:
        aci_client {azure.mgmt.containerinstance.ContainerInstanceManagementClient}
                    -- An authenticated container instance management client.
        resource_group {azure.mgmt.resource.resources.models.ResourceGroup}
                    -- The name of the resource group containing the container
                       group.
        container_group_name {str}
                    -- The name of the container group whose details should be
                       printed.
    """
    print("Getting container group details for container group '{0}'..."
          .format(container_group_name))

    container_group = aci_client.container_groups.get(resource_group.name,
                                                      container_group_name)
    print("------------------------")
    print("Name:   {0}".format(container_group.name))
    print("State:  {0}".format(container_group.provisioning_state))
    print("FQDN:   {0}".format(container_group.ip_address.fqdn))
    print("IP:     {0}".format(container_group.ip_address.ip))
    print("Region: {0}".format(container_group.location))
    print("Containers:")
    for container in container_group.containers:
        print("  Name:  {0}".format(container.name))
        print("  Image: {0}".format(container.image))
        print("  State: {0}".format(container.instance_view.current_state.state))
        print("  ----------")

刪除容器群組Delete a container group

此範例會從資源群組中刪除數個容器群組和資源群組本身。This example deletes several container groups from a resource group, as well as the resource group.

# Clean up resources
input("Press ENTER to delete all resources created by this sample: ")
aciclient.container_groups.delete(resource_group_name,
                                  container_group_name)
aciclient.container_groups.delete(resource_group_name,
                                  multi_container_group_name)
aciclient.container_groups.delete(resource_group_name,
                                  task_container_group_name)
resclient.resource_groups.delete(resource_group_name)

後續步驟Next steps