🐳

GitとGitHub Copilotが使える軽量なDev Containerを作る

2024/09/19に公開

経緯

前回の記事 では、GitHub Codespacesで構築したDev Containerで、GitやGitHub Copilotを使えることを確認していました。
そのときは、 devcontainer.jsonmcr.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.mdOS 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 の機能を使いたい場合は、

  1. まずは Available Dev Container Features で便利な機能がないかを探して、 features で指定してみる
  2. features で指定したものをうまくインストールできない場合は、そのfeatureのリポジトリの README.md に書かれているインストール要件などを確認してみる
  3. (必要に応じて) 他の Available Dev Container Features を使って、インストール要件を満たせないか試してみる
  4. 1~3の繰り返し

のように試してみるのが良さそうです。

customizations

前回の記事 のときとは異なり、今回は .devcontainer/devcontainer.jsoncustomizations > vscode > extensions を指定して、GitHub CopilotのVSCode拡張機能をDev Containerにインストールしてみました。

// .devcontainer/devcontainer.json の一部抜粋
{
    ...
    "customizations": {
        "vscode": {
            "extensions": [
                "github.copilot",
                "github.copilot-chat"
            ]
        }
    },
    ...
}

こちらは、Debian系、Alpine系のどちらのイメージを使う場合でも、問題なくインストールできました。

脚注
  1. 参考: https://engineering.nifty.co.jp/blog/26586 ↩︎

  2. bookwormとはDebian 12のこと。 ↩︎

Discussion