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 は素晴らしいと思いました.
有用なリンク
- Available Dev Container Features
- Dev Container metadata reference
- features/src/python at main · devcontainers/features · GitHub
- features/src/rust at main · devcontainers/features · GitHub
- features/src/node at main · devcontainers/features · GitHub
- features/src/common-utils at main · devcontainers/features · GitHub
- Create a development container using Visual Studio Code Remote Development