GitとGitHub Copilotが使える軽量なDev Containerを作る
経緯
前回の記事 では、GitHub Codespacesで構築したDev Containerで、GitやGitHub Copilotを使えることを確認していました。
そのときは、 devcontainer.json
で mcr.microsoft.com/devcontainers/javascript-node
というイメージを指定していました。
しかし、こちらのイメージは約1.46GBとかなりサイズが大きく、Dev Containerの新規構築時に待ち時間(主に、 docker image pull
にかかる時間)がそこそこ発生してしまうことがありました。
そこで今回は、GitもGitHub Copilotも使えて、かつ、もっと軽量なイメージを使った、Dev Containerを作成してみようと思います。
作りたいもの
- イメージには、Debian系、または、Alpine系のものを利用すること [1]
- 構築したDev Containerで、GitとGitHub Copilotが使えること
結論
今回は、 node
が使える開発環境が欲しいと仮定して、Docker Hubの node を参考に、
- Debian系:
node:20-bookworm-slim
[2] - Alpine系:
node:20-alpine
の2つをイメージとして利用することにしました。
(参考) 各イメージのサイズ比較
$ date
2024年 9月19日 木曜日 16時37分36秒 JST
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
node 20-bookworm-slim 0f2c2f895e1c 4 weeks ago 199MB
node 20-alpine 45a59611ca84 4 weeks ago 133MB
mcr.microsoft.com/devcontainers/javascript-node latest f6e4e7bff8bd 2 days ago 1.46GB
このとき、以下のような .devcontainer/devcontainer.json
を作成することで、所望のDev Containerを構築できました。
node:20-bookworm-slim
のイメージを使う場合は、下記のようなシンプルな .devcontainer/devcontainer.json
で済みました。
// .devcontainer/devcontainer.json
{
"image": "node:20-bookworm-slim",
"hostRequirements": {
"cpus": 2
},
"features": {
"ghcr.io/devcontainers/features/git:1": {}
},
"customizations": {
"vscode": {
"extensions": [
"github.copilot",
"github.copilot-chat"
]
}
},
...
}
動作確認結果
下画像は、実際にCodespacesを使ってDev Containerを新規に起動して、動作を確認した様子です。
node:20-bookworm-slim
のイメージを使ったDev Containerで、 node
コマンドが実行できることや、Gitがインストールされていることが確認できます。
Gitのconfigまで既に済んでおり、Dev Containerの起動直後からGitのコミットやプッシュが行えるようです。
また、GitHub CopilotやGitHub Copilot Chatもインストールできており、すぐに使えるようになっていることが確認できます。
node:20-alpine
のイメージを使う場合は、下記のように features
を少し考慮する必要がありました。
// .devcontainer/devcontainer.json
{
"image": "node:20-alpine",
"hostRequirements": {
"cpus": 2
},
"features": {
"ghcr.io/cirolosapio/devcontainers-features/alpine-bash:0": {},
"ghcr.io/devcontainers/features/git:1": {}
},
"customizations": {
"vscode": {
"extensions": [
"github.copilot",
"github.copilot-chat"
]
}
},
...
}
動作確認結果
下画像は、実際にCodespacesを使ってDev Containerを新規に起動して、動作を確認した様子です。
node:20-alpine
のイメージを使ったDev Containerで、 node
コマンドが実行できることや、Gitがインストールされていることが確認できます。
Gitのconfigまで既に済んでおり、Dev Containerの起動直後からGitのコミットやプッシュが行えるようです。
また、GitHub CopilotやGitHub Copilot Chatもインストールできており、すぐに使えるようになっていることが確認できます。
解説
features
Gitのインストールには、 features
を使っています。
// .devcontainer/devcontainer.json の一部抜粋
{
"image": "node:20-bookworm-slim",
...
"features": {
"ghcr.io/devcontainers/features/git:1": {}
},
...
}
features
は、 image
で指定したイメージにインストールされていないツールをさらに追加して、Dev Containerを構築するための機能です。
自分の認識では、開発環境のコンテナとビルド環境やステージング/本番環境のコンテナをできるだけ揃えたいが、開発環境だけはさらに追加で便利なツール(例えばGitなど)をインストールしたい場合などに、 features
は重宝する機能だと思っています。
featuresでインストールできるツールの一覧は、 Available Dev Container Features から探すことができます。
今回は、 ghcr.io/devcontainers/features/git:1
というfeatureを使ってGitをインストールしています。
ghcr.io/devcontainers/features/git:1
のリポジトリの README.md
の OS Support には、以下のように書かれています。
This Feature should work on recent versions of Alpine, Debian/Ubuntu, RedHat Enterprise Linux, Fedora, Alma, and RockyLinux distributions with the apk, apt, yum, dnf, or microdnf package manager installed.
bash is required to execute the install.sh script.
つまり、Alpine系やDebian系のLinux OSにも対応しているfeatureのようです。
ただし、bashを使える必要があるとも書かれています。
Alpine系にはbashが最初からインストールされていないことがあるので、bashを別途インストールする必要があります。
試しに、 Available Dev Container Features を探してみたところ、ちょうどよさそうな ghcr.io/cirolosapio/devcontainers-features/alpine-bash:0
というfeatureも見つかりました。
そこで、 Alpine系のイメージを使ってDev Containerを作成する場合は、
// .devcontainer/devcontainer.json の一部抜粋
{
"image": "node:20-alpine",
...
"features": {
"ghcr.io/cirolosapio/devcontainers-features/alpine-bash:0": {},
"ghcr.io/devcontainers/features/git:1": {}
},
...
}
のように features
を記述すると、Alpine系のイメージでも features
を使ってGitをインストールできました。
まとめると、 features
の機能を使いたい場合は、
- まずは Available Dev Container Features で便利な機能がないかを探して、
features
で指定してみる -
features
で指定したものをうまくインストールできない場合は、そのfeatureのリポジトリのREADME.md
に書かれているインストール要件などを確認してみる - (必要に応じて) 他の Available Dev Container Features を使って、インストール要件を満たせないか試してみる
- 1~3の繰り返し
のように試してみるのが良さそうです。
customizations
前回の記事 のときとは異なり、今回は .devcontainer/devcontainer.json
の customizations
> vscode
> extensions
を指定して、GitHub CopilotのVSCode拡張機能をDev Containerにインストールしてみました。
// .devcontainer/devcontainer.json の一部抜粋
{
...
"customizations": {
"vscode": {
"extensions": [
"github.copilot",
"github.copilot-chat"
]
}
},
...
}
こちらは、Debian系、Alpine系のどちらのイメージを使う場合でも、問題なくインストールできました。
-
bookwormとはDebian 12のこと。 ↩︎
Discussion