概要
Dev Containerとは
VScodeの拡張機能。定義ファイルを準備するだけで開発環境がまるっと全部揃ったコンテナにアタッチできる。
何が嬉しい?
- 作業者間でOSからエディタの設定まで環境を共有できる
- 定義ファイルさえ用意すれば一瞬で開発環境が整う
- pyenvとかpoetryとかいちいちインストール不要
- VScodeの拡張機能もぽちぽち入れなくて良い
使い方
Dockerはインストールされてるとする。
-
.devcontainer/devcontainer.json
に開発コンテナの設定を書く - コマンドパレットから
Reopen in Container
を選ぶと開発コンテナが立ち上がりアタッチされる
使用例
以下の環境を用意する例。
- Python3.12
- poetry
- VScode拡張機能もろもろ
リポジトリ構成
.
├── .devcontainer
│ ├── devcontainer.json
│ └── post-attach.sh
├── pyproject.toml
└── poetry.lock
devcontainer.json
開発コンテナの設計図。書き方の詳細は以下のドキュメント参照。
ここでは最小限以下の項目を設定。
-
image
:ベースとするイメージ -
features
:コンテナにトッピングしたい機能- ここでpoetryを入れる
-
extentions
:インストールしたいVScodeの拡張機能 -
postAttachCommand
:開発コンテナにアタッチしたタイミングで実行するコマンド- ここで用意したシェルスクリプト
post-attach.sh
を実行
- ここで用意したシェルスクリプト
{
"image": "mcr.microsoft.com/devcontainers/python:3.12-bullseye",
"features": {
"ghcr.io/devcontainers-contrib/features/poetry:2": {}
},
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-toolsai.jupyter",
"ms-python.mypy-type-checker",
"ms-azuretools.vscode-docker",
"charliermarsh.ruff",
"mhutchie.git-graph",
"gruntfuggly.todo-tree",
"formulahendry.code-runner"
]
}
},
"postAttachCommand": ".devcontainer/post-attach.sh"
}
必要に応じてDockerfileやdocker-compose.ymlを用意することで、コンテナの振る舞いをさらにカスタマイズすることもできる。
post-attach.sh
コンテナにアタッチされたタイミングで依存関係のインストールを行う。post-attach.shはコンテナ内で実行されるように実行権限を付けておく。
#!/bin/bash
poetry config virtualenvs.in-project true
poetry install --no-root
こちらのissueでも指摘されているように、poetryはユーザー権限でグローバルな環境にインストールする機能をサポートしておらず、virtualenvs.create
をfalse
とすると権限エラーとなる。環境が二重化しており若干気持ち悪いが、今回はコンテナ内にpoetryの仮想環境を作る。
コンテナへのアタッチ
VScodeのワークスペースがリポジトリのルートにある状態でCtrl + Shift + P
でコマンドパレットを開いてReopen in Container
を選択すると、devcontainer.jsonで設定した内容にしたがってカスタマイズされた開発コンテナが立ち上がり、アタッチされる。
リポジトリのルート以下は自動的にコンテナにバインドマウントされるため、コンテナ内の作業はホストマシン側にも反映される。
Tips
rootユーザーで作業しない
- コンテナに
root
で入ると作成したファイルの所有者がroot
となり、開発コンテナの外で通常ユーザーとして作業する際にファイルを編集できなくなってしまう - Microsoftが提供しているDev Container用のイメージを使うと自動的に
vscode
というユーザーで入れるので便利
Gitの認証情報を設定する
- Gitのユーザー情報はホストマシン側で設定すると、自動的に開発コンテナ内で共有される
git config --global user.name "Your Name"
git config --global user.email "your.email@address"
- 認証情報は、秘密鍵をホストマシン側のSSH Agentに読み込ませることで、開発コンテナ上にも反映される
- 間違っても
~/.ssh
をコンテナにマウントしない
- 間違っても
ssh-add ~/.ssh/<your-private-key>
参考