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"
]
}
}
}
使い方
前提条件:
- Windows 上に WSL2 がインストールされていること。
- Podman Desktop がインストールされ、WSL2 と連携していること。
- Visual Studio Code と “Dev Containers” 拡張機能がインストールされていること。
プロジェクトを開く:
- VS Code でこのプロジェクトのフォルダを開きます。
- 左下の緑色のアイコンをクリックするか、
Ctrl+Shift+P
でコマンドパレットを開き、"Reopen in Container"
を選択します。
開発開始:
- VS Code が自動的に Docker イメージをビルドし、コンテナを起動します。
- 起動が完了すると、VS Code のターミナルはコンテナ内のシェルに接続され、
src/main_test.py
のようなファイルを編集・実行できるようになります。
まとめ
Dev Container を利用することで、プロジェクトの依存関係をコンテナ内に閉じ込め、クリーンでポータブルな開発環境を簡単に構築できます。特に DEVCONTAINER.md
に記載されているように、このアプローチはチーム開発において非常に強力です。新しいメンバーも、リポジトリをクローンしてコンテナで開くだけで、すぐに開発を始めることができます。
ぜひ、この構成をベースに、ご自身のプロジェクトに合わせてカスタマイズしてみてください。