これはなに
Visual Studio Code とDocker を使った、Python 開発環境の構築方法を述べる。
本稿で説明する方法により構築した環境はGitHub にあげているため、参照してほしい。
前提条件
- Visual Studio Code をインストールしている
- Docker を利用できる環境が整っている
筆者の環境
- Visual Studio Code
- Docker Desktop for Windows
- Windows 11
環境構築方法
構築の流れは下記のとおりである。
- 必要となるVS Codeの拡張機能をインストールする
- requirements.txtをつくる
- Dockerfileとdevcontainer.jsonをつくる
- VS Codeの機能でDockerfileをbuild&run&attachする
- 開発を開始する
必要となるVS Codeの拡張機能をインストールする
今回はDockerコンテナ内にPython環境を構築し、VS Codeで開発する。 そのため、VS Codeを簡単にDockerコンテナにアタッチできるように、下記の拡張機能を入れる。
requirements.txtをつくる
すでにインストールしたいPythonパッケージが決まっている場合、requirements.txt
ファイルを作成して、そこにパッケージ名を書き込む。
requirements.txt
ファイルを作成することで、pip install -r requirements.txt
コマンドにより、一括でPythonパッケージをインストールできる。
たとえば、``numpyと
matplotlibをインストールしたいなら、
requirements.txt`は次のようになる。
numpy
matplotlib
Dockerfileとdevcontainer.jsonをつくる
.devcontainer
ディレクトリを作り、そこにDockerfile
をつくる。拡張子は要らない。
Dockerfile
には下記の内容をコピペする。
# ベースとなるDockerイメージ
# Pythonのバージョンを変更したい場合は
# https://hub.docker.com/_/python から該当するものを指定する
FROM python:3.11-slim
# Dockerコンテナ内のユーザー名。好きな名前に変えて良い。
ARG USERNAME=user
# この行以降はrootユーザーで実行される
USER root
# 必要なパッケージをインストールする
# locales : 言語の設定に必要
# tzdata : タイムゾーンの設定に必要
# git, ca-certificates, openssh-client : Dockerコンテナ内でgitを使うために必要
RUN apt-get update -y \
&& DEBIAN_FRONTEND=noninteractive \
apt-get install -y --no-install-recommends \
locales \
tzdata \
git \
ca-certificates \
openssh-client \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 言語とタイムゾーンを日本に設定
RUN locale-gen ja_JP.UTF-8 \
&& localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV TZ=Asia/Tokyo \
LANG=ja_JP.UTF-8 \
LANGUAGE=ja_JP:jp \
LC_ALL=ja_JP.UTF-8
# pip関連update
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
# この行以降は`WORKDIR`のディレクトリで実行される
WORKDIR /workspaces
# requirements.txtに書かれたパッケージをインストール
COPY ./requirements.txt requirements.txt
RUN pip install -r requirements.txt
# ユーザー作成
# ユーザーを作成して設定しないとrootで作業してしまうため
RUN groupadd -r $USERNAME && useradd -r -g $USERNAME $USERNAME
RUN mkdir /home/$USERNAME
# この行以降は`$USERNAME`ユーザーで実行される
USER $USERNAME
# Dockerfileをビルドする際に必ずbashを起動する
ENTRYPOINT [ "/bin/bash" ]
途中でGitをインストールしているが、これは必要なければ削除してよい。
次に、同じ.devcontainer
ディレクトリにdevcontainer.json
を作成し、下記をコピペする。
{
"name": "python-base-env-with-docker",
"build": {
"dockerfile": "./Dockerfile",
"context": ".."
},
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-python.black-formatter",
"ms-python.flake8",
"ms-python.isort",
"ms-python.mypy-type-checker"
]
}
}
}
"name"
は任意の名前でよい。"extensions"
には、使いたいVS Codeの拡張機能を入れる。"ms-python.python"
: Pythonの実行に必須"ms-python.black-formatter"
: Pythonのフォーマッター"ms-python.flake8"
: Pythonのリンター"ms-python.isort"
: Pythonのimport順を整理するツール"ms-python.mypy-type-checker"
: Pythonの静的解析ツール
devcontainer.json
に記入した拡張機能はDockerコンテナを立てる際に必ずインストールされる。
必要ではない拡張機能を推奨したい場合は、.vscode/extensions.json
を作成するとよい。
extensions.json
の例を下記に示す。
{
"recommendations": [
"streetsidesoftware.code-spell-checker",
"oderwat.indent-rainbow"
]
}
.vscode/extensions.json
があると、そのディレクトリをVS Codeで開いた際に、推奨される拡張機能をインストールするか聞かれる。
また、拡張機能のタブに@recommended
と入力すると、推奨される拡張機能を一覧でき、まとめてインストールできる。
VS Codeの設定ファイルを作成する
VS Codeの拡張機能を有効にするため、VS Codeの設定ファイルを作成する。
.vscode
ディレクトリを作成し、その中にsettings.json
を作成する。
settings.json
には下記をコピペする。
{
// 改行コードをLFにする
"files.eol": "\n",
// Pythonファイルの設定
"[python]": {
"editor.tabSize": 4,
// フォーマッターをblackに設定する
"editor.defaultFormatter": "ms-python.black-formatter",
// 保存するたびにフォーマッターを動かす
"editor.formatOnSave": true,
},
// flake8とblackで競合する設定を合わせる
// 参照 : https://black.readthedocs.io/en/stable/guides/using_black_with_other_tools.html#flake8
"flake8.args": [
"--ignore=E203,W503",
"--max-line-length=80"
],
"black-formatter.args": [
"--line-length=80"
],
// isortにblackを利用していることを伝える
"isort.args": [
"--profile",
"black"
],
}
VS Codeの機能でDockerfileをbuild&run&attachする
ここまでできたら、先ほど入れたVS Codeの拡張機能Dev Containers を利用して、Dockerコンテナをビルドし起動する。
VS CodeでCtrl + Shift + Pを押すと、コマンドパレットが出てくる。 そのコマンドパレットで「Dev Containers: Reopen in Container」を検索し実行する。 すると、VS CodeでDockerfileをビルドし、コンテナを立て、そのコンテナにVS Codeをアタッチしてくれる。
開発を開始する
ここまでできたら、あとはPythonコードを書いて実行するだけである。 試しに実行してみる。
main.py
ファイルを作成し、下記コードをコピペする。
def add_to_list(i: int, i_list: list = []) -> list:
i_list.append(i)
return i_list
print(add_to_list(1))
print(add_to_list(2))
print(add_to_list(3))
def add_to_list_2(i: int, i_list: list | None = None) -> list:
if i_list is None:
i_list = []
i_list.append(i)
return i_list
print(add_to_list_2(1))
print(add_to_list_2(2))
print(add_to_list_2(3))
コピペしたら、main.py
ファイルを開いた状態で右上にある右向き三角ボタンをクリックする。
すると、main.py
が実行される。
root@51db8ff21947:/workspaces/python-test# /usr/local/bin/python /workspaces/python-debug-test/src/main.py
[1]
[1, 2]
[1, 2, 3]
[1]
[2]
[3]
root@51db8ff21947:/workspaces/python-test#
以上の動作確認ができれば、環境構築は完了である。
おわりに
この環境構築手法は一部VS Codeに特化しているため、万人向けとは言えない。 しかし、Python環境をDockerで構築すると、環境構築や環境共有が簡単になる。
この内容が誰かの参考になれば幸いである。