100日後にRustをちょっと知ってる人になる: [Day 15]dev container
Day 15 のテーマ
Day 14 では GitHub Codespaces で Rust 環境を作ることにチャレンジしてみました。
昨日の結果として分かったことは次のことでした。
- 「GitHub」+「Visual Studio Code」+「Ubuntu」が動作するクラウド環境ということ
- Codespaces で提供されるデフォルトのコンテナ環境には Rust のランタイム環境が入っていないということ
- dev container という仕組みを使ってランタイム環境をカスタマイズできるということ
というわけで、今日は dev container を使って Rust 環境を作ろうと思います。
dev container の作成
dev container はプロジェクトルートに以下のような構成でファイルを配置して設定を行います。
.devcontainer/
├── Dockerfile
└── devcontainer.json
- devcontainer.json: Codespaces の設定ファイル
- Dockerfile: dev container の実態
これらの設定ファイルを用意していきます。
VS Code からの作成
VS Code にインストールした Codespaces の拡張機能では、dev container を作成する機能が提供されています。それを使用して .devcontainer
を作成していきます。
1. コマンドパレットから dev container 作成メニューの選択
⌘ + ⇧ + P で VS Code のコマンドパレットを開きます。
メニューに Codespaces
と入力し、Codespaces: Add Development Container Config...
を選択します。
2. Rust 用の dev container 定義の選択
なんと今まで知らなかったのですけれど、Rust 用の dev container 定義が提供されていました!
ゼロベースで作る必要があると思っていたのですけど、これはうれしい。
ありがとう、VS Code 🙏
これを選んでみます。
3. Ubuntu(Debian) ベースイメージのバージョン選択
buster がデフォルトと表示されているので、これを選択します。
Ubutu | Debian | 略称 |
---|---|---|
18.04 - 19.10 | 10 | buster |
20.04 - 21.10 | 11 | bullsye |
4. dev container 設定
devcontainer.json に定義されると思われる、dev container に含める CLI やツールをここで選択できるようです。
試しに dev container 内でコンテナを使用できるように Docker in Docker を選択してみます。
dev container に含める Docker Engine のバージョンを選択します。
5. .devcontainer の確認
以下のようにプロジェクトルートに *.devcontainer が作成されます。
JSON と Dockerfile にアクセスすると、閲覧・編集支援の以下のプラグインのインストールがリコメンドされたので、両方ともインストールしました。
dev container の確認
以下のような構成で .devcontainer が作成されました。
.devcontainer/
├── Dockerfile
└── devcontainer.json
作成されたファイルの内容を確認していきます。
devcontainer.json
以下の JSON が自動生成されたものです。
{
"name": "Rust",
"build": {
"dockerfile": "Dockerfile",
"args": {
"VARIANT": "buster"
}
},
"runArgs": [
"--cap-add=SYS_PTRACE",
"--security-opt",
"seccomp=unconfined"
],
"customizations": {
"vscode": {
"settings": {
"lldb.executable": "/usr/bin/lldb",
"files.watcherExclude": {
"**/target/**": true
},
"rust-analyzer.checkOnSave.command": "clippy"
},
"extensions": [
"vadimcn.vscode-lldb",
"mutantdino.resourcemonitor",
"rust-lang.rust-analyzer",
"tamasfe.even-better-toml",
"serayuzgur.crates"
]
}
},
"remoteUser": "vscode",
"features": {
"docker-in-docker": "latest"
}
}
customizations.vscode.extensions に rust-lang.rust-analyzer が入っていました。
これは VS Code 上で Rust の補完を行ったりする拡張機能のようです。
Dockerfile
以下の Dockerfile が自動生成されたものです。
ARG VARIANT="buster"
FROM mcr.microsoft.com/vscode/devcontainers/rust:0-${VARIANT}
dev container の実行
エラーが出てしまいました…
rust-analyzer の ブートストラップエラーが出ていました。
さて、調べて直していくとしましょうか。。。
INFO [9/6/2022, 7:11:22 AM]: Using server binary at /home/vscode/.vscode-remote/extensions/rust-lang.rust-analyzer-0.3.1194-linux-x64/server/rust-analyzer
ERROR [9/6/2022, 7:11:22 AM]: Bootstrap error Error: Failed to execute /home/vscode/.vscode-remote/extensions/rust-lang.rust-analyzer-0.3.1194-linux-x64/server/rust-analyzer --version
at OS (/home/vscode/.vscode-remote/extensions/rust-lang.rust-analyzer-0.3.1194-linux-x64/out/main.js:85:2328)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at xS (/home/vscode/.vscode-remote/extensions/rust-lang.rust-analyzer-0.3.1194-linux-x64/out/main.js:84:1220)
at fv (/home/vscode/.vscode-remote/extensions/rust-lang.rust-analyzer-0.3.1194-linux-x64/out/main.js:84:891)
at E._activate (/vscode/bin/linux-x64/784b0177c56c607789f9638da7b6bf3230d47a8c/out/vs/workbench/api/node/extensionHostProcess.js:85:8224)
at E._waitForDepsThenActivate (/vscode/bin/linux-x64/784b0177c56c607789f9638da7b6bf3230d47a8c/out/vs/workbench/api/node/extensionHostProcess.js:85:8166)
at E._initialize (/vscode/bin/linux-x64/784b0177c56c607789f9638da7b6bf3230d47a8c/out/vs/workbench/api/node/extensionHostProcess.js:85:7530)
問題対応
とりあえず、問題切り分けのために、とりあえずで入れていた Docker in Docker を外してみます。
以下の部分を削除します。
"features": {
"docker-in-docker": "latest"
}
あれ??
外しただけで動くようになりました。
Route Cause を見つけてないのですけど…
とりあえず、今はこれで進めておこうと思います。そもそも使う用途なく Docker in Docker を追加していたことが問題なので…
GitHub Codespaces 上で Rust を実行
問題なく動作しました!
Day 15 のまとめ
今日は、 昨日 Day 14 に引き続いて GitHub Codespaces で Rust の環境を整えてみました。
エラーが発生して戸惑ったものの、単に Rust を実行する環境だけであれば難なく作れそうなことが分かりました。
あとは、Codespaces 上の VS Code に対する設定と、それを動かすコンテナ環境の準備の仕方 (dec container) が少しわかりました。この昨日は便利に活用していきたいかなと思います。
Discussion