よく寄せられる質問 (FAQ) - Azure App Service on Linux

概要

この記事では、App Service on Linuxに関する一般的な質問に回答します。

組み込まれているイメージ

ランタイム スタックを構成する場合、[スタートアップ ファイル] セクションではどのような値が有効ですか。

次の表に、各スタックに必要な値を示します。

スタック 予測値
Java Platform、Standard Edition (Java SE) JAR アプリを起動するコマンド (たとえば、 java -jar /home/site/wwwroot/app.jar --server.port=80)
Tomcat 必要な構成を実行するスクリプトの場所 (たとえば、 /home/site/deployments/tools/startup_script.sh)
Node.js プロセス マネージャー 2 (PM2) 構成ファイルまたはスクリプト ファイル
.NET コア コンパイル済みの DLL 名 dotnet <myapp>.dll
PHP オプションのカスタム スタートアップ
Python オプションのスタートアップ スクリプト
Ruby アプリを初期化する Ruby スクリプト

これらのコマンドまたはスクリプトは、組み込みの Docker コンテナーが起動した後、アプリケーション コードが開始される前に実行されます。

管理

Azure ポータルで再起動ボタンを選択するとどうなりますか?

このアクションは Docker の再起動と同じです。

Secure Shell (SSH) プロトコルを使用してアプリ コンテナー仮想マシン (VM) に接続できますか?

はい。Azure ソース管理 (SCM) サイト経由で接続できます。

SSH、Secure File Transfer Protocol (SFTP)、または Visual Studio (VS) コードを使用して、ローカル コンピューターからアプリ コンテナーに接続することもできます。

SDK または Azure Resource Manager (ARM) テンプレートを使用して Linux App Service プランを作成するにはどうすればよいですか?

App Service の [ reserved ] フィールドを [ true] に設定します。

継続的インテグレーションと継続的配置

Web アプリでは、Docker Hubで更新した後も、古い Docker コンテナー イメージが使用されます。 カスタム コンテナーの継続的インテグレーションとデプロイ (CI/CD) をサポートしていますか?

はい。CI/CD はサポートされています。 詳細については、「 Web App for Containers を使用した継続的デプロイ」を参照してください。

ステージング環境はサポートしていますか。

Yes.

WebDeploy/MSDeploy を使用できますか?

はい。 WEBSITE_WEBDEPLOY_USE_SCM 設定を false に設定します。

Linux Web アプリを使用して Git のデプロイが失敗する。 この問題を回避する方法はありますか。

次のいずれかのオプションを使用します。

  • Azure DevOps または GitHub で Azure 継続的デリバリーを使用します。
  • zipdeploy API を使用し、ローカル コンピューターから次のコマンドを実行します。
curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy

言語のサポート

Node.js アプリケーションで Web ソケットを使用する必要があります。 設定する特別な設定や構成はありますか?

はい、サーバー側の Node.js コードで perMessageDeflate を無効にします。 たとえば、 socket.ioを使用している場合は、次のコードを使用します。

const io = require('socket.io')(server,{
  perMessageDeflate: false
});

コンパイルされていない .NET Core アプリはサポートされていますか。

Yes.

PHP アプリの依存関係マネージャーとして Composer はサポートされていますか。

Yes. Git デプロイ中に、Kudu は PHP アプリケーションをデプロイしていることを検出する必要があります ( composer.lock ファイルが存在するため)。 その後、Kudu によって Composer のインストールがトリガーされます。

カスタム コンテナー

Azure Container Registryからイメージをプルするときにマネージド ID を使用できますか?

Yes. (Azure portal ではなく) Azure CLI を使用します。 システム割り当て ID またはユーザー割り当て ID を使用できます。

自分が所有するカスタム コンテナーを使用しています。 プラットフォームでサーバー メッセージ ブロック (SMB) 共有を /home/ ディレクトリにマウントする必要があります。 これは可能ですか?

WEBSITES_ENABLE_APP_SERVICE_STORAGE設定が指定されていないか false に設定されている場合、/home/ ディレクトリはスケール インスタンス間で共有されないため、書き込まれたファイルは再起動しても保持されません。 WEBSITES_ENABLE_APP_SERVICE_STORAGE明示的に true に設定すると、マウントが有効になります。 これが true に設定されたら、マウントを無効にするには、 WEBSITES_ENABLE_APP_SERVICE_STORAGE明示的に false に設定する必要があります。

コンテナーが "デバイスに空き領域がありません" というメッセージで開始できません。 このエラーはどういう意味ですか? 「承認済みの標準 DCasV5/ECasv5 ファミリ コア クォータを超過するため、操作を完了できませんでした。」

App Service on Linux では、次の 2 種類のストレージが使用されます。

  • ファイル システム ストレージ: ファイル システム ストレージは、App Service プランのクォータに含まれています。 これは、 /home ディレクトリにルート化された永続ストレージにファイルが保存されるときに使用されます。
  • ホスト ディスク領域: ホスト ディスク領域は、コンテナー イメージを格納するために使用されます。 Docker ストレージ ドライバーを使用してプラットフォームによって管理されます。

ホスト ディスク領域は、ファイル システムのストレージ クォータとは別です。 展開できず、インスタンスごとに 15 GB の制限があります。 ワーカーに任意のカスタムイメージを保存するために使用されます。 ホスト ディスク領域の正確な可用性によっては、15 GB を超える GB を使用できる場合がありますが、これは保証されません。

コンテナーの書き込み可能レイヤーが、/home ディレクトリまたはマウントされたAzure Storage パスの外部にデータを保存する場合、ホスト ディスク領域も消費されます。 プラットフォームは、ホスト ディスク領域を定期的にクリーンアップして、未使用のコンテナーを削除します。 コンテナーが /home ディレクトリの外部に大量のデータを書き込むか、独自のストレージの持ち込み (BYOS) を使用する場合、ホスト ディスク領域の上限を超えると、起動エラーまたはランタイム例外が発生します。 App Service for Linux で実行する場合は、コンテナー イメージをできるだけ小さくし、永続ストレージまたは BYOS にデータを書き込みます。 これが不可能な場合は、App Service プランのホスト ディスク領域が固定され、App Service プラン内のすべてのコンテナー間で共有されるため、App Service プランを分割します。

カスタム コンテナーの起動に時間がかかり、起動が終了する前にプラットフォームがコンテナーを再起動します。 これを解決するにはどうすればいいですか?

コンテナーを再起動する前にプラットフォームが待機する時間を構成できます。 これを行うには、WEBSITES_CONTAINER_START_TIME_LIMIT アプリ設定を目的の値に設定します。 既定値は 230 秒で、最大値は 1800 秒です。

プライベート レジストリ サーバー URL の形式は何ですか?

https://を含む完全なレジストリ URL を指定します。

プライベート レジストリ オプションのイメージ名の形式は何ですか。

プライベート レジストリ URL ( myacr.azurecr.io/dotnet:latest など) を含む完全なイメージ名を追加します。 カスタム ポートを使用するイメージ名 は、ポータルから入力できませんdocker-custom-image-nameを設定するには、az コマンドライン ツールを使用します。

カスタム コンテナー イメージで複数のポートを公開できますか。

これはサポートされていません。

独自のストレージ (BYOS) を持ち込むことはできますか?

Yes. BYOS は現在プレビュー段階です。

SCM サイトからカスタム コンテナーのファイル システムや実行中のプロセスを参照できないのはなぜですか。

SCM サイトは別のコンテナーで実行されています。 アプリ コンテナーのファイル システムや実行中のプロセスをチェックすることはできません。

カスタム コンテナーに HTTPS を実装する必要がありますか。

No. プラットフォームは、共有フロントエンドで HTTPS 終了を処理します。

カスタム コンテナーに WEBSITES_PORT を使用する必要がありますか?

Yes. この設定は、カスタム コンテナーに必要です。 カスタム ポートを手動で構成するには、Dockerfile の EXPOSE 命令を使用し、アプリ設定 WEBSITES_PORT ポート値を使用してコンテナーにバインドします。

Docker イメージで ASPNETCORE_URLS を使用できますか?

Yes. .NET Core アプリが起動する前に、必ず環境変数を上書きしてください。 たとえば、 init.sh スクリプトでは、 export ASPNETCORE_URLS={Your value}を使用します。

Docker Compose を使用した複数コンテナー

複数コンテナーで使用するAzure Container Registryを構成するにはどうすればよいですか?

複数コンテナーでAzure Container Registryを使用するには、すべてのコンテナー イメージを同じAzure Container Registry レジストリ サーバーでホストします。 イメージが同じレジストリ サーバー上にある場合は、アプリケーション設定を作成し、Azure Container Registryイメージ名を含むように Docker Compose 構成ファイルを更新します。

次のアプリケーション設定を作成します。

  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_URL (完全な URL を使用します。例: https://<server-name>.azurecr.io)。
  • DOCKER_REGISTRY_SERVER_PASSWORD(Azure Container Registry設定で管理者アクセスを有効にします。

構成ファイル内で、次の例のようにAzure Container Registryイメージを参照します。

image: <server-name>.azurecr.io/<image-name>:<tag>

インターネットにアクセスできるコンテナーを識別する方法を教えてください。

  • アクセス用に開くことができるコンテナーは 1 つだけです。
  • アクセス可能なポートは、ポート 80 と 8080 のみです (公開ポート)。

アクセス可能なコンテナーを決定するための規則を次に示します (優先順位順)。

  • アプリケーション設定 WEBSITES_WEB_CONTAINER_NAME コンテナー名に設定されます。
  • ポート 80 または 8080 を定義する最初のコンテナー。
  • 上記の規則がどちらも当てはまらない場合、ファイルで定義されている最初のコンテナーにアクセス (公開) されます。

depends_onの使用方法

App Service では、 depends_on オプションはサポートされておらず、無視されます。 Docker からの制御の起動とシャットダウンの推奨事項と同様に、App Service マルチコンテナー アプリでは、起動時と切断時の両方で、アプリケーション コードを通じて依存関係を確認する必要があります。

次のコード例は、Redis コンテナーが実行されているかどうかを確認する Python アプリを示しています。

          import time
          import redis
          from flask import Flask
          app = Flask(__name__)
          cache = redis.Redis(host='redis', port=6379)
          def get_hit_count():
              retries = 5
              while True:
                  try:
                      return cache.incr('hits')
                  except redis.exceptions.ConnectionError as exc:
                      if retries == 0:
                          raise exc
                      retries -= 1
                      time.sleep(0.5)
          @app.route('/')
          def hello():
              count = get_hit_count()
              return 'Hello from Azure App Service team! I have been seen {} times.\n'.format(count)
          if __name__ == "__main__":
              app.run(host="0.0.0.0", port=80, debug=True)

WebSocket はサポートされていますか?

WebSocket は Linux アプリでサポートされています。 WebSocket は常に Linux に対して有効になっているため、 webSocketsEnabled ARM 設定は Linux アプリには適用されません。

Important

無料 App Service プランの Linux アプリで WebSocket がサポートされるようになりました。 最大 5 つの WebSocket 接続を使用できます。 この制限を超えると、 HTTP 429 (要求が多すぎます) エラーが発生します

価格とサービス使用許諾契約書 (SLA)

サービスが一般公開された現在の価格は何ですか?

価格は SKU とリージョンによって異なります。 詳細については、価格に関するページ「 App Service の価格」を参照してください。

その他の質問

コンテナー ウォームアップ要求はどのように動作しますか。

App Service がコンテナーを起動すると、ウォームアップ要求によって、アプリケーションの /robots933456.txt エンドポイントに HTTP 要求が送信されます。 このエンドポイントはプレースホルダーですが、アプリケーションは状態コード (5xx を含む) を返して応答する必要があります。 存在しないエンドポイントに HTTP 状態コードを送信してアプリケーション ロジックが応答しない場合、ウォームアップ要求は応答を受信できません。 そのため、コンテナーは永続的に再起動されます。

この既定の動作を変更するには、ウォームアップ エンドポイントのパスと、サイトをウォームアップすると見なす状態コードをカスタマイズします。 WEBSITE_WARMUP_PATHWEBSITE_WARMUP_STATUSESアプリケーションの設定を行います。

また、ポートの構成ミスが原因でウォームアップ要求が失敗する可能性もあります。

コンテナーウォームアップ要求のタイムアウトを増やすことはできますか?

ウォームアップ要求は既定で、コンテナーからの応答を 240 秒待ち、応答がなければ失敗となります。 アプリケーション設定を 240 ~ 1800 秒の値で WEBSITES_CONTAINER_START_TIME_LIMIT 追加することで、コンテナーウォームアップ要求のタイムアウトを増やすことができます。

Linux コンテナーでポートを指定するにはどうすればよいですか?

次の表では、Linux コンテナーでポートを指定する方法について説明します。

コンテナーの種類 Description ポートを設定または使用する方法
組み込みコンテナー Linux アプリの言語またはフレームワーク バージョンを選択した場合は、事前定義済みのコンテナーが選択されます。 アプリ コードを適切なポートにポイントするには、 PORT 環境変数を使用します。
カスタム コンテナー コンテナーは完全に制御できます。 App Service は、コンテナーがリッスンするポートを制御しません。 これに必要な情報は、要求の転送先ポートだけです。 コンテナーがポート 80 または 8080 をリッスンする場合、App Service は自動的に検出できます。 他のポートをリッスンする場合は、 WEBSITES_PORT アプリ設定をポート番号に設定する必要があります。App Service は要求をコンテナー内のそのポートに転送します。 WEBSITES_PORT アプリ設定はコンテナー内に影響を与えません。また、コンテナー内の環境変数としてアクセスすることはできません。

Linux Web アプリでファイル ベースのデータベース (SQLite など) を使用できますか?

アプリケーションのファイル システムは、マウントされたネットワーク共有です。 これにより、コードを複数のホスト間で実行する必要があるスケールアウト シナリオが可能になります。 ただし、データベース ファイルの排他ロックを取得できないため、SQLite などのファイル ベースのデータベース プロバイダーの使用がブロックされます。 Azure SQL、Azure Database for MySQLAzure Database for PostgreSQLなどのマネージド データベース サービスを使用します。

アプリケーションの設定名でサポートされる文字は何ですか。

アプリケーション設定では、英字 (A ~ Z、a ~ z)、数字 (0 ~ 9)、およびアンダースコア (_) のみご利用いただけます。

新機能はどこでリクエストできますか。

アイデアは、Web Apps フィードバック フォーラムで送信できます。 アイデアのタイトルに "[Linux]" を追加してください。

References