Devbox触ってみた
話題の 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
ファイルが作られる
{
"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
にちゃんと追加されます。
{
"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
"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 の拡張機能とかは入れてくれますね。
{
"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"
}
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
で実行)
{
"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 した)
"packages": [
"python311",
"postgresql"
],
python は表示されない
$ devbox services ls
postgresql
$ devbox services start
で実行できるみたいです(複数ある場合は個別実行も可能)
$ devbox shell
$ initdb
$ devbox services start
$ devbox services start
waiting for server to start.... done
server started
Service "postgresql" started
Discussion