2
1

Dev Container + poetryで簡単環境構築

Posted at

概要

Dev Containerとは

VScodeの拡張機能。定義ファイルを準備するだけで開発環境がまるっと全部揃ったコンテナにアタッチできる。

何が嬉しい?

  • 作業者間でOSからエディタの設定まで環境を共有できる
  • 定義ファイルさえ用意すれば一瞬で開発環境が整う
    • pyenvとかpoetryとかいちいちインストール不要
    • VScodeの拡張機能もぽちぽち入れなくて良い

使い方

Dockerはインストールされてるとする。

  1. .devcontainer/devcontainer.jsonに開発コンテナの設定を書く
  2. コマンドパレットから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.createfalseとすると権限エラーとなる。環境が二重化しており若干気持ち悪いが、今回はコンテナ内に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>

リモートインスタンス上でDev Containerを利用する

  • 通常どおり利用できる
  • ただし、SSH先のリモートインスタンス上はもちろん、SSH元のローカルマシン上にもDockerがインストールされていることが必要
    • WindowsならWSLにDockerをインストールしておく

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1