仕様

公式: Dev Container metadata reference

devcontainer.jsonに環境変数を記述する際に他の環境変数を参照したくなることがある。その実際の挙動がドキュメントからはよく分からなかったので整理する。

 mise exec npm:@devcontainers/cli -- devcontainer up --remove-existing-container
 mise exec npm:@devcontainers/cli -- devcontainer exec env

この挙動は公式実装で確認した。

なお、${localEnv:VARIABLE_NAME}, ${localWorkspaceFolder}, ${localWorkspaceFolderBasename}はホスト環境依存が発生するため使うつもりがなく除外している。

containerEnvキー

  • ${containerWorkspaceFolder}: /workspaces/repo-name
  • ${containerWorkspaceFolderBasename}: repo-name
  • ${devcontainerId}: 1elg8nrto0brldvktqrttf9icp5sn3v84geguc86l5d911uaiik0

仕様にあるプレースホルダのうち、利用する意味があるのはこれらのみ。${PATH}$PATHといった記法も展開されず書いたまま設定されることを確認した。つまり、ここでイメージに定義されている環境変数を展開することはできない。

remoteEnvキー

${containerEnv:VARIABLE_NAME}が利用可能だが、containerEnvキーで定義した変数と、Dockerイメージに焼き込まれている環境変数(コンテナ起動前に確定する環境変数)しか参照できない。${PATH}$PATHといった記法も展開されず書いたまま設定されることを確認した。

 docker inspect buildpack-deps:24.04-scm --format='{{json .Config.Env}}'
["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"]

シェルで設定される変数は対象外なのでenvコマンドなどで確認すると混乱する。イメージの環境変数はこれで確認できる。

PATHのカスタマイズ

やりたいことはPATHへのremoteUser固有パスの追加で、なるべく広く適用されてDRYな手段はなにかを決めたい。

  1. Dockerfileで指定すると確実に設定できるが、devcontainer.jsonでイメージ名指定できなくなる。またremoteUserに依存する値を設定するべきではない。
  2. remoteEnv/opt/bin:${containerEnv:PATH}と書ける。

というわけで(2)がもっともDRYである。