VSCode Remote Container 改め Dev Containersがかなり変わっていて困惑した
急に名前が変わっている
VSCode ExtensionsのRemote Developmentファミリーの一つ。
もともとの名称は Remote Containerだったけど2022/9/30にいつの間にやら名前を Dev Containersに変えていた。
CLIが出てきたよね
随分前から Dev Containerという名前がでてきていたのはなんとなくは知っていた。 VSCodeのリリースノートを遡ると5月ごろか。
この頃にCLIがでてきて「これなんぞ?」と思った記憶がある。
当時良く読んでなかったけど、
As containerizing production workloads becomes commonplace, dev containers have become broadly useful for scenarios beyond VS Code. We're excited to announce that work has started on the Development Containers Specification, which empowers anyone in any tool to configure a consistent dev environment. In addition, today we're excited to share a major component of this specification that you can now try, which is the dev container CLI.
VSCodeを超えて汎用的に使えるものだから、Development Containers Specificationの検討を始めたって書いてあったわ。
CLIについてはこちらの記事が非常によくまとまっている。
今見たらサブコマンドが増えてる気がする。featuresとかtemplatesとか無かった気がする。VSCodeとExtensionsのアップデートでCLIも勝手にアップデートされていたのだな。
$ devcontainer --help
devcontainer <command>
Commands:
devcontainer open [path] Open a dev container in VS Code
devcontainer up Create and run dev container
devcontainer build [path] Build a dev container image
devcontainer run-user-commands Run user commands
devcontainer read-configuration Read configuration
devcontainer features Features commands
devcontainer templates Templates commands
devcontainer exec <cmd> [args..] Execute a command on a running dev container
Options:
--help Show help [boolean]
--version Show version number [boolean]
devcontainer@0.23.2 /home/newgyu/.vscode-remote-containers/dist/dev-containers-cli-0.262.3
全面的に引っ越した様子
IMPORTANT NOTE: We've migrated most of the contents of this repo to the devcontainers org, as part of the work on the open dev container specification.
:
As a result, this repository only used for community definitions that have not been migrated elsewhere by their owners. If you are a community owner and want us to remove an existing definition here, feel free to submit a PR to do so!For more details, you can review the announcement issue.
気がついたら devcontainers というOrganizationができていて、マルチリポジトリに整理されたようだ。
テンプレートはこんな感じにcontainersの中に散りばめられていたのでいい感じに整理されたと言えるな。
テンプレートがガッツリ変わっている
Selecting the
Dev Containers: Add Dev Container Configuration Files...
command from the Command Palette (F1) will add the needed files to your project as a starting point,
VSCodeのコマンドパレットから Dev Containers: Add Dev Container Configuration Files...
を実行することで.devcontainer/devcontainer.json
が生成されるのですがその形式がガッツリ変わっていました。
今現在(Dev Containers Extensionsのバージョンがv0.262.3)では以下のdevcontainer.jsonだけが生成されます。
これが、4月頃のv0.224.3ではどうだったかというとdevcontainer.jsonとDockerfileの2つが生成されていました。
つい最近(10月末くらい)のv.245.2でも同じようなものでした。
このころからDevContainer仕様がとりこまれて、vscode固有の設定がcustomizaitons.vscode
以下に移動されました。
-
settings
->customizations.vscode.settings
-
extensions
->customizations.vscode.extensions
昔を懐かしむのは良くないですが、新仕様ではdevcontainer.jsonに書いてないことが暗黙に適用されてわけがわかりません。 docker inspect
コマンドでLabel[devcontainer.metadata]を確認すべし。
Dockerfileが無くなったのはまぁ良いでしょう。下記の内容なら直接imageを指定するだけで良いよねというのは同意です。
ARG VARIANT="bullseye"
FROM mcr.microsoft.com/vscode/devcontainers/rust:1-${VARIANT}
だがしかし、customizations.vscode.extensions
はdevcontainer.jsonに書かれていないのにちゃっかり導入済みになっています。これはどういうことなのでしょうか?
runArgs
や、vscode.settings
に書かれていた設定も隠蔽されてどうなっているのかわかりません。
仕様がどうなっているのか突き止められていないのですが、なんとなくこの設定が使われている用に思えます。内部的にどんな挙動でそうなるのかは全くわかりませんが・・・
出来上がったコンテナイメージのラベルにそれっぽい情報があった。
$ docker inspect d8b6e | jq -r ".[].Config.Labels.\"devcontainer.metadata\"" | jq
[
{
"id": "ghcr.io/devcontainers/features/common-utils:1"
},
{
"id": "ghcr.io/devcontainers/features/rust:1",
"capAdd": [
"SYS_PTRACE"
],
"securityOpt": [
"seccomp=unconfined"
],
"customizations": {
"vscode": {
"extensions": [
"vadimcn.vscode-lldb",
"mutantdino.resourcemonitor",
"rust-lang.rust-analyzer",
"tamasfe.even-better-toml",
"serayuzgur.crates"
],
"settings": {
"lldb.executable": "/usr/bin/lldb",
"files.watcherExclude": {
"**/target/**": true
},
"rust-analyzer.checkOnSave.command": "clippy"
}
}
}
},
{
"id": "ghcr.io/devcontainers/features/git:1"
},
{
"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"
},
{
"id": "azure-cli",
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.azurecli"
]
}
}
}
]
You can include dev container configuration and Feature metadata in prebuilt images via image labels, ...
:
The metadata label is automatically added when you pre-build using the Dev Container CLI (or most Dev Container spec supporting tools) and includes settings from devcontainer.json and any referenced Dev Container Features.
おそらくmcr.microsoft.com/vscode/devcontainers/rust:1-${VARIANT}
はただのコンテナイメージではなくOCI Artifactなのではないかな。
あー、なんかわかってきた。
- DevContainer用のイメージのLabelに付加情報がつけられている
devcontainer.metadata
- ツール側(=VSCode)がそのLabel情報を参照してdocker pullしてその後にapplyしてる
って感じか。
だから単純に docker run mcr.microsoft.com/vscode/devcontainers/rust:1-bullseye
とかやってもこうなるわけか。
$ docker run mcr.microsoft.com/vscode/devcontainers/rust:1-bullseye cat /home/vsco
de/.vscode-server/data/Machine/settings.json
cat: /home/vscode/.vscode-server/data/Machine/settings.json: No such file or directory
VSCodeではLabelに設定された情報を参照してこんな設定ファイルを生成してくれている。
$ docker exec -t 8e9cbd cat /home/vscode/.vscode-server/data/Machine/settings.json
{
"lldb.executable": "/usr/bin/lldb",
"files.watcherExclude": {
"**/target/**": true
},
"rust-analyzer.checkOnSave.command": "clippy"
}