みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Dev Container Features で全部入り開発環境を作成する

Dev Container を利用して Docker 環境で開発をすると,それぞれのプロジェクトについて自由に依存関係を構成することが可能になり,大変便利です.しかし,開発に必要なライブラリを1個のコンテナに準備する必要があり,準備が大変でした.それでも一度全部入りコンテナを作成してしまえば,後が楽になるので頑張っていましたが,どうやら Dev Container Features という機能を使えば, Dockerfile 作成の職人芸が不要になりそうだったので,試してみました.

Heroku Buildpacks など,類似するものは以前から存在しますので,真新しい機能ではありませんが,Dev Container 用なので,開発環境に特化しているのが特色です.

全部入り開発環境を作成する

Dev Container Features で,Rust, Node.js, Python, ZSH, git, apt が入ったコンテナを作ってみましょう.どれもみーがよく使うものです.

devcontainer.json

{
    "name": "all-in-one",
    "image": "mcr.microsoft.com/vscode/devcontainers/base:bullseye",
    "init": true,
    "remoteUser": "vscode",
    "features": {
        "ghcr.io/devcontainers/features/rust:1": {
            "version": "1.63",
            "profile": "minimal"
        },
        "ghcr.io/devcontainers/features/python:1": {
            "installTools": true,
            "version": "3.11"
        },
        "ghcr.io/devcontainers/features/node:1": {
            "version": "16"
        },
        "ghcr.io/devcontainers/features/common-utils:2": {
            "installZsh": true,
            "installOhMyZsh": true,
            "upgradePackages": true,
            "username": "vscode",
            "userUid": "automatic",
            "userGid": "automatic"
        }
    }
}

用意するものはこのJSONファイルだけです.”image” に,https://hub.docker.com/_/microsoft-vscode-devcontainers を指定することで,Dev Container として VSCode から操作できるようになります.個人的な好みで,debian bullseye を選択していますが,ubuntu や alpine も選択可能です.また, git などの各種ツールが入っています.

"features" に,rust, python, node, common-utils を指定しました.バージョンの指定も簡単に可能です.詳細はそれぞれのプロジェクトのドキュメントに記載されています.

Dev Container を起動して,ターミナルで全てのコマンドが使用できることを確認しました.

vscode@68d5a638009c:/workspaces/all-in-one$ rustc --version
rustc 1.63.0 (4b91a6ea7 2022-08-08)
vscode@68d5a638009c:/workspaces/all-in-one$ cargo --version
cargo 1.63.0 (fd9c4297c 2022-07-01)
vscode@68d5a638009c:/workspaces/all-in-one$ rustup show
Default host: x86_64-unknown-linux-gnu
rustup home:  /usr/local/rustup

1.63.0-x86_64-unknown-linux-gnu (default)
rustc 1.63.0 (4b91a6ea7 2022-08-08)
vscode@68d5a638009c:/workspaces/all-in-one$ node --version
v16.20.0
vscode@68d5a638009c:/workspaces/all-in-one$ npm --version
8.19.4
vscode@68d5a638009c:/workspaces/all-in-one$ python --version
Python 3.11.3
vscode@68d5a638009c:/workspaces/all-in-one$ pip --version
pip 23.0.1 from /usr/local/python/3.11.3/lib/python3.11/site-packages/pip (python 3.11)
vscode@68d5a638009c:/workspaces/all-in-one$ apt --version
apt 2.2.4 (amd64)
vscode@68d5a638009c:/workspaces/all-in-one$ zsh --version
zsh 5.8 (x86_64-debian-linux-gnu)

また,common-utils で設定した内容のユーザーになっているか確認しました.

$ id
uid=1000(vscode) gid=1000(vscode) groups=1000(vscode),996(rustlang),997(pipx),998(python),999(nvm)

このコンテナでは,様々なプロセスを起動するので,docker-init を有効にして,プロセスを適切に終了するようにしています.ゾンビプロセスが増えないようにするために重要です.

なお,Dev Container Features で作成したコンテナイメージのサイズを確認したところ,2.71 GB でした.開発用途なのでそれなりのスペックのパソコンを用意すれば問題ないですが,公開用のウェブサーバーで使用するにはサイズが大きすぎます.Dockerfile の職人芸はまだ必要みたいです.

まとめ

上記のツールを手動でインストールするのはかなり大変なので,JSONファイルだけ用意すれば,あとは勝手に開発環境を準備していただける Dev Container Features は素晴らしいと思いました.

有用なリンク