Open18

VSCode Remote Container 改め Dev Containersがかなり変わっていて困惑した

乳牛乳牛

急に名前が変わっている

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers

VSCode ExtensionsのRemote Developmentファミリーの一つ。

もともとの名称は Remote Containerだったけど2022/9/30にいつの間にやら名前を Dev Containersに変えていた。

https://github.com/microsoft/vscode-remote-release/pull/7246/files

乳牛乳牛

何で過去の文書まで全部置換したのかわからないけど動画までは手が回ってなかったようだ。やはりRemote Containersと呼ばれている。
https://youtu.be/TVcoGLL6Smo

乳牛乳牛

CLIが出てきたよね

随分前から Dev Containerという名前がでてきていたのはなんとなくは知っていた。 VSCodeのリリースノートを遡ると5月ごろか。
https://code.visualstudio.com/updates/v1_68#_development-container-specification

この頃にCLIがでてきて「これなんぞ?」と思った記憶がある。
https://code.visualstudio.com/blogs/2022/05/18/dev-container-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の検討を始めたって書いてあったわ。

乳牛乳牛

今見たらサブコマンドが増えてる気がする。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
乳牛乳牛

全面的に引っ越した様子

https://github.com/microsoft/vscode-dev-containers#readme

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.

乳牛乳牛

テンプレートがガッツリ変わっている

https://code.visualstudio.com/docs/devcontainers/containers#_create-a-devcontainerjson-file

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だけが生成されます。

https://github.com/NewGyu/vscode-devcontainer.json/blob/main/.devcontainer/devcontainer.json

乳牛乳牛

つい最近(10月末くらい)のv.245.2でも同じようなものでした。

https://github.com/NewGyu/vscode-devcontainer.json/blob/v0.245.2/.devcontainer/devcontainer.json
https://github.com/NewGyu/vscode-devcontainer.json/blob/v0.245.2/.devcontainer/Dockerfile

このころから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"
        ]
      }
    }
  }
]

https://containers.dev/implementors/reference/#labels

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.

乳牛乳牛

あー、なんかわかってきた。

  1. DevContainer用のイメージのLabelに付加情報がつけられている
    devcontainer.metadata
  2. ツール側(=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"
}