VS Codeのエージェントモードを拡張するには、を試してください!

コンテナ内のPython

このチュートリアルでは、以下の方法を学習します。

  • シンプルな Python コンテナーを記述する Dockerfile ファイルを作成する。
  • DjangoFlask、または汎用Pythonアプリのビルド、実行、機能の検証を行う。
  • コンテナーで実行されているアプリをデバッグする。

前提条件

  • マシンにDockerをインストールし、システムパスに追加する。

  • Linuxでは、VS Codeの実行に使用する非rootユーザーアカウントに対してDocker CLIを有効にする必要があります。

  • Container Tools拡張機能。拡張機能をインストールするには、拡張機能ビュー(⇧⌘X (Windows, Linux Ctrl+Shift+X))を開き、container toolsと検索して結果を絞り込み、Microsoftが作成したContainer Tools拡張機能を選択します。

    Select Container Tools extension

Pythonプロジェクトを作成する

Pythonプロジェクトをまだお持ちでない場合は、チュートリアル「Pythonの概要」に従ってください。

:完全なDjangoまたはFlaskウェブアプリをコンテナ化したい場合は、以下のいずれかのサンプルから始めることができます。

:このチュートリアルでは、サンプルリポジトリのtutorialブランチを使用してください。

アプリが正しく動作することを確認したら、アプリケーションをコンテナ化できます。

プロジェクトにDockerファイルを追加する

  1. VS Codeでプロジェクトフォルダを開きます。

  2. コマンドパレット⇧⌘P (Windows, Linux Ctrl+Shift+P))を開き、Containers: Add Docker Files to Workspace... を選択します。

    Add Dockerfile to a Python project

  3. アプリの種類を尋ねられたら、Python: DjangoPython: Flask、またはPython: Generalを選択します。このチュートリアルでは、Python: Generalのケースに焦点を当てますが、DjangoとFlaskに関する注意点も記載します。

  4. アプリのエントリポイントへの相対パスを入力します。これは、作業を開始したワークスペースフォルダを除外します。Pythonの概要チュートリアルに従ってhello.pyでPythonアプリを作成した場合は、それを選んでください。

    Django: manage.py(ルートフォルダ)またはsubfolder_name/manage.pyを選択します。Django公式ドキュメントを参照してください。

    Flask: Flaskインスタンスを作成するパスを選択します。Flask公式ドキュメントを参照してください。

    ヒント:このフォルダに__main__.pyファイルが含まれている限り、フォルダ名へのパスを入力することもできます。

  5. ポート番号を選択します。rootユーザーとして実行することによるセキュリティ上の懸念を軽減するため、ポート1024以上を選択することをお勧めします。未使用のポートであればどれでも利用できますが、DjangoとFlaskは標準のデフォルトポートを使用します。

    Django: デフォルトポートは8000です。

    Flask: デフォルトポートは5000です。

  6. Docker Composeを含めるかどうか尋ねられたら、Docker Composeファイルが不要な場合はいいえを選択します。はいを選択した場合、Compose Upコマンドを正常に実行するために、Dockerfile内のwsgi.pyファイルへのパスを確認する必要があります。Composeは通常、複数のコンテナを同時に実行する場合に使用されます。

  7. このすべての情報をもとに、Container Tools拡張機能は以下のファイルを作成します。

    • Dockerfile。このファイルでのIntelliSenseの詳細については、概要を参照してください。

    • .git.vscode__pycache__などの不要なファイルやフォルダを除外してイメージサイズを削減するための.dockerignoreファイル。

    • Docker Composeを使用している場合は、docker-compose.ymlおよびdocker-compose.debug.ymlファイル。

    • まだ存在しない場合は、すべてのアプリの依存関係をキャプチャするためのrequirements.txtファイル。

    重要事項: この設定を使用するには、Pythonフレームワーク(Django/Flask)とGunicornがrequirements.txtファイルに含まれている必要があります。仮想環境/ホストマシンにこれらの前提条件がすでにインストールされており、コンテナ環境と同一である必要がある場合は、ターミナルでpip freeze > requirements.txtを実行してアプリの依存関係が移植されていることを確認してください。これにより、現在のrequirements.txtファイルが上書きされます。

(オプション) イメージに環境変数を追加する

このステップは必須ではありませんが、コンテナの環境に設定する必要がある環境変数を追加する方法を理解するのに役立つように含まれています。

Container Tools拡張機能は、IntelliSenseを使用してDockerファイルの作成を支援し、自動補完とコンテキストに応じたヘルプを提供します。この機能の動作を見るには、

  1. Dockerfileを開きます。

  2. EXPOSEステートメントの下で、IntelliSenseをトリガーするために⌃Space (Windows, Linux Ctrl+Space)と入力し、ENVまでスクロールします。

    Adding environment variable to Dockerfile

  3. TabまたはEnterを押してステートメントを完了し、keyを変数名に、valueを値に設定します。

Dockerfileでの環境変数の設定と使用に関する詳細については、DockerドキュメントのENV命令と環境置換セクションを参照してください。

DjangoおよびFlaskアプリのGunicorn修正

Pythonウェブ開発者に優れた出発点を提供するために、デフォルトのウェブサーバーとしてGunicornを使用することにしました。デフォルトのDockerfileで参照されているため、requirements.txtファイルに依存関係として含まれています。requirements.txtにGunicornが見つからない場合は、pip install gunicornを実行し、次にpip freeze > requirements.txtを実行してrequirements.txtファイルを再生成してください。

  • Django: Gunicornを使用するには、アプリケーション呼び出し可能オブジェクト(アプリケーションサーバーがコードと通信するために使用するもの)をエントリポイントとしてバインドする必要があります。この呼び出し可能オブジェクトは、Djangoアプリケーションのwsgi.pyファイルで宣言されます。このバインドを達成するには、Dockerfileの最終行に次のように記述します。

    CMD ["gunicorn", "--bind", "0.0.0.0:8000", "{workspace_folder_name}.wsgi"]
    

    プロジェクトがDjangoのデフォルトのプロジェクト構造(つまり、ワークスペースフォルダと同じ名前のサブフォルダ内にワークスペースフォルダとwsgi.pyファイル)に従っていない場合、正しいwsgi.pyファイルを見つけるためにDockerfile内のGunicornエントリポイントを上書きする必要があります。

    wsgi.pyファイルがルートフォルダにある場合、上記のコマンドの最後の引数は"wsgi"になります。サブフォルダ内にある場合、引数は"subfolder1_name.subfolder2_name.wsgi"となります。

  • Flask: Gunicornを使用するには、アプリケーション呼び出し可能オブジェクト(アプリケーションサーバーがコードと通信するために使用するもの)をエントリポイントとしてバインドする必要があります。この呼び出し可能オブジェクトは、作成したFlaskインスタンスのファイル場所変数名に対応します。Flask公式ドキュメントによると、ユーザーは通常、メインモジュールまたはパッケージの__init__.pyファイルに次のようにFlaskインスタンスを作成します。

    from flask import Flask
    app = Flask(__name__) # Flask instance named app
    

    このバインドを達成するには、Dockerfileの最終行に次のように記述します。

    CMD ["gunicorn", "--bind", "0.0.0.0:5000", "{subfolder}.{module_file}:app"]
    

    Containers: Add Docker Files to Workspace...コマンドの実行中にFlaskインスタンスへのパスを設定しますが、Container Tools拡張機能はFlaskインスタンス変数がappという名前であると仮定します。そうでない場合は、Dockerfile内で変数名を変更する必要があります。

    メインモジュールがルートフォルダにmain.pyという名前のファイルとしてあり、Flaskインスタンス変数がmyappという名前であった場合、上記のコマンドの最後の引数は"main:myapp"になります。サブフォルダ内にある場合、引数は"subfolder1_name.subfolder2_name.main:myapp"となります。

コンテナをビルド、実行、デバッグする

Containers: Add Docker Files to Workspace...コマンドは、デバッグモードでコンテナをビルドおよび実行するためのDocker起動構成を自動的に作成します。Pythonアプリコンテナをデバッグするには、

  1. アプリの起動コードが含まれるファイルに移動し、ブレークポイントを設定します。

  2. 実行とデバッグに移動し、必要に応じてContainers: Python - GeneralContainers: Python - Django、またはContainers: Python - Flaskを選択します。

    Selected container debug configuration

  3. F5キーを使用してデバッグを開始します。

    • コンテナイメージがビルドされます。
    • コンテナが実行されます。
    • Pythonデバッガーがブレークポイントで停止します。
  4. この行を一度ステップオーバーします。

  5. 準備ができたら、続行を押します。

Container Tools拡張機能は、ブラウザをランダムにマップされたポートで起動します。

Django website launches

ヒント:イメージタグの変更など、Dockerビルド設定を変更するには、.vscode -> tasks.jsonファイルのdocker-buildタスクにあるdockerBuild属性に移動します。ファイル内でIntelliSense(⌃Space (Windows, Linux Ctrl+Space))を使用して、他のすべての有効なディレクティブを表示します。

コンテナエクスプローラーを使用する

Container Explorerは、コンテナ、イメージなどのコンテナ資産を調べたり管理したりするためのインタラクティブなエクスペリエンスを提供します。例を見るには、

  1. Container Explorerに移動します。

  2. Containersタブで、コンテナを右クリックし、View Logsを選択します。

    Viewing the logs of a container

  3. 出力はターミナルに表示されます。

Azureでイメージをビルドする

Azure Container Registry: Build Image in Azureコマンドを使用してイメージをビルドし、それをAzure App ServiceまたはAzure Container Appsにデプロイできます。

  1. Azure Resources拡張機能をインストールします。コマンドパレット⇧⌘P (Windows, Linux Ctrl+Shift+P))を開き、Azure: Sign Inコマンドを検索します。Azureアカウントをお持ちでない場合は、無料試用版にサインアップできます。

  2. Azureでビルドコマンドを呼び出す方法は2つあります。Dockerfileを右クリックしてBuild Image in Azureを選択する方法と、コマンドパレット⇧⌘P (Windows, Linux Ctrl+Shift+P))を使用してAzure Container Registry: Build Image in Azureコマンドを検索する方法があります。

    Invoke the command Build Image in Azure

  3. ビルドされたイメージの名前とタグを選択します。これは、コンテナレジストリでイメージを識別するために使用します。

    Choose the name and tag for the built image.

  4. 使用したいAzureサブスクリプションを選択します。

  5. 既存のAzure Container Registryを選択するか、新しいものを作成します。新しいものを作成する際には、名前、リソースグループ、場所、そしてBasic、Standard、Premiumなどの価格オプションを提供するよう求められます。これらのオプションの費用については、価格 - Container Registryで確認できます。

  6. ベースOSとしてLinuxまたはWindowsを指定します。この選択はDockerfileと一致している必要があります。

    Choose the base OS for the built image

イメージのビルドプロセスには数分かかる場合があります。ターミナルで進捗状況を追跡できます。エラー(Error: failed to download context.)が発生した場合は、コンテナレジストリの更新オプションを使用し、再度ビルドをリクエストしてみてください。再ビルドする前に、古いイメージを手動で削除してください。

Azure App ServiceまたはAzure Container Appsにデプロイする

コンテナイメージがビルドされると、指定したタグでContainer Registryに表示されるはずです。ビルドが完了したので、Azure App ServiceまたはAzure Container Appsにデプロイできます。Azure App ServiceへのデプロイにはAzure App Service拡張機能が推奨され、Azure Container AppsへのデプロイにはAzure Container Apps拡張機能が必要です。これら両方は、幅広いAzure開発シナリオ向けのツールパッケージを含むAzure Tools拡張機能パックをインストールすることで入手できます。

  1. イメージタグを右クリックし、Deploy Image to Azure App ServiceまたはDeploy Image to Azure Container Appsを選択します。

    Deploy image to Azure App Service

  2. ウェブサイトの名前を指定します。これは一意の名前である必要があり、Djangoアプリの場合は、settings.pyファイルのALLOWED_HOSTSリストに有効なホスト名として記載されている必要があります。

  3. リソースグループ、場所、およびApp Serviceプランを指定します。始めたばかりの場合は、無料プランを選択できます。

  4. イメージがデプロイされます。このプロセスには数分かかる場合があります。デプロイが完了すると、サイトにアクセスするためのボタン付き通知が表示されます。また、作成時に指定した名前が{appname}となるサイトのアドレス{appname}.azurewebsites.netを使用することもできます。最初うまくいかない場合は、数分後に再度試してください。最初の数回の試行でタイムアウトしたりエラーが返されたりするのは珍しいことではありません。これは単にApp Serviceがまだリクエストを受け取る準備ができていないことを意味します。

  5. いずれかのページに表示されるアプリケーションコードに小さな変更を加え、ファイルを保存します。

  6. Azureアイコンを使用してリソースビューを開き、サブスクリプションのノードを展開して、前の手順でデプロイしたApp Serviceを見つけます。

  7. App Serviceノードを右クリックし、利用可能なオプションを確認します。Deploy to Web Appを選択し、アプリフォルダを指定してデプロイします。

    Deploy to Web App

    以前のデプロイを上書きするという警告が表示されたら、Deployを選択して確認します。

    これには数分かかる場合があります。ターミナルウィンドウで進行状況を監視できます。完了すると、サイトにアクセスするためのボタンが表示されます。

    Browse website button

    ボタンを使用して、変更がサイトに反映されていることを確認します。

おめでとうございます。VS CodeでPythonを使用して、クラウドでホストされインターネット上で公開されているウェブサイトを作成し、デプロイしました!

リソースを解放する

Azureポータルで、この演習中に作成したすべてのリソースを解放するためにリソースグループを削除します。

次のステップ

完了しました!コンテナの準備ができたので、次のことを行いたいかもしれません。