🤖

Devbox触ってみた

2022/12/23に公開

話題の Devbox を触ってみたい

この記事が話題ですよね。

Devbox は、ローカル環境上に分離した環境を用意しそこで開発環境を構築可能にしつつ、Docker コンテナのような仮想化技術を用いていないことが最大の特徴です。

というのが、オーバーヘッド無しでいけるのがすごいらしい。
それだけなら Docker & DevContainer でいい感あるわけで。

とりあえずインストール

まずはとりあえず install。公式ドキュメントは以下。M1 mac で試します。

これで入ると書かれてるので言われるがままに実行(mac なら zsh だったので後で改めて実行した)

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

こんな感じで devbox コマンド入れる場所を聞かれるので、まあ Yes で。

Devbox 📦 by jetpack.io
  Instant and predictable development environments and containers.

  This script downloads and installs the latest devbox binary.

Confirm Installation Details
  Location:     /usr/local/bin/devbox
  Download URL: https://releases.jetpack.io/devbox

? Install devbox to /usr/local/bin (requires sudo)? [Y/n] Y

Downloading and Installing
✓ Downloading devbox binary... [DONE]
→ Installing in /usr/local/bin/devbox (requires sudo)...
✓ Installing in /usr/local/bin/devbox... [DONE]
✓ Successfully installed devbox 🚀

Next Steps
  1. Learn how to use devbox
     Run devbox help or read the docs at https://github.com/jetpack-io/devbox
  2. Get help and give feedback
     Join our community at https://discord.gg/jetpack-io

$ devbox を実行するとダウンロードされる

$ devbox
✓ Downloading version 0.2.0... [DONE]
✓ Verifying checksum... [DONE]
✓ Unpacking binary... [DONE]

Instant, easy, predictable development environments

Usage:
  devbox [flags]
  devbox [command]

Available Commands:
  add         Add a new package to your devbox
  completion  Generate the autocompletion script for the specified shell
  generate
  help        Help about any command
  info        Display package info
  init        Initialize a directory as a devbox project
  rm          Remove a package from your devbox
  run         Starts a new devbox shell and runs the target script
  services    Interact with devbox services
  shell       Start a new shell or run a command with access to your packages
  version     Print version information

Flags:
  -h, --help   help for devbox

Use "devbox [command] --help" for more information about a command.
$ devbox version
0.2.0

動かす(Readme を試す)

package の追加

$ devbox init とすると、devbox.json ファイルが作られる

devbox.json
{
  "packages": [],
  "shell": {
    "init_hook": null
  },
  "nixpkgs": {
    "commit": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  }
}%

この packages に色々追加していくらしいが、それらは以下から調べられる(devbox は Nix(よく知らない)の Wrapper らしい)

試しに python で検索すると、python39 とか python311 とかが出てくる

ということで $ devbox add python311 を試みるも、Nix が無いと怒られちゃいます。
最初に紹介した記事では不要とあったので、なにかミスったのかもしれません。

今回リリースされた Devbox 0.2.0 ではインストーラが進化し、これまでマニュアルでインストールする必要があった Nix のインストールが自動的に行われるようになりました。
これで Devbox のインストーラだけで済むようになり、導入が容易になっています。

$ devbox add python311

Nix is not installed. Devbox will attempt to install it.

まあよくわからんので、Nix を以下のドキュメントを見て適当に入れます。

再実行すればちゃんと動きますね。

$ devbox add python311
Installing nix packages. This may take a while... done.

python NOTES:
python on devbox works best when used with a virtual environment (vent, virtualenv, etc). For example with python3:

> python -m venv .venv
> source .venv/bin/activate

Package managers like poetry (https://python-poetry.org/) automatically create virtual environments for you.

To show this information, run `devbox info python311`

python311 (python3-3.11.0) is now installed.

devbox.json にちゃんと追加されます。

devbox.json
{
  "packages": [
    "python311"
  ],
  "shell": {
    "init_hook": null
  },
  "nixpkgs": {
    "commit": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  }
}

シェルの起動

自分の mac のローカルは 3.9.1 となっています(そういや上げてなかったわ)

$ python --version
Python 3.9.1

$ devbox shell を実行すると、Installing nix packages. と言われながらいい感じにしてくれます。

改めて python のバージョンを確認してみると、ちゃんとなってますね。

$ python --version
Python 3.11.0
(devbox)

なお、exit で元のシェルに戻れます。

ここまででとりあえず Readme に書いてることは終わりですね。

もうちょい動かす

devbox.json を直接書き換えてみる

まず、devbox add go で以下のような状況にしておいたあと、devbox rm を使わずに直接 "puthon311"消して $ devbox shell

devbox.json
  "packages": [
    "python311",
    "go"
  ],

結果は以下の通りでローカルの Python がちゃんと使われる

$ python --version
Python 3.9.1
(devbox)

Dockerfile で出力する機能

冒頭記事にあるように devbox generate で Dockerfile を出力できるとかなんとか。
help みると、devcontainer.json も作れるらしい

$ devbox help generate
Usage:
  devbox generate [command]

Available Commands:
  devcontainer Generate Dockerfile and devcontainer.json files under .devcontainer/ directory
  dockerfile   Generate a Dockerfile that replicates devbox shell

Flags:
  -c, --config string   path to directory containing a devbox.json config file
  -h, --help            help for generate

Use "devbox generate [command] --help" for more information about a command.

ということで、$ devbox generate devcontainer を実行。
.devcontainer/ が作成された上で以下の 2 ファイルが作られました。
Devbox をインストールして、devbox.json をコピーすることで同じ状況を再現可能にしてくれるような形みたいですね。
あと Python の拡張機能とかは入れてくれますね。

.devcontainer/devcontainer.json
{
  "name": "Devbox Remote Container",
  "build": {
    "dockerfile": "./Dockerfile",
    "context": ".."
  },
  "customizations": {
    "vscode": {
      "settings": {
        "python.defaultInterpreterPath": "/devbox/.devbox/nix/profile/default/bin/python3"
      },
      "extensions": [
        "jetpack-io.devbox",
        "ms-python.python"
      ]
    }
  },
  "remoteUser": "devbox"
}
.devcontainer/Dockerfile
FROM alpine:3

# Setting up devbox user
ENV DEVBOX_USER=devbox
RUN adduser -h /home/$DEVBOX_USER -D -s /bin/bash $DEVBOX_USER
RUN addgroup sudo
RUN addgroup $DEVBOX_USER sudo
RUN echo " $DEVBOX_USER      ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers

# installing dependencies
RUN apk add --no-cache bash binutils git libstdc++ xz sudo

USER $DEVBOX_USER

# installing devbox
RUN wget --quiet --output-document=/dev/stdout https://get.jetpack.io/devbox | bash -s -- -f
RUN chown -R "${DEVBOX_USER}:${DEVBOX_USER}" /usr/local/bin/devbox

# nix installer script
RUN wget --quiet --output-document=/dev/stdout https://nixos.org/nix/install | sh -s -- --no-daemon
RUN . ~/.nix-profile/etc/profile.d/nix.sh
# updating PATH
ENV PATH="/home/${DEVBOX_USER}/.nix-profile/bin:/home/${DEVBOX_USER}/.devbox/nix/profile/default/bin:${PATH}"

WORKDIR /code
COPY devbox.json devbox.json
RUN devbox shell -- echo "Installing packages"
ENTRYPOINT ["devbox"]
CMD ['shell']

VSCode 左下の「> <」的なマークから "Reopen in Container" しつつごちゃごちゃしてたら、確かにコンテナ内は入れたみたいですが、 いまいちよく動かせなかったのでなにかミスったかもしれないです。よくわからんので誰かうまくいったら教えて下さい

もう一回やってみたら動きました。こんな感じで add した python 使えるのが分かりますね。もちろんローカルで使えるようにしていたが devbox に設定してないものは当然使えなかったです(yarnで試した)。なぜか .devcontainer/と同階層のファイル達もコンテナに入ってました。不思議(というより Docker の知識不足?)。

(devbox) xxxx:/workspaces/xxxx$ python --version
Python 3.11.0

その他小ネタ

devbox shell が動いているところで、devbox shell を動かせるか試す

当然無理

$ devbox shell
Error: You are already in an active devbox shell.
Run 'exit' before calling devbox shell again. Shell inception is not supported.

package.json がおいてあるフォルダで実行すると nodejs 入れるのをおすすめされる

$ devbox shell
Installing nix packages. This may take a while... done.
We detected extra packages you may need. To install them, run `devbox add nodejs yarn`

scripts という設定

npm の node 以外も含めた版という雰囲気があるのですが、そこから類推できるように、 package.json の scripts と同様なものがあるみたいです(devbox run xxxx で実行)

devbox.json
{
  "packages": ["python311"],
  "shell": {
    "init_hook": null,
    "scripts": {
      "echo_world": "echo \"World\""
    }
  },
  "nixpkgs": {
    "commit": "xxxxxxxxxxxxxxxxxxxxxx"
  }
}
$ devbox run echo_world
World

plugin とかバックグラウンド実行

以下に記載の plugin なるものを入れられる(add で可能)。
現状の種類は以下

Apache (apacheHttpd)
Nginx (nginx)
PostgreSQL (postgresql)
PHP (php, php80, php81, php82)
Ruby(ruby, ruby_3_1, ruby_3_0)

追加した plugin は $ devbox serbices lsで確認可能(試しに postgresql を add した)

devbox.json
  "packages": [
    "python311",
    "postgresql"
  ],

python は表示されない

$ devbox services ls
postgresql

$ devbox services startで実行できるみたいです(複数ある場合は個別実行も可能)

  1. $ devbox shell
  2. $ initdb
  3. $ devbox services start
$ devbox services start
waiting for server to start.... done
server started
Service "postgresql" started

Discussion