ASP.NET Core MVC: 環境変数を使う

 環境依存の値をハードコーディングするのはよろしくない。だからそういう値は環境変数として呼び出すのが定石。今回は.NET Core 2.0以降の環境変数の呼び出し方。

 まず環境変数をセットする。今回の一連の開発はDockerで動かすものを作っているのでDocker環境の環境変数設定から。docker-compose.ymlに適当な環境変数を追記する。
docker-compose.yml

version: '3'

services:
tetsujin:
image: matoba/tetsujin
build:
context: ./tetsujin
dockerfile: Dockerfile
environment:
- env=tetsujin


 上記は本番で使う環境変数という想定である。docker-compose.ymlに書いているので。
 たとえばデータベースは本番用と開発環境用があるだろう。開発環境用のはどうすればいいだろうか。appsettings.jsonに書く。
appsettings.json

{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
},
"devenv": "devenv",
"env": "devenv"

}

値は二つ書いてみた。一つはdocker-compose.ymlと同じキーの名前で書いてある。これからまず環境変数を呼び出してみる。さらに、docker-compose.yml(本番用)とappsettings.json(開発環境用)の両方に同じキーの名前の環境変数が定義されていたら、このキー名の環境変数を呼んだときどうなるかということまで。

 Startup.csのメソッドStartupの中で環境変数を呼び出してみる。メソッド内の上二行が追加されたもの。
Startup.cs

public Startup(IConfiguration configuration)
{
Console.WriteLine(configuration.GetValue<string>("env"));
Console.WriteLine(configuration.GetValue<string>("devenv"));

Configuration = configuration;
}


 VisualStudioでデバッグを実行し、出力を確認する。処理の手順として、メソッドStartupは指定ポートでの待ち受けが始まる少し前に出力されている。

docker-compose.ymlに書いた環境変数envの値と、appsettings.jsonに書いたdevenvの値が出力されている。
 環境変数envはdocker-compose.ymlとappsettings.jsonの両方に書いておいたが、docker-compose.ymlのほうの値が出力された。これは優先度によるもので、デフォルトではdocker-compose.ymlのほうに書いた環境変数が優先される。docker-compose.ymlに環境変数がなければ、appsettings.jsonのほうに書いた値が参照される。これを利用して、データベースの接続文字列の本番用、開発環境用を切り替える。
comment: 0