コンテナー アプリは、さまざまな種類のストレージにアクセスできます。 必要に応じて、1 つのアプリで複数の種類のストレージを利用できます。
注
デプロイの失敗を防ぐために、ボリューム名には特殊文字を使用しないでください。 たとえば、credentials.json
という名前のボリュームは特殊文字 (.
) が含まれているため、デプロイは失敗します。
ストレージの種類 | 説明 | 永続化 | 使用例 |
---|---|---|---|
コンテナー スコープストレージ | 実行中のコンテナーで使用できるエフェメラル ストレージ | データはコンテナーがシャットダウンするまで使用できます | ローカル アプリ キャッシュを作成する。 |
レプリカ スコープのストレージ | 同じレプリカ内のコンテナー間でファイルを共有するためのエフェメラル ストレージ | データはレプリカがシャットダウンするまで使用できます | サイドカー コンテナーで処理されるログ ファイルを書き込むメイン アプリ コンテナー。 |
Azure Files | 永続的なストレージ | データは Azure Files に保存されます | ファイル共有にファイルを書き込んで、他のシステムからデータにアクセスできるようにする。 |
注
Azure Container Apps では、Azure NetApp Files または Azure Blob Storage からのファイル共有のマウントはサポートされていません。
エフェメラル ストレージ
コンテナー アプリは、エフェメラル ストレージとの間で一時データを読み書きできます。 エフェメラル ストレージのスコープは、コンテナーまたはレプリカに設定できます。 各レプリカで使用できるコンテナー スコープおよびレプリカ スコープのストレージの合計量は、レプリカに割り当てられた vCPU の合計数によって異なります。
vCPU 数 | エフェメラル ストレージの合計 |
---|---|
0.25 以下 | 1 GiB |
0.5 以下 | 2 GiB |
1 以下 | 4 GiB |
1 より大 | 8 GiB |
コンテナー スコープのストレージ
コンテナーは、独自のファイル システムに書き込むことができます。
コンテナー ファイル システムのストレージには、次の特性があります。
- ストレージは一時的であり、コンテナーがシャットダウンまたは再起動されると消失します。
- このストレージに書き込まれるファイルは、現在のコンテナーで実行されているプロセスにのみ表示されます。
レプリカ スコープのストレージ
Kubernetes の EmptyDir (空 のディレクトリ) に相当する一時的な一時ボリュームをマウントできます。 このストレージは単一のレプリカにスコープされます。
EmptyDir
ボリュームを使って、同じレプリカ内のコンテナー間でデータを共有します。
レプリカ スコープのストレージには、次の特性があります。
- ファイルはレプリカの有効期間中保持されます。
- レプリカ内のコンテナーが再起動された場合、ボリューム内のファイルはそのまま残されます。
- レプリカ内のすべての init コンテナーまたはアプリ コンテナーが、同じボリュームをマウントできます。
- 1 つのコンテナーで、複数の
EmptyDir
ボリュームをマウントできます。
レプリカ スコープのストレージを構成するには、最初にリビジョンで EmptyDir
ボリュームを定義します。 次に、リビジョン内の 1 つ以上のコンテナーでボリューム マウントを定義します。
前提条件
要件 | 手順 |
---|---|
Azure アカウント | アカウントをお持ちでない場合は、 無料でアカウントを作成してください。 |
Azure Container Apps 環境 | コンテナー アプリ環境を作成します。 |
構成
Azure CLI を使ってレプリカ スコープのストレージを構成するときは、YAML 定義を使ってコンテナー アプリを作成または更新する必要があります。
レプリカ スコープストレージを使用するように既存のコンテナー アプリを更新するには、 app.yaml という名前の YAML ファイルにアプリの仕様をエクスポートします。
az containerapp show -n <APP_NAME> -g <RESOURCE_GROUP_NAME> -o yaml > app.yaml
コンテナー アプリの仕様に次の変更を加えます。
- コンテナー アプリ定義の
volumes
セクションにtemplate
配列を追加して、ボリュームを定義します。 既にvolumes
配列がある場合は、新しいボリュームを配列に追加します。-
name
はボリュームの識別子です。 -
EmptyDir
をstorageType
として使用します。
-
- ボリュームをマウントするテンプレート内のコンテナーごとに、コンテナー定義の
volumeMounts
配列でボリューム マウントを定義します。-
volumeName
は、volumes
配列で定義されている名前です。 -
mountPath
は、ボリュームをマウントするコンテナー内のパスです。
-
properties: managedEnvironmentId: /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.App/managedEnvironments/<ENVIRONMENT_NAME> configuration: activeRevisionsMode: Single template: containers: - image: <IMAGE_NAME1> name: my-container-1 volumeMounts: - mountPath: /myempty volumeName: myempty - image: <IMAGE_NAME_2> name: my-container-2 volumeMounts: - mountPath: /myempty volumeName: myempty volumes: - name: myempty storageType: EmptyDir
- コンテナー アプリ定義の
YAML ファイルを使用して、コンテナー アプリを更新します。
az containerapp update --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> \ --yaml app.yaml
完全な例については 、YAML 仕様 を参照してください。
レプリカ スコープのボリュームを作成し、コンテナーでそれをマウントするには、ARM テンプレートでコンテナー アプリ リソースを次のように変更します。
- コンテナー アプリ定義の
volumes
セクションにtemplate
配列を追加して、ボリュームを定義します。 既にvolumes
配列がある場合は、新しいボリュームを配列に追加します。-
name
はボリュームの識別子です。 -
EmptyDir
をstorageType
として使用します。
-
- ボリュームをマウントするテンプレート内のコンテナーごとに、コンテナー定義の
volumeMounts
配列でボリューム マウントを定義します。-
volumeName
は、volumes
配列で定義されている名前です。 -
mountPath
は、ボリュームをマウントするコンテナー内のパスです。
-
ARM テンプレート スニペットの例:
{
"apiVersion": "2022-03-01",
"type": "Microsoft.App/containerApps",
"name": "[parameters('containerappName')]",
"location": "[parameters('location')]",
"properties": {
...
"template": {
"revisionSuffix": "myrevision",
"containers": [
{
"name": "main",
"image": "[parameters('container_image')]",
"resources": {
"cpu": 0.5,
"memory": "1Gi"
},
"volumeMounts": [
{
"mountPath": "/myempty",
"volumeName": "myempty"
}
]
},
{
"name": "sidecar",
"image": "[parameters('sidecar_image')]",
"resources": {
"cpu": 0.5,
"memory": "1Gi"
},
"volumeMounts": [
{
"mountPath": "/myempty",
"volumeName": "myempty"
}
]
}
],
"scale": {
"minReplicas": 1,
"maxReplicas": 3
},
"volumes": [
{
"name": "myempty",
"storageType": "EmptyDir"
}
]
}
}
}
完全な例については、 ARM テンプレート API の仕様 を参照してください。
レプリカ スコープのボリュームを作成し、コンテナーでそれをマウントするには、Azure portal を使ってコンテナー アプリの新しいリビジョンをデプロイします。
Azure portal で、コンテナー アプリに移動します。
左側のメニューで [ リビジョン管理 ] を選択します。
[ 新しいリビジョンの作成] を選択します。
ボリュームをマウントするコンテナーを選びます。
[ コンテナーの編集 ] コンテキスト ウィンドウで、[ ボリューム マウント ] タブを選択します。
[エフェメラル ストレージ] セクションで、次の情報を使って新しいボリュームを作成します。
- ボリューム名: エフェメラル ボリュームの名前。
- マウント パス: ボリュームをマウントするコンテナー内の絶対パス。
[ 保存] を 選択して変更を保存し、コンテキスト ウィンドウを終了します。
[ 作成] を選択して新しいリビジョンを作成します。
Azure Files ボリューム
Azure Files からコンテナー内のボリュームとしてファイル共有をマウントできます。
Azure Files ストレージには、次の特性があります。
- マウント場所の下に書き込まれたファイルは、ファイル共有に永続化されます。
- 共有内のファイルは、マウントの場所から使用できます。
- 複数のコンテナーで同じファイル共有をマウントできます。これには、別のレプリカ、リビジョン、またはコンテナー アプリにあるものも含まれます。
- 共有をマウントするすべてのコンテナーは、他のコンテナーまたはメソッドによって書き込まれたファイルにアクセスできます。
- 1 つのコンテナーに複数のAzure Files ボリュームをマウントできます。
Azure Files では、SMB (サーバー メッセージ ブロック) と NFS (ネットワーク ファイル システム) の両方のプロトコルがサポートされています。 どちらのプロトコルを使っても Azure Files 共有をマウントできます。 環境で定義するファイル共有は、ストレージ アカウントのファイル共有に使うものと同じプロトコルで構成する必要があります。
コンテナーで Azure Files ストレージを有効にするには、環境とコンテナー アプリを次のように設定する必要があります。
- Container Apps 環境でストレージの定義を作成します。
- NFS を使っている場合は、環境をカスタム VNet で構成し、VNet からのアクセスを許可するようにストレージ アカウントを構成する必要があります。 詳細については、「 Azure Files の NFS ファイル共有」を参照 してください。
- カスタム VNet を使って環境が構成されている場合は、サブネットに関連付けられたネットワーク セキュリティ グループ (NSG) でポート 445 と 2049 を許可する必要があります。
- リビジョンで種類
AzureFile
(SMB) またはNfsAzureFile
(NFS) のボリュームを定義します。 - リビジョン内の 1 つ以上のコンテナーでボリューム マウントを定義します。
- 使う Azure Files ストレージ アカウントは、コンテナー アプリの仮想ネットワークからアクセスできる必要があります。 詳細については、「 仮想ネットワークからのアクセスを許可する」を参照してください。
- NFS を使っている場合は、セキュリティで保護された転送も無効にする必要があります。 詳細については、Azure Files の NFS ファイル共有と、このチュートリアルの「NFS Azure ファイル共有の作成」セクションを参照してください。
前提条件
要件 | 手順 |
---|---|
Azure アカウント | アカウントをお持ちでない場合は、 無料でアカウントを作成してください。 |
Azure ストレージ アカウント | ストレージ アカウントを作成します。 |
Azure Container Apps 環境 | コンテナー アプリ環境を作成します。 |
構成
Azure CLI を使って Azure Files ボリュームをマウントするようにコンテナー アプリを構成するときは、YAML 定義を使ってコンテナー アプリを作成または更新する必要があります。
SMB ファイル共有のマウントに関する詳細なチュートリアルについては、「 Azure Container Apps での Azure Files ストレージマウントの作成」を参照してください。
Container Apps 環境にストレージの定義を追加します。
az containerapp env storage set --name my-env --resource-group my-group \ --storage-name mystorage \ --storage-type AzureFile \ --azure-file-account-name <STORAGE_ACCOUNT_NAME> \ --azure-file-account-key <STORAGE_ACCOUNT_KEY> \ --azure-file-share-name <STORAGE_SHARE_NAME> \ --access-mode ReadWrite
<STORAGE_ACCOUNT_NAME>
と<STORAGE_ACCOUNT_KEY>
を、ストレージ アカウントの名前とキーに置き換えます。<STORAGE_SHARE_NAME>
を、ストレージ アカウント内のファイル共有の名前に置き換えます。--access-mode
の有効な値は、ReadWrite
とReadOnly
です。既存のコンテナー アプリを更新してファイル共有をマウントするには、 app.yaml という名前の YAML ファイルにアプリの仕様をエクスポートします。
az containerapp show -n <APP_NAME> -g <RESOURCE_GROUP_NAME> -o yaml > app.yaml
コンテナー アプリの仕様に次の変更を加えます。
- コンテナー アプリ定義の
volumes
セクションにtemplate
配列を追加して、ボリュームを定義します。 既にvolumes
配列がある場合は、新しいボリュームを配列に追加します。-
name
はボリュームの識別子です。 -
storageType
の場合、SMB にはAzureFile
、NFS にはNfsAzureFile
を使います。 この値は、環境で定義したストレージの種類と一致する必要があります。 -
storageName
では、環境内で定義したストレージの名前を使用します。 -
mountOptions
は、マウント オプションのコンマ区切りの文字列です。 詳細については、「 Azure Files で mountOptions 設定を使用する」を参照してください。 -
secrets
リストは、ボリュームにマウントするシークレットのリストです。 詳細については、シークレットをボリューム内にマウントすることを参照してください。
-
- Azure Files ストレージをマウントするテンプレート内のコンテナーごとに、コンテナー定義の
volumeMounts
配列でボリューム マウントを定義します。-
volumeName
は、volumes
配列で定義されている名前です。 -
mountPath
は、ボリュームをマウントするコンテナー内のパスです。 -
subPath
は、マウントするボリューム内のパスです。 指定しない場合は、ボリューム ルートがマウントされます。 詳細については、(#サブパス) を参照してください。
-
properties: managedEnvironmentId: /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.App/managedEnvironments/<ENVIRONMENT_NAME> configuration: template: containers: - image: <IMAGE_NAME> name: my-container volumeMounts: - volumeName: azure-files-volume mountPath: /my-files subPath: my-sub-path volumes: - name: azure-files-volume storageType: AzureFile storageName: mystorage
- コンテナー アプリ定義の
YAML ファイルを使用して、コンテナー アプリを更新します。
az containerapp update --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> \ --yaml app.yaml
完全な例については 、YAML 仕様 を参照してください。
次の ARM テンプレート スニペットは、Container Apps 環境に Azure Files 共有を追加して、コンテナー アプリで使用する方法を示しています。
storages
子リソースを Container Apps 環境に追加します。{ "type": "Microsoft.App/managedEnvironments", "apiVersion": "2022-03-01", "name": "[parameters('environment_name')]", "location": "[parameters('location')]", "properties": { "daprAIInstrumentationKey": "[parameters('dapr_ai_instrumentation_key')]", "appLogsConfiguration": { "destination": "log-analytics", "logAnalyticsConfiguration": { "customerId": "[parameters('log_analytics_customer_id')]", "sharedKey": "[parameters('log_analytics_shared_key')]" } } }, "resources": [ { "type": "storages", "name": "myazurefiles", "apiVersion": "2022-03-01", "dependsOn": [ "[resourceId('Microsoft.App/managedEnvironments', parameters('environment_name'))]" ], "properties": { "azureFile": { "accountName": "[parameters('storage_account_name')]", "accountKey": "[parameters('storage_account_key')]", "shareName": "[parameters('storage_share_name')]", "accessMode": "ReadWrite" } } } ] }
コンテナー アプリ リソースを更新して、ボリュームとボリューム マウントを追加します。
{ "apiVersion": "2023-05-01", "type": "Microsoft.App/containerApps", "name": "[parameters('containerappName')]", "location": "[parameters('location')]", "properties": { ... "template": { "revisionSuffix": "myrevision", "containers": [ { "name": "main", "image": "[parameters('container_image')]", "resources": { "cpu": 0.5, "memory": "1Gi" }, "volumeMounts": [ { "mountPath": "/myfiles", "volumeName": "azure-files-volume", "subPath": "my-sub-path" } ] } ], "scale": { "minReplicas": 1, "maxReplicas": 3 }, "volumes": [ { "name": "azure-files-volume", "storageType": "AzureFile", "storageName": "myazurefiles" } ] } } }
- コンテナー アプリ定義の
volumes
セクションにtemplate
配列を追加して、ボリュームを定義します。 既にvolumes
配列がある場合は、新しいボリュームを配列に追加します。-
name
はボリュームの識別子です。 -
storageType
の場合、SMB にはAzureFile
、NFS にはNfsAzureFile
を使います。 この値は、環境で定義したストレージの種類と一致する必要があります。 -
storageName
では、環境内で定義したストレージの名前を使用します。 -
mountOptions
は、マウント オプションのコンマ区切りの文字列です。 詳細については、「 Azure Files で mountOptions 設定を使用する」を参照してください。 -
secrets
リストは、ボリュームにマウントするシークレットのリストです。 詳細については、シークレットをボリューム内にマウントすることを参照してください。
-
- Azure Files ストレージをマウントするテンプレート内のコンテナーごとに、コンテナー定義の
volumeMounts
配列でボリューム マウントを定義します。-
volumeName
は、volumes
配列で定義されている名前です。 -
mountPath
は、ボリュームをマウントするコンテナー内のパスです。 -
subPath
(省略可能) は、マウントするボリューム内のパスです。 指定しない場合は、ボリューム ルートがマウントされます。 詳細については、(#サブパス) を参照してください。
-
- コンテナー アプリ定義の
完全な例については、 ARM テンプレート API の仕様 を参照してください。
Azure portal で Azure Files ストレージ用のボリューム マウントを構成するには、Container Apps 環境にファイル共有を追加してから、新しいリビジョンを作成してコンテナー アプリにボリューム マウントを追加します。
Azure portal で、Container Apps インスタンスに移動します。
ナビゲーション ウィンドウの [設定] で、[ Azure Files] を選択します。
追加を選択します。
ファイル共有で使用されるプロトコルに応じて、 サーバー メッセージ ブロック (SMB) または ネットワーク ファイル システム (NFS) を選択します。
[ファイル共有の追加] コンテキスト ペインで、次の情報を入力します。
[ 追加] を選択してコンテキスト ウィンドウを終了します。
[ 保存] を 選択して変更をコミットします。
コンテナー アプリに移動します。
ナビゲーション ウィンドウの [ アプリケーション] で、[ リビジョンとレプリカ] を選択します。
[ 新しいリビジョンの作成] を選択します。
[ 新しいリビジョンの作成と展開 ] ページで、[ボリューム] タブ を 選択します。
追加を選択します。
[ ボリュームの追加 ] コンテキスト ウィンドウで、次の設定を行います。
- ボリュームの種類: Azure ファイル ボリューム。
- 名前: ボリューム名を入力します。
- ファイル共有名: 前に作成したファイル共有を選択します。
- マウント オプション: 必要に応じて、マウント オプションのコンマ区切りの文字列を入力します。 詳細については、「 Azure Files で mountOptions 設定を使用する」を参照してください。
[ 追加] を選択してコンテキスト ウィンドウを終了します。
[ 新しいリビジョンの作成とリプロイ ] ページで、[ コンテナー ] タブを選択します。
ボリュームをマウントするコンテナーを選びます。
[ コンテナーの編集 ] コンテキスト ウィンドウで、[ ボリューム マウント ] タブを選択します。
[ ボリューム名] で、前に作成したボリュームを選択します。
[ マウント パス] に、ボリュームをマウントするコンテナーの絶対パスを入力します。
サブ パス (省略可能) に、マウントするボリューム内のパスを入力します。 指定しない場合は、ボリューム ルートがマウントされます。 詳細については、(#サブパス) を参照してください。
[ 保存] を 選択して変更を保存し、コンテキスト ウィンドウを終了します。
[ 作成] を選択して新しいリビジョンを作成します。
サブパス
Azure Files からファイル共有をマウントする場合は、マウント パスに加えて、サブ パスを指定することもできます。
- マウント パス: ボリュームをマウントするコンテナー内のパス。
- サブパス: マウントするボリューム内のパス。
サブ パスは省略可能です。 指定しない場合は、ボリューム ルートがマウントされます。
サブ パスは、ボリューム ルートからの相対パスです。 サブパスは /
で始まるべきではありません。
/
で始まるサブ パスを指定すると、コンテナー アプリが起動できなくなる可能性があります。 たとえば、 my-volume-folder
は有効なサブ パスであり、 /my-volume-folder
は有効ではありません。
サブパスは、ボリューム内のフォルダーまたはファイルを参照できます。
サブ パスがフォルダーを参照している場合、マウント パスはコンテナー内の空のフォルダーを参照する必要があります。
サブ パスがファイルを参照している場合、マウント パスはコンテナーにまだ存在しないファイルを参照する必要があります。
たとえば、サブ パスが
my-volume-folder/my-volume-file.txt
され、マウント パスが/my-container-folder/my-container-file
されるとします。 フォルダー/my-container-folder
はコンテナーに既に存在している必要がありますが、ファイルmy-container-file.txt
はまだ含まれていません。
サブ パスの末尾のスラッシュは無視されます。