仕様
公式: 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な手段はなにかを決めたい。
- Dockerfileで指定すると確実に設定できるが、devcontainer.jsonでイメージ名指定できなくなる。また
remoteUser
に依存する値を設定するべきではない。 remoteEnv
で/opt/bin:${containerEnv:PATH}
と書ける。
というわけで(2)がもっともDRYである。