Bibliotecas de Azure Container Instances para PythonAzure Container Instances libraries for Python

Use las bibliotecas de Microsoft Azure Container Instances para Python para crear y administrar instancias de contenedor de Azure.Use the Microsoft Azure Container Instances libraries for Python to create and manage Azure container instances. Para más información, consulte la Introducción a Azure Container Instances.Learn more by reading the Azure Container Instances overview.

API de administraciónManagement APIs

Use la biblioteca de administración para crear y administrar instancias de contenedor en Azure.Use the management library to create and manage Azure container instances in Azure.

Instale el paquete de administración mediante pip:Install the management package via pip:

pip install azure-mgmt-containerinstance

Ejemplo de código fuenteExample source

Si desea ver los ejemplos de código siguientes en contexto, los encontrará en el repositorio de GitHub siguiente: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

Una de las formas más sencillas para autenticar los clientes de SDK (por ejemplo, los clientes de Azure Container Instances y Resource Manager en el ejemplo siguiente) es con la autenticación basada en archivo.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. La autenticación basada en archivo consulta la variable de entorno AZURE_AUTH_LOCATION para obtener la ruta de acceso a un archivo de credenciales.File-based authentication queries the AZURE_AUTH_LOCATION environment variable for the path to a credentials file. Para usar la autenticación basada en archivoTo use file-based authentication:

  1. Cree un archivo de credenciales con la CLI de Azure o Cloud Shell:Create a credentials file with the Azure CLI or Cloud Shell:

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

    Si usa Cloud Shell para generar el archivo de credenciales, copie su contenido en un archivo local al que pueda tener acceso la aplicación de 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. Establezca la variable de entorno AZURE_AUTH_LOCATION en la ruta de acceso completa del archivo de credenciales generado.Set the AZURE_AUTH_LOCATION environment variable to the full path of the generated credentials file. Por ejemplo, en Bash:For example (in Bash):

    export AZURE_AUTH_LOCATION=/home/yourusername/my.azureauth
    

Después de crear el archivo de credenciales y de rellenar la variable de entorno AZURE_AUTH_LOCATION, use el método get_client_from_auth_file del módulo client_factorymodule to initialize the ResourceManagementClient[ para inicializar los objetos ]ResourceManagementClient[] y ContainerInstanceManagementClient.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")

Para más información acerca de los métodos de autenticación disponibles en las bibliotecas de administración de Python para Azure, consulte Autenticación con las bibliotecas de administración de Azure para Python.For more details about the available authentication methods in the Python management libraries for Azure, see Authenticate with the Azure Management Libraries for Python.

Creación de un grupo de contenedores: un solo contenedorCreate container group - single container

En este ejemplo se crea un grupo de contenedores con un solo contenedorThis 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))

Creación de un grupo de contenedores: varios contenedoresCreate container group - multiple containers

En este ejemplo se crea un grupo de contenedores con dos contenedores: un contenedor de aplicaciones y un contenedor asociado.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))

Creación de un grupo de contenedores basado en tareasCreate task-based container group

En este ejemplo se crea un grupo de contenedores con un solo contenedor basado en tareas.This example creates a container group with a single task-based container. En este ejemplo se muestran varias características:This example demonstrates several features:

  • Invalidación de la línea de comandos: se especifica una línea de comandos personalizada, diferente de la que se especifica en la línea CMD del archivo Docker del contenedor.Command line override - A custom command line, different from that which is specified in the container's Dockerfile CMD line, is specified. La invalidación de la línea de comandos permite especificar la línea de comandos personalizada que se ejecutará ejecutar durante el inicio del contenedor y que reemplazará la línea de comandos predeterminada incluida en el contenedor.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. En relación con la ejecución de varios comandos durante el inicio del contenedor, se aplica lo siguiente:Regarding executing multiple commands at container startup, the following applies:

    Si desea ejecutar un único comando con varios argumentos de línea de comandos, por ejemplo echo FOO BAR, debe proporcionarlos como una lista de cadenas a la propiedad command de Container.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. Por ejemplo:For example:

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

    En cambio, si desea ejecutar varios comandos con varios argumentos posibles, debe ejecutar un shell y pasar los comandos encadenados como argumento.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. Por ejemplo, esto ejecuta los comandos echo y tail:For example, this executes both an echo and a tail command:

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

  • Variables de entorno: se especifican dos variables de entorno para el contenedor en el grupo de contenedores.Environment variables - Two environment variables are specified for the container in the container group. Use variables de entorno para modificar el comportamiento de un script o aplicación en tiempo de ejecución; de lo contrario, pase información dinámica a una aplicación que se ejecuta en el contenedor.Use environment variables to modify script or application behavior at runtime, or otherwise pass dynamic information to an application running in the container.

  • Directiva de reinicio: el contenedor está configurado con una directiva de reinicio de "Nunca", que resulta útil para los contenedores basados en tareas que se ejecutan como parte de un trabajo por lotes.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.

  • Sondeo de la operación con AzureOperationPoller: después de invocar el método Create, se sondea la operación para determinar cuándo se ha completado y obtener los registros del grupo de contenedores.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))

Enumeración de grupos de contenedoresList container groups

En este ejemplo se enumeran los grupos de contenedores de un grupo de recursos y se imprimen algunas de sus propiedades.This example lists the container groups in a resource group and then prints a few of their properties.

Cuando se enumeran grupos de contenedores, el valor de instance_view de cada grupo es None.When you list container groups,the instance_view of each returned group is None. Para obtener los detalles de los contenedores dentro de un grupo de contenedores, deberá ejecutar get en el grupo de contenedores, que devuelve el grupo con la propiedad instance_view rellena.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. Consulte la sección siguiente, Obtención de un grupo de contenedores existente, para ver un ejemplo de cómo recorrer en iteración los contenedores de un grupo de contenedores en su 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))

Obtención de un grupo de contenedores existenteGet an existing container group

En este ejemplo se obtiene un grupo de contenedores específico que reside en un grupo de recursos y, a continuación, se imprimen algunas de sus propiedades (incluidos sus contenedores) y sus valores.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.

La operación getreturns a container group with its instance_view devuelve un grupo de contenedores con el valor de instance_view relleno, lo que permite recorrer en iteración cada contenedor del grupo.The get operation returns a container group with its instance_view populated, which allows you to iterate over each container in the group. Solo la operación get rellena la propiedad instance_vew del grupo de contenedores. Enumerar los grupos de contenedores de una suscripción o grupo de recursos no rellena instance_view debido a la naturaleza potencialmente costosa de la operación; por ejemplo, cuando se enumeran cientos de grupos de contenedores, cada uno de ellos puede contener a su vez varios contenedores.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). Tal y como se mencionó anteriormente en la sección Enumeración de grupos de contenedores, después un list, se debe ejecutar get en un grupo de contenedores específico para obtener información detallada de su instancia de contenedor.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("  ----------")

Eliminación de un grupo de contenedoresDelete a container group

En este ejemplo se eliminan varios grupos de contenedores de un grupo de recursos, así como el grupo de recursos.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)

Pasos siguientesNext steps