Mount an Azure file share in Azure Container Instances (Montare una condivisione file di Azure in Istanze di Azure Container)

Per impostazione predefinita, Istanze di Azure Container è senza stato. Se il contenitore viene riavviato, si blocca o si arresta, lo stato viene perso. Per rendere persistente lo stato oltre la durata del contenitore, è necessario montare un volume da un archivio esterno. Come illustrato in questo articolo, Istanze di Azure Container può montare una condivisione file di Azure creata con File di Azure. File di Azure offre condivisioni file completamente gestite ospitate in Archiviazione di Azure e accessibili tramite il protocollo SMB (Server Message Block) standard del settore. L'uso di una condivisione file di Azure con Istanze di Azure Container offre funzionalità di condivisione di file simili all'uso di una condivisione file di Azure con macchine virtuali di Azure.

Limiti

  • Archiviazione di Azure non supporta il montaggio SMB della condivisione file usando l'identità gestita
  • È possibile montare le condivisioni file di Azure solo in contenitori Linux. Per altre informazioni sulle differenze nel supporto delle funzionalità per i gruppi di contenitori Linux e Windows, vedere la panoramica.
  • Il montaggio del volume della condivisione file di Azure richiede che il contenitore Linux venga eseguito come radice.
  • I montaggi del volume della condivisione file di Azure sono limitati al supporto CIFS.

Nota

Il montaggio di una condivisione di File di Azure in un'istanza del contenitore è simile a un montaggio di associazione Docker. Se si monta una condivisione in una directory del contenitore in cui esistono file o directory, il montaggio nasconde i file o le directory, rendendoli inaccessibili durante l'esecuzione del contenitore.

Importante

Se la connessione in uscita a Internet è bloccata nella subnet delegata, è necessario aggiungere un endpoint di servizio ad Azure Strorage nella subnet delegata.

Creare una condivisione file di Azure

Prima di usare una condivisione file di Azure con Istanze di Azure Container è necessario creare la condivisione. Eseguire questo script per creare un account di archiviazione per ospitare la condivisione file e la condivisione in sé. Il nome dell'account di archiviazione deve essere globalmente univoco, quindi lo script aggiunge un valore casuale alla stringa di base.

# 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

Ottenere le credenziali di archiviazione

Per montare una condivisione file di Azure come volume in Istanze di Azure Container sono necessari tre valori: il nome dell'account di archiviazione, il nome della condivisione e la chiave di accesso alle risorse di archiviazione.

  • Nome dell'account di archiviazione: se è stato usato lo script precedente, il nome dell'account di archiviazione è stato archiviato nella variabile $ACI_PERS_STORAGE_ACCOUNT_NAME. Per visualizzare il nome dell'account, digitare:

    echo $ACI_PERS_STORAGE_ACCOUNT_NAME
    
  • Nome condivisione: questo valore è già noto (definito come acishare nello script precedente)

  • Chiave dell'account di archiviazione: questo valore è reperibile usando il comando seguente:

    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
    

Distribuire contenitori e montare volumi - Interfaccia della riga di comando

Per montare una condivisione file di Azure come volume in un contenitore usando l'interfaccia della riga di comando di Azure, specificare la condivisione e il punto di montaggio del volume quando si crea il contenitore con az container create. Se è stata eseguita la procedura precedente, è possibile montare la condivisione creata in precedenza tramite il comando seguente per creare un contenitore:

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/

Il valore --dns-name-label deve essere univoco all'interno dell'area di Azure in cui si crea l'istanza di contenitore. Aggiornare il valore nel comando precedente se viene visualizzato un messaggio di errore relativo all'etichetta del nome DNS quando si esegue il comando.

Gestire i file nel volume montato

Dopo l'avvio del contenitore, è possibile usare l'app Web distribuita tramite l'immagine Microsoft aci-hellofiles per creare piccoli file di testo nella condivisione file di Azure nel percorso di montaggio specificato. Ottenere il nome di dominio completo (FQDN) dell'app Web con il comando az container show:

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

Dopo aver salvato il testo usando l'app, è possibile usare il portale di Azure oppure uno strumento come Microsoft Azure Storage Explorer per recuperare e ispezionare il file scritto nella condivisione file.

Distribuire il contenitore e montare il volume - YAML

È anche possibile distribuire un gruppo di contenitori e montare un volume in un contenitore con l'interfaccia della riga di comando di Azure e un modello YAML. La distribuzione mediante il modello YAML è un metodo preferito quando si distribuiscono gruppi di contenitori costituiti da più contenitori.

Il modello YAML seguente definisce un gruppo di contenitori con un contenitore creato con l'immagine aci-hellofiles. Il contenitore monta la condivisione file di Azure acishare creata in precedenza come volume. Dove indicato, immettere il nome e la chiave di archiviazione per l'account di archiviazione che ospita la condivisione file.

Come nell'esempio dell'interfaccia della riga di comando, il valore dnsNameLabel deve essere univoco all'interno dell'area di Azure in cui si crea l'istanza del contenitore. Aggiornare il valore nel file YAML, se necessario.

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

Per eseguire la distribuzione con il modello YAML, salvare il codice YAML precedente in un file denominato deploy-aci.yaml, quindi eseguire il comando az container create con il parametro --file:

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

Distribuire un contenitore e un volume di montaggio - Resource Manager

Oltre all'interfaccia della riga di comando e alla distribuzione YAML, è possibile distribuire un gruppo di contenitori e montare un volume in un contenitore usando un modello di Azure Resource Manager.

Popolare innanzitutto la matrice volumes nella sezione properties del gruppo di contenitori del modello.

Quindi, per ogni contenitore in cui si vuole montare il volume, popolare la matrice volumeMounts nella sezione properties della definizione del contenitore.

Il modello di Resource Manager seguente definisce un gruppo di contenitori con un contenitore creato con l'immagine aci-hellofiles. Il contenitore monta la condivisione file di Azure acishare creata in precedenza come volume. Dove indicato, immettere il nome e la chiave di archiviazione per l'account di archiviazione che ospita la condivisione file.

Come negli esempi precedenti, il valore dnsNameLabel deve essere univoco all'interno dell'area di Azure in cui si crea l'istanza del contenitore. Aggiornare il valore nel modello, se necessario.

{
  "$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>"
            }
          }
        ]
      }
    }
  ]
}

Per eseguire la distribuzione con il modello di Resource Manager, salvare il codice JSON precedente in un file denominato deploy-aci.json, quindi eseguire il comando az deployment group create con il parametro --template-file:

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

Montare più volumi

Per montare più volumi in un'istanza di contenitore, è necessario eseguire la distribuzione tramite un modello di Azure Resource Manager, un file YAML o un altro metodo programmatico. Per usare un modello o un file YAML, specificare i dettagli di condivisione e definire i volumi popolando la matrice volumes nella sezione properties del file.

Ad esempio, se sono state create due condivisioni File di Azure denominate share1 e share2 nell'account di archiviazione myStorageAccount, la volumes matrice in un modello di Resource Manager sarà simile all'esempio seguente:

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

Successivamente, per ogni contenitore del relativo gruppo in cui si desidera montare i volumi, inserire la matrice volumeMounts nella sezione properties della definizione del contenitore. Ad esempio, in questo modo vengono montati i due volumi, myvolume1 e myvolume2, definiti in precedenza:

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

Passaggi successivi

Informazioni su come montare altri tipi di volume in Istanze di Azure Container: