Einbinden einer Azure-Dateifreigabe in Azure Container Instances

Standardmäßig ist Azure Container Instances zustandslos. Wenn der Container neu gestartet wird, abstürzt oder beendet wird, gehen alle Zustände verloren. Um den Zustand nach Ablauf der Lebensdauer des Containers beizubehalten, müssen Sie ein Volume aus einem externen Speicher einbinden. Wie in diesem Artikel gezeigt, können Azure Container Instances eine mit Azure Files erstellte Azure-Dateifreigabe einbinden. Azure Files bietet vollständig verwaltete Dateifreigaben gehostet in Azure Storage, auf die über das Branchenstandardprotokoll Server Message Block (SMB) zugegriffen werden kann. Durch das Verwenden einer Azure-Dateifreigabe mit Azure Container Instances werden Dateifreigabefeatures bereitgestellt, die Azure-Dateifreigaben mit virtuellen Azure-Computern ähneln.

Einschränkungen

  • Sie können Azure Files-Freigaben nur in Linux-Container einzulegen. Weitere Informationen zu den Unterschieden bei der Featureunterstützung von Linux- und Windows-Containergruppen finden Sie in der Übersicht.
  • Zum Einlegen des Volumens der Azure-Dateifreigabe muss der Linux- Container als Stammverzeichnis ausgeführt werden.
  • Die Volumemounts der Azure-Dateifreigabe sind auf die CIFS-Unterstützung beschränkt.

Hinweis

Das Einbinden einer Azure Files-Freigabe in eine Containerinstanz ähnelt einem bind mount bei Docker. Wenn Sie eine Freigabe in ein Container-Verzeichnis einlegen, in dem Dateien oder Verzeichnisse vorhanden sind, werden durch das Einlegen Dateien oder Verzeichnisse unkenntlich gemacht, so dass sie nicht mehr zugänglich sind, während der Container läuft.

Wichtig

Wenn Sie Containergruppen in einem virtuellen Azure-Netzwerk bereitstellen, müssen Sie Ihrem Azure Storage-Konto einen Dienstendpunkt hinzufügen.

Erstellen einer Azure-Dateifreigabe

Bevor Sie eine Azure-Dateifreigabe in Azure Container Instances einbinden, müssen Sie sie erstellen. Führen Sie das folgende Skript aus, um ein Speicherkonto zum Hosten der Dateifreigabe und die Freigabe selbst zu erstellen. Der Name des Speicherkontos muss global eindeutig sein, daher fügt das Skript der Basis-Zeichenfolge einen Zufallswert hinzu.

# 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 Anmeldeinformationen für das Speicherkonto

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.

  • Speicherkontoname: Wenn Sie das obige Skript verwendet haben, wurde der Name des Speicherkontos in der Variablen $ACI_PERS_STORAGE_ACCOUNT_NAME gespeichert. Um den Kontonamen einzusehen, geben Sie Folgendes ein:

    echo $ACI_PERS_STORAGE_ACCOUNT_NAME
    
  • Freigabename: Dieser Wert ist bereits bekannt (definiert als acishare im vorangehenden Skript).

  • Speicherkontoschlüssel: Diesen Wert finden Sie mithilfe des folgenden Befehls:

    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 – 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. 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:

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. Aktualisieren Sie den Wert im vorherigen Befehl, wenn Sie beim Ausführen des Befehls eine Fehlermeldung bezüglich der DNS-Namensbezeichnung erhalten.

Verwalten von Dateien in eingebundenen Datenträgern

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. Rufen Sie den vollqualifizierten Domänennamen (FQDN) für die Web-App mit dem Befehl az container show ab:

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.

Bereitstellen des Containers und Einbinden des Volumes – YAML

Sie können auch eine Containergruppe bereitstellen und mit der Azure CLI und einer YAML-Vorlage ein Volume in einen Container einbinden. Die Bereitstellung der YAML-Vorlage ist eine bevorzugte Methode bei der Bereitstellung von Containergruppen, die aus mehreren Containern bestehen.

Die folgende YAML-Vorlage definiert eine Containergruppe mit einem Container, der ein aci-hellofiles-Image einbindet. Der Container bindet die zuvor als Volume erstellte Azure-Dateifreigabe acishare ein. Geben Sie, wo angegeben, den Namen und den Speicherschlüssel für das Speicherkonto ein, das die Dateifreigabe hostet.

Wie im CLI-Beispiel muss der dnsNameLabel-Wert in der Azure-Region, in der Sie die Containerinstanz erstellen, eindeutig sein. Aktualisieren Sie den Wert in der YAML-Datei, falls erforderlich.

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:

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

Bereitstellen des Containers und Einbinden des Volumes – 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.

Füllen Sie in der Vorlage zunächst das volumes-Array im Abschnitt properties für die Containergruppe auf.

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.

Die folgende Resource Manager-Vorlage definiert eine Containergruppe, die einen mit dem aci-hellofiles-Image erstellten Container enthält. Der Container bindet die zuvor als Volume erstellte Azure-Dateifreigabe acishare ein. Geben Sie, wo angegeben, den Namen und den Speicherschlüssel für das Speicherkonto ein, das die Dateifreigabe hostet.

Wie in den vorherigen Beispielen muss der dnsNameLabel-Wert in der Azure-Region, in der Sie die Containerinstanz erstellen, eindeutig sein. Aktualisieren Sie den Wert in der Vorlage, falls erforderlich.

{
  "$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:

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

Einbinden mehrerer 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. 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.

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:

"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. Dadurch werden beispielsweise die beiden zuvor definierten Volumes myvolume1 und myvolume2 eingebunden:

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

Nächste Schritte

Erfahren Sie, wie andere Volumetypen in Azure Container Instances bereitgestellt werden: