🛠️

DevContainersを使ってコンテナ内でコードをデバッグしてみる

2024/09/30に公開

はじめに

今回はVSCodeの拡張機能であるDevContainersを使用して、コンテナ内でflaskコードをデバッグする環境のサンプルを作ってみます!

インストール

VSCodeに以下の拡張機能をインストールします。
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers

DevContainersはDockerコンテナ上での開発をサポートするツールです。
ローカル環境に固有の拡張機能やライブラリをインストールせずにVSCode上で開発・デバッグが可能となります。
https://code.visualstudio.com/docs/devcontainers/containers

作成サンプル

以下の構成でサンプルを作成します。
今回はDevContainersの使用が目的のため、app.pyに記載のエンドポイントにアクセスすると現在時刻を表示するだけの簡易なコードとなっています。

ディレクトリ構成
DevContainersSample/
├── .devcontainer/
│   └── devcontainer.json
├── .vscode/
│   └── launch.json
├── app.py
├── docker-compose.yml
├── Dockerfile
└── requirements.txt

devcontainer.json

開発コンテナの設定を保存するファイルです。
プロジェクトのルート配下に.devcontainer/devcontainer.jsonか、.devcontainer.jsonとして作成する必要があります。

devcontainer.json
{
    // プロジェクト名
    "name": "Flask Debug Sample",
    // docker-compose.ymlのパス
    "dockerComposeFile": "../docker-compose.yml",
    // コンテナに接続する時に開くフォルダ
    "workspaceFolder": "/app",
    // 接続するサービス名(docker-compose.ymlを使用する場合は必須)
    "service": "flask-debug-sample",
    // コンテナで使用する設定・インストールする拡張機能
    "customizations": {
        "vscode": {
            "extensions": [
                "ms-python.python" // Pythonの拡張機能をインストール
            ]
        }
    }
}

各設定値は下記を参照ください。
https://containers.dev/implementors/json_reference/

その他サンプルファイル

launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python Debugger: Flask",
            "type": "debugpy",
            "request": "launch",
            "module": "flask",
            "env": {
                "FLASK_APP": "app.py",
                "FLASK_DEBUG": "1",
            },
            "args": [
                "run",
                "--host=0.0.0.0",
                "--port=8000"
            ],
            "jinja": true,
            "autoStartBrowser": false
        }
    ]
}
  • app.py
    @app.route('/')にアクセスされると現在時刻を表示するだけの機能です。
app.py
from flask import Flask
from datetime import datetime

app = Flask(__name__)


@app.route('/')
def currenttime():
    currenttime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    return 'Current time is: ' + currenttime

  • docker-compose.yml
docker-compose.yml
version: "3"

services:
  flask-debug-sample:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: flask-debug-sample
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    tty: true
  • Dockerfile
Dockerfile
FROM python:3

ENV TZ Asia/Tokyo

WORKDIR /app

COPY . /app
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

  • requirement.txt
requirement.txt
flask

コンテナ起動〜デバッグ実行

  1. VSCodeのコマンドパレットに>Dev Containers: Reopen in Containerを入力すると、コンテナがビルドされ、.devcontainer/devcontainer.jsonで設定していたサービスがVSCodeで起動します。

    ビルド中

    devcontainer.jsonで設定したサービスがVSCodeで開かれる
  2. ブレイクポイントを設定してlaunch.jsonで設定した設定で起動すると...デバッグ実行できていることが確認できました!

まとめ

今回はDevContainersを使用して、コンテナ内のコードをデバッグしてみました。
もっと良いデバッグ、開発環境の設定等ございましたらぜひお教えください!

参考

https://code.visualstudio.com/docs/devcontainers/create-dev-container
https://code.visualstudio.com/docs/python/debugging

レスキューナウテックブログ

Discussion