👻

【vscodeを使った python 開発】2. 資材の説明

2024/12/06に公開

この記事について

概要

"【システム開発】vscodeを使った python 開発〜1.まず動かそう〜"で使った資材の説明です。
事前知識として docker についてざっくり知っておいてください。
Qiita にめちゃくちゃわかりやすい記事があるのでとりあえず「前編」だけでも読んでおいてください。(この先ちょこちょこ引用します)

【図解】Dockerの全体像を理解する -前編-

この記事の対象者

  • python で本格的なアプリ開発を始めたい人
  • エンジニア志望の人

この記事のゴール

  • 【システム開発】vscodeを使った python 開発〜1.まず動かそう〜 を動かすためにどういった設定がされているか理解できること
  • 環境がうまく動かなくなったときの原因を推測できるようになること

全体の構成

今回の構成では devcontainer という vscode の拡張機能を使って、vscode から docker を使って作成した、python コンテナ直接アクセスできるようにしています。
以下 devcontainer 公式の説明です。

vscode のDevContainers拡張機能を使用すると、コンテナを完全な開発環境として利用できます。この拡張機能を使うことで、コンテナ内のフォルダにアクセスでき、コンテナを用いた開発で、vscode の全機能を活用できます。プロジェクト内のdevcontainer.jsonファイルの設定を通じて、開発に用いるコンテナへのアクセス方法(作成方法)を、有用なツールや実行環境と共に vscode に定義します。このコンテナは、アプリケーションの実行や、コードベースに必要なツール、ライブラリ、ランタイムの分離に使用できます。
ワークスペースファイルはローカルのファイルシステムからマウントされるか、コンテナ内にコピーまたはクローンされます。拡張機能はコンテナ内にインストールされ、実行されるため「ツール」「プラットフォーム」「ファイルシステム」に完全にアクセスできます。これにより、異なるコンテナに接続するだけで、開発環境全体をシームレスに切り替えることが可能になります。
これにより、ツールやコードがどこにあっても、vscode の「補完機能」「コードナビゲーション機能」や「デバッグ機能」をローカルと同等に利用することができます
Dev Containers拡張機能は、以下の2つの主要な運用モデルをサポートします:
・コンテナをフルタイムの開発環境として使用する
・実行中のコンテナに接続して中身を見ることができる

「なんのこっちゃ」という感じですが、要するに 「今回の資材構成だとコンテナ技術を用いた python の開発を、 PC 本体に python をインストールした時と同じようにできるよ」 ということです。

python を PC 本体にインストールすると「仮想環境が・・・」や「3系か4系か・・・」、「バージョンアップが・・・」など色々めんどくさいのでお勧めしません。。。

資材の詳細

今回の構成を実現する為に特に重要なファイルは下表の通りになります。

目的 資材名
Dockerコンテナを作るのに必要 Dockerfile
docker-compose.yml
vscodeでデバッグするのに必要 devcontaier.json
launch.json

以下、それぞれの資材について詳細に解説していきます。

Dockerfile

Dockerfile では docker Hub からダウンロードした docker image を自分なりにカスタマイズします。
以下、ポイントだけ絞って細かく解説していきます。("#. <番号>" の箇所がポイントです)
参考:Docker Image とはを読んでいる前提でいきます。

# 1. Docker hub から image の取得
FROM python:3.13.0-slim-bullseye
USER root

# 2. よく使うアプリのインストール
RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
RUN apt-get install -y vim less

# 3. pip のインストール
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools

WORKDIR /root/opt/app
  1. Docker hub から image の取得
    docker hub から python 公式イメージのバージョン(tag)"3.13.0-slim-bullseye" を取得します。
    2024年11月時点で一番ちゃんと動きそうなのもの を選んでいます。

tag に "rc" や "0a" などとついているものは、最新で絶賛お試し中のものなので、上手く動かなかったりします。

  1. よく使うアプリのインストール
    apt という パッケージマネージャー を用いて、必要なアプリをインストールします。普段は vscode などのアプリをインストールする時インストーラーをダウンロードして、クリックしていますが、パッケージマネージャーを使うことでコマンドでもインストールができます。
    詳細については下記を参照してください。
    参考)パッケージマネージャーとは(ちょっと難しい)

  2. pip のインストール
    pip という python 開発でよく使うパッケージマネージャー をインストールします。
    これも、一旦「ふーん」くらいで飛ばしてください。

docker-compse.yml

docker-compose.yml ファイルは dockerコンテナを起動させるためのコマンド類をまとめて記載したファイルです。
この辺の起動設定をまとめて記載しているイメージです。
参考させてもらっている「【図解】Dockerの全体像を理解する」の中編に docker-compose について説明してくれいますが、難しいので一旦細かいところは知らなくていいかなと思います。
以下、ポイントだけ絞って細かく解説していきます。("#. <番号>" の箇所がポイントです)

services:
  # 1. サービス名
  python_dev:
    # 2. docker image の指定
    build: ./
    # 3. コンテナ名
    container_name: python_dev
    working_dir : /root/opt/app
    # コンテナの停止を防ぐ呪文
    tty: true
    # 4. ボリュームの設定
    volumes:
      - ./:/root/opt/
  1. サービス名
    コンテナのサービス名です。devcontainer の設定をするときに必要なので一旦ここでは気にしなくていいです。
  2. docker image の指定
    どのイメージを元にしてコンテナを起動するか の設定です。"build: ./" という書き方だと、同じフォルダ(ディレクトリ)にある "Dockerfile" を image として利用する設定になります。
    ここを "image: python:3.13.0-slim-bullseye" と記載すると、docker Hub においてある docker image が直接参照されます。
  3. コンテナ名
    コンテナの名前です。 docker ps コマンドを実行したときに表示されるコンテナ名になります。
  4. ボリュームの設定
    コンテナの中は別の PC みたいなイメージです。なので、操作している PC のエクスプローラーにはコンテナ内のファイルが表示されません。
    "volumes: - ./:/root/opt/" という呪文を入れることで、"docker-compose.yml"ファイルを配置している、フォルダ以下の資材をコンテナと共有(マウント)することができます。

参考:【図解】Dockerの全体像を理解する -中編-

devcontainer.json

devcontainer という vscode の拡張機能を使って vscode から docker を使って作成した、python コンテナ直接アクセスできるようにするための設定ファイルです。
以下、ポイントだけ絞って細かく解説していきます。("#. <番号>" の箇所がポイントです)

{
    "name": "dev contaier",
    # 1. 元にする docker-compose ファイル
    "dockerComposeFile": "../docker-compose.yml",
    # 2. docker-compose のサービス名
    "service": "python_dev",
    "workspaceFolder": "/root/opt",
    # 3. vscode の拡張機能
    "extensions": [
        "ms-python.python" 
    ]
}
  1. 元にする docker-compose ファイル
    「どのコンテナを対象にするか」に関する設定です。"../docker-compose.yml" にある "../" は一つ上のフォルダを指しています。
    devcontainer.json.devcontainer 以下に配置されており、.devcontainerdocker-compose.yml が同じ階層にあるのでこのような書き方になっています。
  2. docker-compose.yml のサービス名
    docker-compose.yml で設定したサービス名を記載します。
  3. vscode の拡張機能
    vscode 上で python を動かす場合に、拡張機能が必要になります。 コンテナ内と操作している PC は仮想的に別の PC になっている ので、コンテナ内の vscode に拡張機能のインストールが必要になります。
    この記述で Microsoft が配布している vscode 用の python 拡張機能をコンテナにインストールしています。

launch.json

launch.json は Visual Studio Code (VSCode) でデバッグ設定を行うためのファイルです。特定のプログラムをどのようにデバッグするか、実行時にどのような環境変数や引数を使用するかを指定します。
以下、ポイントだけ絞って細かく解説していきます。("#. <番号>" の箇所がポイントです)

{   
    "configurations": [
        {
			# 1. デバッグ構成
            "name": "Python: main",
            "type": "python",
            "request": "launch",
            "cwd": "/root/opt/app",
            # 2. 実行モジュール名
            "module": "main",
            # 3. デバッグ対象の指定
            "justMyCode": false,
            "env": {
                "PYTHONPATH": "/usr/local/lib/python3.9/site-packages"
            }
        },
        {
        	# 1. デバッグ構成
            "name": "Python: current file",
            "type": "python",
            "request": "launch",
            "cwd": "/root/opt/app",
            # 4. デバッグ対象のファイル
            "program": "${file}",
            "justMyCode": false,
            "env": {
                "PYTHONPATH": "/usr/local/lib/python3.9/site-packages"
            }
        }
    ]
}
  1. デバッグ構成
    デバッグ構成の名前を指定します。この名前は VSCode のデバッグタブで表示され、ユーザーがどの構成を実行するか選択できます。
    "main" というモジュールをデバッグする場合には "main" というデバッグ構成を、現在開いているファイルをデバッグする場合には "current file" というデバッグ構成をそれぞれ指定します。

  2. 実行モジュール名
    main.py という python ファイルを実行します。コードの行数が増えて、ソースコードファイルを複数に分割したさい、基本的に "main.py" が入口になります。つまり、デバッグ構成名 "main" は python でプログラムを書いた時、最初から実行するためのデバッグ構成になります。

  3. デバッグ対象の指定
    "justMyCode" を "false" にすると、依存ライブラリやフレームワークのコードなど、自分が作ったコード以外の資材もデバッグできるようになります。
    他人の書いたコードは参考になるので python の勉強をするときには false に設定することをお勧めします。

  4. デバック対象ファイル
    デバッグするファイルを指定します。"${file}" は現在開いているファイルを意味します。この設定により、どの Python ファイルでも開いた状態で即座にデバッグを実行可能です。

以上資材の説明でした。

Discussion