開発環境をDocker上に閉じるようにした
概要
以下の記事に大変感銘を受けた
検証時の環境
Ubuntu 22.04 on WSL2
以前の環境
環境を気軽に使い捨てられるように、環境構築を自動化していた
スナップショットが取れるので、環境の作り直しが簡単にできる
OSをアップグレードしようとして、失敗したらロールバックできるので
ただし、悩みがあった
1つの環境に必要なツールを全部入れてるので、依存パッケージが多い
スナップショットのサイズがデカい
ZIP圧縮して10GBある
消し忘れの一時リポジトリとかもずっと残ってしまってる
環境を作り直す時のスナップショット取得にメチャクチャ時間がかかる
前述の問題をどうすれば解決できるか
用途ごとに環境を分けて、環境ごとに必要なパッケージだけインストールする構成にしたい
全部の環境で共通で使うリソースをbaseとして定義し、baseをベースイメージに各言語ランタイムのみ入れたステージを作る
僕の場合go, java+GUI, nim, node, infraという感じ
WSL2でも同じ構成にはできると思うけれど、前述の記事の通りdockerを使ったほうがやりやすそう やったこと
前述の記事とやってることはほとんど同じ
Docker outside of dockerできるようにユーザIDとグループIDをあわせてる
/var/run/docker.sockのマウント
ユーザの作成
必要なツール郡にインストール
Ubuntu 22.04上にDockerを入れる
以前はDocker Desktopを使っていたけれど、Ubuntu上にDockerの環境を構築することにした
sudo service docker startしてもエラーがでて起動しない問題に直面した
こんなエラーがでてた
time="2022-05-22T19:31:45.351485263+09:00" level=warning msg="grpc: addrConn.createTransport failed to connect to {unix:///var/run/docker/containerd/containerd.sock <nil> 0 <nil>}. Err :connection error: desc = \"transport: Error while dialing dial unix:///var/run/docker/containerd/containerd.sock: timeout\". Reconnecting..." module=grpc
failed to start daemon: Error initializing network controller: error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain: (iptables failed: iptables --wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7 (nf_tables): RULE_APPEND failed (No such file or directory): rule in chain DOCKER-ISOLATION-STAGE-1
(exit status 4))
色々しらべて iptabes を古いのに切り替えたら起動するようになった
code:sh
sudo update-alternatives --config iptables
参考
Ubuntu起動時にdocker serviceを起動する
/etc/wsl.confに設定を書いとくと起動時にコマンドを呼び出してくれる
code:sh
cat << EOS | sudo tee /etc/wsl.conf
command="service docker start"
EOS
docker上で起動したtmuxの色がおかしいのを直す dockerfileでTERM環境変数を設定して解決した
ENV TERM="xterm-256color"
どっかのタイミングでbuildがコケるようになったら気づけるようにCIを入れた
今の環境
WSL2のUbuntu 22.04を立ち上げた直後に以下のコマンドを実行する
code:sh
cd /tmp
bash setup.sh # 途中手入力あり
exit
Ubuntu 22.04に入り直す
code:sh
cd ~/workspace/docker
cp .envrc.sample .envrc
vi .envrc # パスワードを設定
direnv allow
make start TARGET=go
これで一通り僕の開発環境が整う
make start TARGET=goを実行すれば、必要な開発ツールとGoの開発環境が整ったコンテナが立ち上がる vimやgopls、tmuxに諸々の設定ファイルの配置も整ってるので、Vimを起動して:PlugInstallすればすぐにGoのコード補完が効く状態で開発が始められる code:sh
⟩ docker images | grep workspace | column -t
workspace_infra latest fe2269834710 50 minutes ago 1.11GB
workspace_base latest fc03a6b50612 54 minutes ago 1.06GB
workspace_nim latest cc71085f291a About an hour ago 1.57GB
workspace_java latest 1c239effb0e2 12 hours ago 2.74GB
workspace_node latest 78ac49d55791 12 hours ago 1.06GB
workspace_go latest 81f7b31ca9b0 28 hours ago 1.84GB
イメージサイズはGUI周りが入ってるJavaで2.7GB、それ以外はいずれも2GB未満に収まった
ZIP圧縮して10GBあったスナップショットと比べると個々の環境はだいぶスリムになった
1つのコンテナを作り直す場合も、完了するまでの待ち時間は10分かからない
以前は1時間以上かかってた気がする
build-essentialやjava、xrdpを別コンテナに分離できたのが大きい
これでパッケージを最新にしたくなったり、環境を捨てて立ち上げ直したくなった時に気軽に実施できるようになった
課題
code:txt
dlopen(): error loading libfuse.so.2
AppImages require FUSE to run.
You might still be able to extract the contents of this AppImage
if you run it with the --appimage-extract option.
for more information
libfuse.so.2をインストールしても別の問題が出て、根が深そうだったので断念
幸いなことにvimでも普通に補完が効きながらコードを書けるので気にしないことにした まだWindowsのWSL2しか対応していない
そのうちMacでも動くようにする