Devbox 0.2.0で構築した環境をDockerで再現してみる

2022/12/27に公開

はじめに

この記事では,Devboxで構築した環境からDockerfileを作成し,Dockerで再現する手順を示します.
(初めて技術的な記事を書きました.もしよければモチベーションのためにいいねお願いします!)

Devboxとは...

Devbox は、開発用の独立したシェルを簡単に作成するためのコマンドラインツールです。開発環境に必要なパッケージのリストを定義することから始め、devbox はその定義を使ってアプリケーションのためだけの隔離された環境を作成します。

実際には、Devbox は yarn のようなパッケージマネージャと同じように動作します。ただし、管理するパッケージは(通常 brew や apt-get でインストールするような)OSレベルのものです。

Devboxはもともとjetpack.ioによって開発され、内部的にはnixによって動いている。
(公式githubから日本語訳して引用)

https://github.com/jetpack-io/devbox
https://www.jetpack.io/blog/devbox-0-2-0/

実演

Devboxのinstall

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

Devbox環境(devbox.json)の作成

$ devbox init

$ ls
devbox.json

$ cat devbox.json 
{
  "packages": [],
  "shell": {
    "init_hook": null
  },
  "nixpkgs": {
    "commit": "52e3e80afff4b16ccb7c52e9f0f5220552f03d04"
  }
}

Devbox環境にPython3.10を導入

$ devbox add python310
Installing nix packages. This may take a while... done.
...(省略)...
python310 (python3-3.10.8) is now installed.

$ cat devbox.json                   
{
  "packages": [
    "python310"
  ],
  "shell": {
    "init_hook": null
  },
  "nixpkgs": {
    "commit": "52e3e80afff4b16ccb7c52e9f0f5220552f03d04"
  }
}    

$ python --version
Python 3.7.2  # ローカル環境のpython version

Devbox環境でshell起動

$ devbox shell                      
Installing nix packages. This may take a while... done.
Starting a devbox shell...

$ python --version
Python 3.10.8

Devbox環境を再現するDockerで再現

$ devbox generate dockerfile

$ ls
Dockerfile	devbox.json

$ docker build -t devbox:python310 .
[+] Building 99.0s (18/18) FINISHED                                           
...(省略)...

$ docker run -it --rm devbox:python310 shell       
Installing nix packages. This may take a while... done.
Starting a devbox shell...

[nix-shell:/code]$ python --version
Python 3.10.8

感想

以下は,憶測を含みます.間違いがあればご指摘いただけると幸いです.

Devboxで構築した環境は,独立した環境と言えるか疑問に思いました.
というのも,Devboxのshellではローカルの環境変数やaliasが普通に使えてしまいます.単にdevbox generate dockerfileから作成したDocker環境では,これらはもちろん使えません.ローカルに依存する部分をDevboxのshellに持ち込む以上,他人と環境を配布するときに注意が必要になります.この点は正直使いづらさを感じました.

もう一つ,Devboxが分離不可能である部分が気になりました.
Dockerfileを見れば分かる通り,DockerにDevbox環境を持ち込む形でDockernizeします.つまり,DockerからDevboxを切り離そうとすると,一からDockerで構築し直す必要があります.一度Devboxで手軽に環境を構築した後,Devboxを切り離してDockerで本格運用したいと考えていましたが,そういった設計ではなさそうです.どちらかというと,Devboxで開発し切ったものを最後にDockerfileとして配布するという使い方が向いているように思います.

appendix

Devboxにより作成された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']

Discussion