nikkie-ftnextの日記

イベントレポートや読書メモを発信

そうか、dev containerでも簡単にPython実行環境を用意できるのか!

はじめに

気づいたら はてなトップに 載っていた nikkieです。

PEP 723を一部サポートしたpipxがここのところ好き好きですが、「同じ目的をdev containerでも果たせるのか!」と気づきました。
dev containerという語は聞いたことがありましたが、今回初めて出会った感覚です。

目次

復習:PEP 723を一部サポートしたpipx

以下のようなPythonスクリプトを書いて

# /// script
# dependencies = [
#   "requests<3",
#   "rich",
# ]
# ///

import csv

import requests
from rich.pretty import pprint

resp = requests.get("https://peps.python.org/api/peps.json")
data = resp.json()
peps = [(k, v["title"]) for k, v in data.items()]
pprint(peps[:10])

with open("peps.csv", "w") as f:
    writer = csv.writer(f)
    writer.writerows(peps)

pipx run!!

pipxが仮想環境を用意し、dependenciesをインストールしたうえで、スクリプトを実行してくれます!
開発者は仮想環境の管理が不要🙌

手元の環境を汚さずにサクッとPythonスクリプトを開発・実行できる方法として非常に気に入っています。
似た用途でdev containerも使えることにこのたび気づきました。

dev container

development container、縮めてdev containerです。

A development container (or dev container for short) allows you to use a container as a full-featured development environment.

コンテナを開発環境として使うそうです。

VS Codeで拡張を入れて使っていきます。

今回の環境

  • macOS Sonoma 14.5 (M1 Mac)
  • VS Code 1.90.0
  • DockerはRancher Desktopで
    • Rancher Desktop 1.13.1
    • Docker version 25.0.4-rd
  • ローカル環境のPythonはpyenvで入れてます

dev containerでPythonスクリプトを実行

作業ディレクトリをVS Codeで開き、コマンドパレット1から「Dev Containers: Add Dev Container Configuration Files...」。

  • 「Add configuration to workspace」
  • Python 3」イメージを選択
  • Pythonバージョンは「3.11-bookworm」
  • 拡張は1つも選ばず「OK」
    • VS Codeの拡張が指定できるようです。宿題事項)

できたファイル

.
├── .devcontainer/
│   └── devcontainer.json
└── .github/  # ローカル開発環境用途では消してよさそう
    └── dependabot.yml

.devcontainer/devcontainer.json(コメントは省略)

{
  "name": "Python 3",
  "image": "mcr.microsoft.com/devcontainers/python:1-3.11-bookworm"
}

コマンドパレットで「Dev Containers: Reopen in Container」。
これでVS Codeで開いていたファイルがコンテナ内で開かれました!!
ターミナルでPythonのバージョンを確認すると、3.11の最新のバージョンが入っていることが確認できます

VS Codeに戻るときは「Dev Containers: Reopen Folder Locally」です

生成された設定ファイルだと、Reopen in Container中の書き込みで「Permission denied」となりました。
サクッとPythonスクリプトを開発・実行できる環境を用意するという目的を果たすため、DockerHubにあるpythonイメージを指定しています。

{
  "name": "Python 3",
-  "image": "mcr.microsoft.com/devcontainers/python:1-3.11-bookworm"
+  "image": "python:3.11-bookworm"
}
  • 生成された設定ファイルはvscodeユーザ
    • 書き込み権限がうまく設定できなかった模様
  • python:3.11-bookwormはrootユーザ
    • サクッと環境は用意できたが、rootユーザを使わずに書き込み権限を許可できるならそちらを採用したい(宿題事項)

ここの宿題に関連しそうな記事です

Reopen in Containerしてpip install 'requests<3' richしたら、上記のスクリプトは(pipxがなくても)動きます!

python script.py

dev containerに依存ライブラリをインストール

.devcontainer/devcontainer.jsonに項目を追加

{
  "postCreateCommand": "pip install 'requests<3' rich"
}

これでReopen in Containerのたびのpip installが不要になり、すぐにpython script.pyと実行できました。

終わりに

存在だけ耳にしていたdev containerを触ってみました。
コンテナを開発環境にしちゃおうという試み!
コンテナは使い捨てられるので、心置きなく依存ライブラリをインストールできます。

使いこなしていくうえでキャッチアップの余地が大いにありますが、可能性を感じました!

昨年のPyCon APACより、積ん読リストです。
Dev Containers時代のPython開発環境のあり方


  1. macOSでは⇧⌘P