Einbinden einer Azure-Dateifreigabe in Azure Container InstancesMount an Azure file share in Azure Container Instances

Standardmäßig ist Azure Container Instances zustandslos.By default, Azure Container Instances are stateless. Wenn der Container abstürzt oder beendet wird, gehen alle Zustände verloren.If the container crashes or stops, all of its state is lost. Um den Zustand nach Ablauf der Lebensdauer des Containers beizubehalten, müssen Sie ein Volume aus einem externen Speicher einbinden.To persist state beyond the lifetime of the container, you must mount a volume from an external store. Wie in diesem Artikel gezeigt, können Azure Container Instances eine mit Azure Files erstellte Azure-Dateifreigabe einbinden.As shown in this article, Azure Container Instances can mount an Azure file share created with Azure Files. Azure Files bietet vollständig verwaltete Dateifreigaben gehostet in Azure Storage, auf die über das Branchenstandardprotokoll Server Message Block (SMB) zugegriffen werden kann.Azure Files offers fully managed file shares hosted in Azure Storage that are accessible via the industry standard Server Message Block (SMB) protocol. Durch das Verwenden einer Azure-Dateifreigabe mit Azure Container Instances werden Dateifreigabefeatures bereitgestellt, die Azure-Dateifreigaben mit virtuellen Azure-Computern ähneln.Using an Azure file share with Azure Container Instances provides file-sharing features similar to using an Azure file share with Azure virtual machines.

Hinweis

Zurzeit ist das Einbinden einer Azure-Dateifreigabe in Linux-Container eingeschränkt.Mounting an Azure Files share is currently restricted to Linux containers. Aktuelle Plattformunterschiede finden Sie in der Übersicht.Find current platform differences in the overview.

Das Einbinden einer Azure Files-Freigabe in eine Containerinstanz ähnelt einem bind mount bei Docker.Mounting an Azure Files share to a container instance is similar to a Docker bind mount. Beachten Sie, dass, wenn Sie eine Freigabe in ein Containerverzeichnis einbinden, in dem Dateien oder Verzeichnisse vorhanden sind, diese Dateien oder Verzeichnisse durch die Einbindung verdeckt werden und nicht verfügbar sind, während der Container ausgeführt wird.Be aware that if you mount a share into a container directory in which files or directories exist, these files or directories are obscured by the mount and are not accessible while the container runs.

Erstellen einer Azure-DateifreigabeCreate an Azure file share

Bevor Sie eine Azure-Dateifreigabe in Azure Container Instances einbinden, müssen Sie sie erstellen.Before using an Azure file share with Azure Container Instances, you must create it. Führen Sie das folgende Skript aus, um ein Speicherkonto zum Hosten der Dateifreigabe und die Freigabe selbst zu erstellen.Run the following script to create a storage account to host the file share, and the share itself. Der Name des Speicherkontos muss global eindeutig sein, daher fügt das Skript der Basis-Zeichenfolge einen Zufallswert hinzu.The storage account name must be globally unique, so the script adds a random value to the base string.

# Change these four parameters as needed
ACI_PERS_RESOURCE_GROUP=myResourceGroup
ACI_PERS_STORAGE_ACCOUNT_NAME=mystorageaccount$RANDOM
ACI_PERS_LOCATION=eastus
ACI_PERS_SHARE_NAME=acishare

# Create the storage account with the parameters
az storage account create \
    --resource-group $ACI_PERS_RESOURCE_GROUP \
    --name $ACI_PERS_STORAGE_ACCOUNT_NAME \
    --location $ACI_PERS_LOCATION \
    --sku Standard_LRS

# Create the file share
az storage share create \
  --name $ACI_PERS_SHARE_NAME \
  --account-name $ACI_PERS_STORAGE_ACCOUNT_NAME

Erhalten der Zugriffsinformationen für das Azure-SpeicherkontoGet storage credentials

Um eine Azure-Dateifreigabe als Volume in Azure Container Instances einzubinden, benötigen Sie drei Werte: den Namen des Speicherkontos, den Freigabenamen und den Speicherzugriffsschlüssel.To mount an Azure file share as a volume in Azure Container Instances, you need three values: the storage account name, the share name, and the storage access key.

  • Speicherkontoname : Wenn Sie das obige Skript verwendet haben, wurde der Name des Speicherkontos in der Variablen $ACI_PERS_STORAGE_ACCOUNT_NAME gespeichert.Storage account name - If you used the preceding script, the storage account name was stored in the $ACI_PERS_STORAGE_ACCOUNT_NAME variable. Um den Kontonamen einzusehen, geben Sie Folgendes ein:To see the account name, type:

    echo $ACI_PERS_STORAGE_ACCOUNT_NAME
    
  • Freigabename : Dieser Wert ist bereits bekannt (definiert als acishare im vorangehenden Skript).Share name - This value is already known (defined as acishare in the preceding script)

  • Speicherkontoschlüssel : Diesen Wert finden Sie mithilfe des folgenden Befehls:Storage account key - This value can be found using the following command:

    STORAGE_KEY=$(az storage account keys list --resource-group $ACI_PERS_RESOURCE_GROUP --account-name $ACI_PERS_STORAGE_ACCOUNT_NAME --query "[0].value" --output tsv)
    echo $STORAGE_KEY
    

Bereitstellen des Containers und Einbinden des Volumes – CLIDeploy container and mount volume - CLI

Um eine Azure-Dateifreigabe mithilfe der Azure CLI als Volume in einen Container einzubinden, geben Sie die Freigabe und den Einbindungspunkt des Volumes bei der Erstellung des Containers mit az container create an.To mount an Azure file share as a volume in a container by using the Azure CLI, specify the share and volume mount point when you create the container with az container create. Wenn Sie die vorherigen Schritte ausgeführt haben, können Sie die Freigabe, die Sie zuvor erstellt haben, einbinden, indem Sie mit dem folgenden Befehl einen Container erstellen:If you followed the previous steps, you can mount the share you created earlier by using the following command to create a container:

az container create \
    --resource-group $ACI_PERS_RESOURCE_GROUP \
    --name hellofiles \
    --image mcr.microsoft.com/azuredocs/aci-hellofiles \
    --dns-name-label aci-demo \
    --ports 80 \
    --azure-file-volume-account-name $ACI_PERS_STORAGE_ACCOUNT_NAME \
    --azure-file-volume-account-key $STORAGE_KEY \
    --azure-file-volume-share-name $ACI_PERS_SHARE_NAME \
    --azure-file-volume-mount-path /aci/logs/

Der --dns-name-label-Wert muss in der Azure-Region, in der Sie die Containerinstanz erstellen, eindeutig sein.The --dns-name-label value must be unique within the Azure region where you create the container instance. Aktualisieren Sie den Wert im vorherigen Befehl, wenn Sie beim Ausführen des Befehls eine Fehlermeldung bezüglich der DNS-Namensbezeichnung erhalten.Update the value in the preceding command if you receive a DNS name label error message when you execute the command.

Verwalten von Dateien in eingebundenen DatenträgernManage files in mounted volume

Nachdem der Container gestartet wurde, können Sie mithilfe der einfachen Web-App, die über das Microsoft-Image aci-hellofiles bereitgestellt wird, kleine Textdateien in der Azure-Dateifreigabe unter dem angegebenen Einbindungspfad erstellen.Once the container starts up, you can use the simple web app deployed via the Microsoft aci-hellofiles image to create small text files in the Azure file share at the mount path you specified. Rufen Sie den vollqualifizierten Domänennamen (FQDN) für die Web-App mit dem Befehl az container show ab:Obtain the web app's fully qualified domain name (FQDN) with the az container show command:

az container show --resource-group $ACI_PERS_RESOURCE_GROUP \
  --name hellofiles --query ipAddress.fqdn --output tsv

Nach dem Speichern des Texts mit der App können Sie mithilfe des Azure-Portals oder eines Tools wie Microsoft Azure Storage-Explorer die in die Dateifreigabe geschriebene(n) Datei(en) abrufen und überprüfen.After saving text using the app, you can use the Azure portal or a tool like the Microsoft Azure Storage Explorer to retrieve and inspect the file or files written to the file share.

Bereitstellen des Containers und Einbinden des Volumes – YAMLDeploy container and mount volume - YAML

Sie können auch eine Containergruppe bereitstellen und mit der Azure CLI und einer YAML-Vorlage ein Volume in einen Container einbinden.You can also deploy a container group and mount a volume in a container with the Azure CLI and a YAML template. Die Bereitstellung der YAML-Vorlage ist eine bevorzugte Methode bei der Bereitstellung von Containergruppen, die aus mehreren Containern bestehen.Deploying by YAML template is a preferred method when deploying container groups consisting of multiple containers.

Die folgende YAML-Vorlage definiert eine Containergruppe mit einem Container, der ein aci-hellofiles-Image einbindet.The following YAML template defines a container group with one container created with the aci-hellofiles image. Der Container bindet die zuvor als Volume erstellte Azure-Dateifreigabe acishare ein.The container mounts the Azure file share acishare created previously as a volume. Geben Sie, wo angegeben, den Namen und den Speicherschlüssel für das Speicherkonto ein, das die Dateifreigabe hostet.Where indicated, enter the name and storage key for the storage account that hosts the file share.

Wie im CLI-Beispiel muss der dnsNameLabel-Wert in der Azure-Region, in der Sie die Containerinstanz erstellen, eindeutig sein.As in the CLI example, the dnsNameLabel value must be unique within the Azure region where you create the container instance. Aktualisieren Sie den Wert in der YAML-Datei, falls erforderlich.Update the value in the YAML file if needed.

apiVersion: '2019-12-01'
location: eastus
name: file-share-demo
properties:
  containers:
  - name: hellofiles
    properties:
      environmentVariables: []
      image: mcr.microsoft.com/azuredocs/aci-hellofiles
      ports:
      - port: 80
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
      volumeMounts:
      - mountPath: /aci/logs/
        name: filesharevolume
  osType: Linux
  restartPolicy: Always
  ipAddress:
    type: Public
    ports:
      - port: 80
    dnsNameLabel: aci-demo
  volumes:
  - name: filesharevolume
    azureFile:
      sharename: acishare
      storageAccountName: <Storage account name>
      storageAccountKey: <Storage account key>
tags: {}
type: Microsoft.ContainerInstance/containerGroups

Um mit der YAML-Vorlage bereitzustellen, speichern Sie den vorherigen YAML-Code in einer Datei namens deploy-aci.yaml und führen dann den Befehl az container create mit dem Parameter --file aus:To deploy with the YAML template, save the preceding YAML to a file named deploy-aci.yaml, then execute the az container create command with the --file parameter:

# Deploy with YAML template
az container create --resource-group myResourceGroup --file deploy-aci.yaml

Bereitstellen des Containers und Einbinden des Volumes – Resource ManagerDeploy container and mount volume - Resource Manager

Zusätzlich zur CLI- und YAML-Bereitstellung können Sie mit einer Azure Resource Manager-Vorlage eine Containergruppe bereitstellen und ein Volume einbinden.In addition to CLI and YAML deployment, you can deploy a container group and mount a volume in a container using an Azure Resource Manager template.

Füllen Sie in der Vorlage zunächst das volumes-Array im Abschnitt properties für die Containergruppe auf.First, populate the volumes array in the container group properties section of the template.

Füllen Sie dann für jeden Container, in den Sie das Volume einbinden möchten, das volumeMounts-Array im properties-Abschnitt der Containerdefinition auf.Then, for each container in which you'd like to mount the volume, populate the volumeMounts array in the properties section of the container definition.

Die folgende Resource Manager-Vorlage definiert eine Containergruppe, die einen mit dem aci-hellofiles-Image erstellten Container enthält.The following Resource Manager template defines a container group with one container created with the aci-hellofiles image. Der Container bindet die zuvor als Volume erstellte Azure-Dateifreigabe acishare ein.The container mounts the Azure file share acishare created previously as a volume. Geben Sie, wo angegeben, den Namen und den Speicherschlüssel für das Speicherkonto ein, das die Dateifreigabe hostet.Where indicated, enter the name and storage key for the storage account that hosts the file share.

Wie in den vorherigen Beispielen muss der dnsNameLabel-Wert in der Azure-Region, in der Sie die Containerinstanz erstellen, eindeutig sein.As in the previous examples, the dnsNameLabel value must be unique within the Azure region where you create the container instance. Aktualisieren Sie den Wert in der Vorlage, falls erforderlich.Update the value in the template if needed.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "variables": {
    "container1name": "hellofiles",
    "container1image": "mcr.microsoft.com/azuredocs/aci-hellofiles"
  },
  "resources": [
    {
      "name": "file-share-demo",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2019-12-01",
      "location": "[resourceGroup().location]",
      "properties": {
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "/aci/logs"
                }
              ]
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            }
          ],
          "dnsNameLabel": "aci-demo"
        },
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
                "shareName": "acishare",
                "storageAccountName": "<Storage account name>",
                "storageAccountKey": "<Storage account key>"
            }
          }
        ]
      }
    }
  ]
}

Um mit der Resource Manager-Vorlage bereitzustellen, speichern Sie den vorherigen JSON-Code in einer Datei namens deploy-aci.json, und führen Sie dann den Befehl az deployment group create mit dem Parameter --template-file aus:To deploy with the Resource Manager template, save the preceding JSON to a file named deploy-aci.json, then execute the az deployment group create command with the --template-file parameter:

# Deploy with Resource Manager template
az deployment group create --resource-group myResourceGroup --template-file deploy-aci.json

Einbinden mehrerer VolumesMount multiple volumes

Sie können mehrere Volumes in eine Containerinstanz einbinden, indem Sie zum Bereitstellen eine Azure Resource Manager-Vorlage, eine YAML-Datei oder eine andere programmgesteuerte Methode verwenden.To mount multiple volumes in a container instance, you must deploy using an Azure Resource Manager template, a YAML file, or another programmatic method. Stellen Sie zum Verwenden einer Vorlage oder YAML-Datei die Freigabedetails bereit, und definieren Sie die Volumes, indem Sie das Array volumes im Abschnitt properties der Datei auffüllen.To use a template or YAML file, provide the share details and define the volumes by populating the volumes array in the properties section of the file.

Wenn Sie z.B. zwei Azure Files-Freigaben mit den Namen share1 und share2 im Speicherkonto myStorageAccount erstellt haben, wird das Array volumes in einer Resource Manager-Vorlage ähnlich wie im folgenden Beispiel aussehen:For example, if you created two Azure Files shares named share1 and share2 in storage account myStorageAccount , the volumes array in a Resource Manager template would appear similar to the following:

"volumes": [{
  "name": "myvolume1",
  "azureFile": {
    "shareName": "share1",
    "storageAccountName": "myStorageAccount",
    "storageAccountKey": "<storage-account-key>"
  }
},
{
  "name": "myvolume2",
  "azureFile": {
    "shareName": "share2",
    "storageAccountName": "myStorageAccount",
    "storageAccountKey": "<storage-account-key>"
  }
}]

Füllen Sie als Nächstes für jeden Container in der Containergruppe, in den Sie die Volumes einbinden möchten, das Array volumeMounts im Abschnitt properties der Containerdefinition auf.Next, for each container in the container group in which you'd like to mount the volumes, populate the volumeMounts array in the properties section of the container definition. Dadurch werden beispielsweise die beiden zuvor definierten Volumes myvolume1 und myvolume2 eingebunden:For example, this mounts the two volumes, myvolume1 and myvolume2 , previously defined:

"volumeMounts": [{
  "name": "myvolume1",
  "mountPath": "/mnt/share1/"
},
{
  "name": "myvolume2",
  "mountPath": "/mnt/share2/"
}]

Nächste SchritteNext steps

Erfahren Sie, wie andere Volumetypen in Azure Container Instances bereitgestellt werden:Learn how to mount other volume types in Azure Container Instances: