Azure App Service on Linux の FAQ

App Service on Linux のリリースでは、機能の追加とプラットフォームの品質向上に取り組んでいます。 この記事では、最近お客様からお問い合わせのあったご質問に回答しています。

ご不明な点がある場合は、この記事についてのコメントをお寄せください。

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

プラットフォームに用意されている組み込みの Docker コンテナーをフォークしたいと思っています。 これらのファイルはどこで入手できますか。

すべての Docker ファイルは GitHub にあります。

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

スタック 必要な値
Java SE ご自分の JAR アプリを起動するコマンド (例: java -jar /home/site/wwwroot/app.jar --server.port=80)
Tomcat 必要なすべての構成を実行するスクリプトの場所 (例: /home/site/deployments/tools/startup_script.sh)
Node.js PM2 構成ファイルまたは独自のスクリプト ファイル
.NET Core dotnet <myapp>.dll としてコンパイルされた DLL 名
PHP 省略可能なカスタム スタートアップ
Python 省略可能なスタートアップ スクリプト
Ruby ご自分のアプリの初期化に使用する Ruby スクリプト

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

管理

Azure Portal で [再起動] ボタンを押すと何が起こりますか。

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

アプリ コンテナーの仮想マシン (VM) への接続に Secure Shell (SSH) を使用できますか。

はい、ソース管理 (SCM) サイトからご利用いただけます。

注意

SSH、SFTP、または Visual Studio Code (ライブ デバッグ Node.js アプリ用) を使用して、ローカル開発用コンピューターから直接アプリ コンテナーに接続することもできます。 詳細については、Linux での App Service のリモート デバッグと SSH に関するページをご覧ください。

SDK または Azure Resource Manager テンプレートから Linux App Service プランを作成するにはどうすればよいですか。

アプリ サービスの 予約済み フィールドを true に設定します。

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

自分の Web アプリでは、Docker Hub 上のイメージを更新した後も、古い Docker コンテナー イメージを引き続き使用しています。 カスタム コンテナーの継続的な統合およびデプロイをサポートしていますか。

はい、Azure Container Registry または DockerHub の継続的インテグレーションと継続的デプロイをセットアップするには、「Azure Web App for Containers での継続的デプロイ」をご覧ください。 プライベート レジストリでは、Web アプリを停止してから起動することでコンテナーを更新できます。 または、ダミー アプリケーション設定を変更または追加して、コンテナーを強制的に更新できます。

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

はい。

'WebDeploy/MSDeploy' を使用して Web アプリをデプロイすることはできますか。

はい。WEBSITE_WEBDEPLOY_USE_SCM というアプリ設定を false に設定する必要があります。

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

Linux Web アプリに対して Git デプロイが失敗する場合は、以下のいずれかのオプションを選択してアプリケーション コードをデプロイします。

  • 継続的配信 (プレビュー) 機能を使用する:ご自分のアプリのソース コードを、Azure DevOps の Git リポジトリか GitHub リポジトリに格納して、Azure の継続的デリバリーを使用できます。 詳しくは、Linux Web アプリに対して継続的配信を構成する方法に関するページをご覧ください。

  • ZIP デプロイ API を使用する: この API を使用するには、Web アプリに SSH で接続し、コードをデプロイするフォルダーに移動します。 次のコードを実行します。

    curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy
    

    curl コマンドが見つからないというエラーが表示される場合は、curl コマンドを実行する前に apt-get install curl を使用して curl をインストールしてください。

言語のサポート

Web ソケットを Node.js アプリケーションで使用したいと考えています。特別な設定や構成が必要でしょうか。

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

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

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

はい。

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

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

カスタム コンテナー

ACR からイメージをプルするとき App Service によるマネージド ID を使用できますか?

はい、この機能は、Azure CLI から使用できます。 システム割り当てまたはユーザー割り当て の ID を使用できます。 この機能は現在、Azure Portal ではサポートされていません。

自分が所有するカスタム コンテナーを使用しています。 プラットフォームを SMB 共有の `/home/` ディレクトリにマウントさせたいと考えています。

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

カスタム コンテナーの起動に時間がかかり、起動が終了する前にプラットフォームがコンテナーを再起動します。

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

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

http:// または https:// を含む完全なレジストリ URL を入力します。

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

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

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

複数のポートの公開はサポートされていません。

自分が所有するストレージを持ち込むことはできますか?

はい、ストレージの持ち込みはプレビュー段階です。

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

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

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

いいえ、共有フロントエンドでの HTTPS の終了はプラットフォームが処理します。

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

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

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

はい、.NET Core アプリを起動する前に環境変数を上書きしてください。 例: init.sh スクリプト: export ASPNETCORE_URLS={値}

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

複数コンテナーで使用するように、Azure Container Registry (ACR) を構成する方法を教えてください。

複数コンテナーで ACR を使用するには、すべてのコンテナー イメージ を同じ ACR レジストリ サーバーでホストする必要があります。 コンテナーを同じレジストリ サーバーに配置したら、アプリケーション設定を作成し、Docker Compose の構成ファイルに ACR のイメージ名を含めて更新する必要があります。

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

  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_URL (完全な URL、例: https://<server-name>.azurecr.io)
  • DOCKER_REGISTRY_SERVER_PASSWORD (ACR 設定で管理者アクセスを有効にする)

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

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

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

  • アクセスできるコンテナーは 1 つのみ
  • ポート 80 および 8080 のみがアクセス可能 (公開ポート)

アクセス可能なコンテナーを判断するためのルールを次に示します (優先順)。

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

depends_on の操作方法を教えてください。

この depends_on オプションは、App Service では "サポートされていない" ため、無視されます。 Docker からのスタートアップとシャットダウンの制御の推奨事項のとおり、Azure 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)

Web ソケット

Web Sockets は Linux アプリでサポートされています。

重要

Web Sockets は、Free App Service プランの Linux アプリでは現在サポートされていません。 この制限の解消に取り組んでおり、Free App Service プランで最大 5 個の Web ソケット接続をサポートする計画を立てています。

料金と SLA

一般的にサービスが利用できる現在の料金を教えてください。

料金は SKU とリージョンによって異なりますが、料金ページで詳細を確認できます。「App Service の価格」を参照してください。

その他の質問

Linux コンテナー内でポートを指定するための操作方法を教えてください。

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

ファイル ベースのデータベース (SQLite など) を Linux Webapp と一緒に使用できますか。

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

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

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

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

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