スクリプトのお勉強

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 に記載されているように、このアプローチはチーム開発において非常に強力です。新しいメンバーも、リポジトリをクローンしてコンテナで開くだけで、すぐに開発を始めることができます。

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

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

執筆者:

関連記事

小ネタ: Ansible , with_itemsをloopに変える方法

とっても小さい小ネタです。 Ansible 2.4(今現在) -> Ansible 2.9に変えたい Ansibleを使用していますが、だいたい2.4ぐらいを使っています。流石にバージョンアップしない …

pysnmp v6 から v7 への移行

はじめに 前回の記事でPythonによるSNMPTrapの送信について記事を書きました。 その後、PythonからのSNMPTrap送信する方法を調査したら、方法が変わっていることに気づきしました。 …

CentOS7 + Django2.2 + uwsgi + nginx 連携方法

Djangoとnginx連携方法 以前はApache経由で連携しましたが、今回はnginxと連携する方法を記述します。 環境 設定した環境は以下です。 OS: CentOS7Python3.6.8 ( …

CentOS7をRocky Linux 9に移行する

このVMのOSをCentOS7にした関係上、そろそろupdateする必要があります。そもそもCentOS7を選択した理由は、仕事で使用するからでした。 で、仕事ではRocky Linux 9なので、こ …

PyWebIOでform 入力+ REST API呼び出しを作ってみる

仕事柄、簡単なWebアプリを作りたいと思うことはよくあり、その場合はその場で直せるスクリプトで書きたいとよく思うものです。 すごーく簡単なフォームを非常に簡単に使いたいので、まずは簡単に作れるフレーム …

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