⚙️

Python 開発を行うための devcontainer.json 設定 2025年版

に公開

devcontainer.jsoncustomizations.vscode の設定のベストプラクティスは
短期間ですぐ変わるので、
この記事では Python 開発を行うために自分が使っている
devcontainer.json の設定とその根拠をまとめています

この設定で使う formatter や linter を一度にインストールして使う方法は
次の記事を参照お願いします:

https://zenn.dev/y_shinoda/articles/python-development-settings-pyproject-toml

.devcontainer/devcontainer.json
{
  // name は何でも構いません
  "name": "Existing Docker Compose (Extend)",
  // root ディレクトリーの compose.yml から読み込むように、次の順に設定します
  // - compose.yml 内の設定で使われている相対パスは
  //   最初に読み込んだ compose.yml が基準となるため
  // - 後に読み込んだ compose.yml の設定が先に読み込んだ設定を上書きするため
  "dockerComposeFile": [
    "../compose.yml",
    "./compose.yml"
  ],
  "service": "your-service-name-here",
  // [Add dev container configuration files...] を選択すると追加される
  // devcontainer.json のテンプレートでは
  // `/workspaces/${localWorkspaceFolderBasename}` となっていますが、
  // clone repository in container volume 方式の
  // Developing inside a Container を行わない限り
  // 次の設定で問題ありません:
  // - VS Code + Docker Desktop デフォルトが親ディレクトリーをマウントする設定の理由
  //   https://zenn.dev/y_shinoda/articles/reasons-why-parent-folder-is-mounted-by-default
  "workspaceFolder": "/workspace",
  "customizations": {
    "vscode": {
      "extensions": [
        // Google 検索の回数を減らすため
        "GitHub.copilot",
        // スペルミスを減らすため
        "streetsidesoftware.code-spell-checker",
        // pyproject.toml の文法チェックのため
        "tamasfe.even-better-toml",
        // Python コードのフォーマット / Lint の結果をコード上に表示するため
        "charliermarsh.ruff",
        // Python コードの VS Code 上での文法チェックやジャンプなどを可能にするため
        "ms-python.python",
        // Python コードの Lint の結果をコード上に表示するため
        "ms-python.flake8",
        // Python コードの型チェックの結果をコード上に表示するため
        "ms-python.mypy-type-checker",
        // Python コードの Lint の結果をコード上に表示するため
        "ms-python.pylint",
        // Python コードのセキュリティチェックの結果をコード上に表示するため
        "pycqa.bandit-pycqa",
        // Python コード保存時に docformatter を実行するため
        "emeraldwalk.RunOnSave"
      ],
      "settings": {
        "[python]": {
         // Python コードのフォーマットを Ruff で行わせるため
          "editor.defaultFormatter": "charliermarsh.ruff",
          // Python ファイル保存時に可能なフォーマットをすべて実行させるため
          "editor.codeActionsOnSave": {
            "source.fixAll": "explicit",
            "source.organizeImports": "explicit"
          },
          // Python ファイル保存時に自動的にフォーマットさせるため
          "editor.formatOnSave": true
        },
        // 拡張機能: pycqa.bandit-pycqa に
        // pyproject.toml の設定内容で bandit を実行させるため
        "bandit.args": [
          "--configfile",
          "pyproject.toml"
        ],
        // プロジェクト中の専門用語を
        //  settings.json ではない独立したファイルに登録するため:
        // - streetsidesoftware/vscode-spell-checker: A simple source code spell checker for code
        //   https://github.com/streetsidesoftware/vscode-spell-checker?tab=readme-ov-file#project--workspace-dictionary-using-vs-code-settings
        "cSpell.customDictionaries": {
          "project-words": {
            "name": "project-words",
            "path": "${workspaceRoot}/project-words.txt",
            "description": "Words used in this project",
            "addWords": true
          }
        },
        // Python コード保存時に docformatter を実行するため
        "emeraldwalk.runonsave": {
          "commands": [
            {
              "match": ".*\\.py",
              "cmd": "uv run docformatter --in-place ${file}"
            }
          ]
        }
      }
    }
  }
}

Discussion