🚀 News: We are launching the Kontext Labs AI-Native Data Intelligence Platform Pilot! Click here to join our pilot program.

Mount Azure File Share to Azure App Service or Azure Functions Linux Container Apps

Code description

This code snippet shows you how to mount Azure Storage file share as a local drive in a Linux container app hosted in Azure App Service or Azure Functions.

Outline of the code

The code snippet does the following:

  • Create a storage account

  • Create file service

  • Create a file share

  • Create an App Service resource with Linux container

  • Mount the file share to the app

For .NET 8 containers

If you use .NET 8 images that runs without root permissions, please mount the file share to path under /home. Otherwise, you may encounter errors like the following when deploying to Azure:

"message":"The resource write operation failed to complete successfully, because it reached terminal provisioning state 'Failed'.","details":[{"code":"DeploymentFailed","target":"/subscriptions//resourceGroups//providers/Microsoft.Resources/deployments/kontext-web","message":"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/arm-deployment-operations for usage details.","details":[{"code":"InternalServerError","message":"There was an unexpected InternalServerError. Please try again later. x-ms-correlation-request-id: ***"}

Code snippet

    param location string = 'australiaeast'
    param storageAccountName string = 'mystorageaccount'
    
    resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
      kind: 'StorageV2'
      location: location
      name: storageAccountName
      properties: {
        accessTier: 'Cool'
        allowBlobPublicAccess: true
        encryption: {
          keySource: 'Microsoft.Storage'
          services: {
            blob: {
              enabled: true
              keyType: 'Account'
            }
            file: {
              enabled: true
              keyType: 'Account'
            }
          }
        }
        minimumTlsVersion: 'TLS1_2'
        supportsHttpsTrafficOnly: true
      }
      sku: {
        name: 'Standard_LRS'
      }
    }
    
    // File share for sharing data across services.
    resource storageAccountFileService 'Microsoft.Storage/storageAccounts/fileServices@2023-01-01' = {
      parent: storageAccount
      name: 'default'
    }
    
    resource storageAccountFileShareMain 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-01-01' = {
      parent: storageAccountFileService
      name: 'fs-main'
      properties: {
        shareQuota: 5 // Set the quota for the file share in GiB. Adjust as needed.
      }
    }
    
    
    resource appServicePlan 'Microsoft.Web/serverfarms@2023-01-01' = {
      name: 'myAsp'
      location: location
      sku: {
        name: 'B1'
        tier: 'Basic'
        size: 'B1'
        family: 'B1'
        capacity: 1
      }
      properties: {
        reserved: true // This is for Linux
      }
    }
    
    resource myApp 'Microsoft.Web/sites@2023-01-01' = {
      name: 'myApp'
      location: location
      // For function app, change kind to functionapp,linux
      kind: 'linux'
      properties: {
        serverFarmId: appServicePlan.id
        siteConfig: {
          linuxFxVersion: 'Docker|***:latest'
          appSettings: [
          ]
          connectionStrings: [
          ]
          azureStorageAccounts: {
            myFileShare: {
              type: 'AzureFiles'
              accountName: storageAccount.name
              shareName: storageAccountFileShareMain.name
              accessKey: storageAccount.listKeys().keys[0].value
              mountPath: '/home/fs-main'
            }
          }
        }
        httpsOnly: true
      }
    }