♻️

Devboxによる分離した開発環境構築

2024/02/21に公開

はじめに

現在、開発環境を構築するツールとして Docker がもっとも使われるものの1つとしてあげられる。
Docker 以外にもローカル環境を汚さず構築する方法はいくつある。そのうちの1つである Devbox について紹介する。

まずは、前提として環境を分離させないとどうなるか

開発する際に複数のプロジェクトを同時に取り組んでいる場合、複数のプロジェクトで異なるバージョンのパッケージやライブラリーが必要となり、依存関係がどんどん複雑になっていき、管理が煩雑となる。

Devboxとは

Jetpack Technologies が開発した Docker 等の仮想化技術を使用することなく、ローカル環境から分離された環境を構築できるコマンドラインツール。

Devboxの特徴

1. 環境の分離
元のローカル環境と同じパッケージの異なるバージョンでも問題なくインストールできる。異なるプロジェクト間で同じパッケージによるバージョン違いの競合が発生しない。
「devbox.json」という JSON ファイルにプロジェクトで使用するパッケージの情報や設定を定義し、devbox シェルを実行することで内部的に元の環境と分離された新しいシェル環境を構築できる。

2. オーバーヘッドが発生しない
Docker のようなコンテナ仮想化には、仮想化レイヤーを仲介するためオーバーヘッドによるコンパイルなどの実行速度が低下してしまうというデメリットがある。
Devbox では仮想化レイヤーを持たないため、オーバーヘッドが発生しない。

3. ローカル環境を汚さない
使い終わった環境は自由に破棄することができるので、ローカル環境に不要なファイルを残さず、きれいな状態にすることができる。

4. 環境一式の用意
Docker のようなコンテナ同様、プロジェクトに必要なパッケージ一式を揃えた環境を構築できる。

5. パッケージマネージャー
Nix というパッケージマネージャーを使用している。Nix を用いることでパッケージ間の依存関係の解消、パッケージのインストールやアップグレードがほかのパッケージに影響を及ぼさないことを保証してくれる。
この Nix の仕組みを利用することで、完全に分離された環境の構築を実現している。

6. プラグイン
Apache httpd、ngnix, pip, PHP, PostgreSQL など主要なパッケージを利用するための環境変数、設定ファイル、サービスなどをあらかじめ整備された状態で導入できる。

7. Dockerコンテナへの移行
別の環境に移行するための方法がいくつ存在する。そのうちの1つは、Docker コンテナを構築するための Dockerfile の生成。生成された Dockerfile を使用することで Devbox で構築した環境 Docker コンテナとして構築できる。
使い分けとしては、開発は Devbox を利用して、本番環境にデプロイする際には Docker コンテナに移行することができる。
そのほかにも、VScode (Visual Studio Code) 用の Docker 拡張機能である Dev Container 向けのコンテナ生成にも対応している。

8. クラウド環境
クラウド環境で利用できる Devbox Cloud も提供されている。
クラウド上に独自に devbox.json を使用して開発環境を構築して利用できる。

Devboxでの環境構築の実例

環境

Ubuntu LTS 22.04.3

手順

インストール

$ curl -fsSL https://get.jetpack.io/devbox | bash

インストールできたか確認する。

$ devbox version
0.9.1

初期セットアップ

$ devbox init

devbox.json が生成される。

$ ls
devbox.json

devbox.json の中身

$ cat devbox.json
{
  "packages": [],
  "shell": {
    "init_hook": [
      "echo 'Welcome to devbox!' > /dev/null"
    ],
    "scripts": {
      "test": [
        "echo \"Error: no test specified\" && exit 1"
      ]
    }
  }
}

パッケージのインストール

今回は Node.js のみをインストールする。
まずは、提供されている Node.js のパッケージのバージョンを調べる

$ devbox search nodejs

ound 2+ results for "nodejs":

* nodejs  (21.6.1, 21.6.0, 21.5.0, 21.4.0, 21.3.0, 21.2.0, 21.1.0, 21.0.0, 20.11.0, 20.10.0)
* nodejs-slim  (21.6.1, 21.6.0, 21.5.0, 21.4.0, 21.3.0, 21.2.0, 21.1.0, 21.0.0, 20.11.0, 20.10.0)

Warning: Showing top 10 results and truncated versions. Use --show-all to show all.

node.js のバージョンを指定してインストールする。

$ devbox add nodejs@21.6.1
Info: Adding package "nodejs@21.6.1" to devbox.json
[1/1] nodejs@21.6.1
[1/1] nodejs@21.6.1: Success

インストール完了するとdevbox.json にもパッケージの情報が追記される。
nodejs@21.6.1 が追加されたことを確認できる。

$ cat devbox.json 
{
  "packages": ["nodejs@21.6.1"],
  "shell": {
    "init_hook": [
      "echo 'Welcome to devbox!' > /dev/null"
    ],
    "scripts": {
      "test": [
        "echo \"Error: no test specified\" && exit 1"
      ]
    }
  }
}

バージョンを指定しない場合は最新バージョンがインストールされる。
以下はバージョンを指定なしインストールする例となる。

$ devbox add nodejs
Info: Adding package "nodejs@latest" to devbox.json
[1/1] nodejs@latest
[1/1] nodejs@latest: Success

バージョンを指定しない場合は devbox.json の中身を以下のようになる。
バージョンを指定してインストールとの違いはバージョン番号の部分が latest となる。

$ cat devbox.json 
{
  "packages": ["nodejs@latest"],
  "shell": {
    "init_hook": [
      "echo 'Welcome to devbox!' > /dev/null"
    ],
    "scripts": {
      "test": [
        "echo \"Error: no test specified\" && exit 1"
      ]
    }
  }
}

devbox shell を起動

devbox shell を使ってシェル環境を実行する。

$ devbox shell
Starting a devbox shell...

インストールしたnode.js のバージョンを確認する。

$ node --version
v21.6.1

devbox shell から抜けて devbox 環境にのみ node.js がインストールされていることを確認する。

# devbox shell から抜ける
$ exit

# ローカル環境の node.js のバージョンを調べる
$ node --version
Command 'node' not found, but can be installed with:
sudo apt install nodejs
# ローカル環境では node.js をインストールしていないので上記のようなメッセージが表示される。

Dockerfile を生成

Dockerfile の生成は以下のようにできる。

$ devbox generate dockerfile

生成された Dockerfile の中身は以下のようになる。

$ cat Dockerfile 
FROM jetpackio/devbox:latest

# Installing your devbox project
WORKDIR /code
USER ${DEVBOX_USER}:${DEVBOX_USER}
COPY --chown=${DEVBOX_USER}:${DEVBOX_USER} devbox.json devbox.json
COPY --chown=${DEVBOX_USER}:${DEVBOX_USER} devbox.lock devbox.lock



RUN devbox run -- echo "Installed Packages."

CMD ["devbox", "shell"]

VScode の拡張機能 Dev Container 用のファイルを生成

Dev Container 用ファイルの生成は以下のようにできる。

$ devbox generate devcontainer

.devcontainer ディレクトリと以下のファイルが生成される。

$ ls .devcontainer/
devcontainer.json  Dockerfile

生成されたファイルの中身は以下のようになる。

$ cat devcontainer.json 
{
  "name": "Devbox Remote Container",
  "build": {
    "dockerfile": "./Dockerfile",
    "context": ".."
  },
  "customizations": {
    "vscode": {
      "settings": {},
      "extensions": [
        "jetpack-io.devbox"
      ]
    }
  },
  "remoteUser": "devbox"
}

$ cat Dockerfile 
FROM jetpackio/devbox:latest

# Installing your devbox project
WORKDIR /code
USER ${DEVBOX_USER}:${DEVBOX_USER}
COPY --chown=${DEVBOX_USER}:${DEVBOX_USER} devbox.json devbox.json
COPY --chown=${DEVBOX_USER}:${DEVBOX_USER} devbox.lock devbox.lock



RUN devbox run -- echo "Installed Packages."

RUN devbox shellenv --init-hook >> ~/.profile
RSI技術ブログ

Discussion