スクリプトのお勉強

WSL2 と Dev Container で実現する快適な Python 開発環境

投稿日:

WSL2 と Dev Container で実現する快適な Python 開発環境

はじめに

こんにちは!今回は、WSL2 (Windows Subsystem for Linux 2) と Visual Studio Code の Dev Container 機能を使って、クリーンで再現性の高い Python 開発環境を構築する方法について解説します。

この方法を使うと、プロジェクトごとに独立した開発環境を簡単に用意でき、ローカルマシンを汚すことなく、必要なツールやライブラリをコンテナ内に閉じ込めることができます。

私自身はあまりローカルで作るのは好きではありません。会社の作業では、その会社専用環境用のシステムを作ることが多く、ローカル開発では、その会社専用のシステムを使用できないからです。

でもまぁ、ローカルで作業せざる得ないことも少なくないので、ここでどのような設定が必要なのか書いておきます。

Dev Container とは?

Dev Container(開発コンテナ)は、VS Code の拡張機能の一つで、Docker コンテナを完全な機能を備えた開発環境として利用できるようにするものです。

設定ファイルをプロジェクトに含めることで、自分の開発環境がどこにいったっけ?と考える必要がなくなります。また、チームメンバー全員が同じ開発環境を簡単に再現できます。

このプロジェクトの構成

今回解説する環境のファイル構成は以下のようになっています。ここに置いてあります。

.
├── DEVCONTAINER.md
├── Dockerfile
├── README.md
├── .devcontainer/
│   ├── devcontainer-docker-compose.yml
│   ├── devcontainer.json
│   └── docker-compose.yml
└── src/
    └── main_test.py

主要なファイルとその役割

1. .devcontainer/devcontainer.json

Dev Container の中核となる設定ファイルです。このファイルで、使用する Docker イメージやコンテナの設定、VS Code 拡張機能などを定義します。

{
  "name": "devcontainer_with_docker",
  "dockerComposeFile": [
    "docker-compose.yml",
    "devcontainer-docker-compose.yml"
  ],
  "service": "devcontainer",
  "workspaceFolder": "/workspace",
  "shutdownAction": "stopCompose"
}

  • name: Dev Container の名前です。
  • dockerComposeFile: 使用する Docker Compose ファイルを指定します。
  • service: 開発環境として使用するサービスを docker-compose.yml から指定します。
  • workspaceFolder: コンテナ内で開くワークスペースのパスです。

2. Dockerfile

開発環境のベースとなる Docker イメージを定義します。

FROM rockylinux:9

# Docker build-arg for the target architecture
ARG TARGETARCH

# 1. Update and install basic dependencies
RUN dnf update -y && \
    dnf install -y --allowerasing python3.12 python3.12-pip gcc && dnf clean all

# 2. Install Node.js
RUN curl -fsSL https://rpm.nodesource.com/setup_lts.x | bash - && \
    dnf install -y nodejs && \
    dnf clean all

# 3. Install nfpm for the correct architecture
RUN ARCH=${TARGETARCH:-amd64} && \
    if [ "$ARCH" = "amd64" ]; then ARCH_SUFFIX="x86_64"; else ARCH_SUFFIX=$ARCH; fi && \
    curl -L "https://github.com/goreleaser/nfpm/releases/download/v2.38.0/nfpm_2.38.0_Linux_${ARCH_SUFFIX}.tar.gz" | tar -xz -C /usr/local/bin nfpm && \
    chmod +x /usr/local/bin/nfpm

# 4. Install Task
RUN curl -sL https://taskfile.dev/install.sh | sh -s -- -d -b /usr/local/bin

ここでは、rockylinux:9 イメージをベースに、Python 3.12, Node.js, nfpm, Taskといった開発に必要なツールをインストールしています。これにより、バックエンドからフロントエンド、さらにはパッケージングまで対応可能な開発環境を構築しています。

その他には以下を追加したほうがいいかもしれません。

  • fpm
    • パッケージングツール。ruby実装。
  • dart-sass
    • sassのコンパイルに使用
  • リンター/フォーマッター
    • ruffとかインストールしてformatさせる
    • フォーマッターは環境と別にしたいので入れなかった

3. .devcontainer/docker-compose.yml & devcontainer-docker-compose.yml

docker-compose を使って、開発環境を構成する際に使用します。本環境ではDockerfileベースにしてありますので、docker-composeを使用する場合は適宜devcontainer.jsonをdevcontainer-docker-compose.jsonに変更してください。

docker-compose.yml:

version: '3.8'
services:
  app:
    build:
      # WSL2 does not support build context as a relative path
      # context: current directory(fullpath)..
      dockerfile: ../Dockerfile
    volumes:
      - ..:/workspace:cached
    command: sleep infinity

  • build: Dockerfile の場所を指定してイメージをビルドします。
  • volumes: ホストマシンのプロジェクトディレクトリ (..) をコンテナ内の /workspace にマウントします。これにより、ホストマシンで行ったコードの変更が即座にコンテナに反映されます。
  • command: sleep infinity: コンテナが起動し続けるようにするためのコマンドです。

devcontainer-docker-compose.json:

{
    "name": "Docker Compose",
    "dockerComposeFile": "docker-compose.yml",
    "service": "app",
    "workspaceFolder": "/workspace",
    "customizations": {
        "vscode": {
            "extensions": [
                "ms-python.python"
            ]
        }
    }
}

使い方

  1. 前提条件:

    • Windows 上に WSL2 がインストールされていること。
    • Podman Desktop がインストールされ、WSL2 と連携していること。
    • Visual Studio Code と “Dev Containers” 拡張機能がインストールされていること。
  2. プロジェクトを開く:

    • VS Code でこのプロジェクトのフォルダを開きます。
    • 左下の緑色のアイコンをクリックするか、Ctrl+Shift+P でコマンドパレットを開き、"Reopen in Container" を選択します。
  3. 開発開始:

    • VS Code が自動的に Docker イメージをビルドし、コンテナを起動します。
    • 起動が完了すると、VS Code のターミナルはコンテナ内のシェルに接続され、src/main_test.py のようなファイルを編集・実行できるようになります。

まとめ

Dev Container を利用することで、プロジェクトの依存関係をコンテナ内に閉じ込め、クリーンでポータブルな開発環境を簡単に構築できます。特に DEVCONTAINER.md に記載されているように、このアプローチはチーム開発において非常に強力です。新しいメンバーも、リポジトリをクローンしてコンテナで開くだけで、すぐに開発を始めることができます。

ぜひ、この構成をベースに、ご自身のプロジェクトに合わせてカスタマイズしてみてください。

-スクリプトのお勉強
-,

執筆者:

関連記事

小ネタ: Python のdataclass でNone or “”を使わないJSONデータを定義する

PythonをREST APIのクライアントとして作成する際、dataclassesを使用しようと思いました。型が見た瞬間分かるし、しっかりしているからです。 でも、そのREST API は&#822 …

unconstant – perlライブラリ

ちょっとだけperlの機能修正をしたので、そのときに使用したライブラリについて書こうと思います。 perlのunconstant です。 use constantの解除 use constantとは固 …

pipenv + Apache + Django起動設定

仕事でwebアプリケーションを作成しています。 Djangoで作成し、webサーバをApache、環境をpipenvで設定したpython3環境上で動かす予定です。 Apacheが起動するまでに、苦労 …

seaborn + Pandas + Python によるグラフ描画(その2: グラフ描画編)

前回の続き 前回の続きです。 折れ線グラフ まずは折れ線グラフを描画したいと思います。 描画するのは以下です。 運用商品(4つ)日経平均 以下で起動します。引数(dataset-2017-201908 …

神奈川県横浜市神奈川区のワクチン接種地図作った

作ってみた。東白楽駅を真ん中にしてみました。なんとなく真ん中な感じなので。 データ元 以下のテキストデータからゴニョゴニョしてます。 https://www.city.yokohama.lg.jp/k …

google オプトアウト Click here to opt-out.