つばろぐ

主に C#, .NET, Azure の備忘録です。たまに日記。

Tye で環境変数を設定すると appsettings.json より優先される

前回の記事で Tye で実行したサービスのなかで、環境変数にアクセスするための仕組みを紹介しました。

tsubalog.hatenablog.com

今回は Tye の仕組みのなかで環境変数を設定する方法を調べたので紹介します。

環境変数は tye.yaml に定義する

Tye を実行した際にサービスに対して環境変数を設定したい場合は tye.yaml に定義します。
リファレンスはこのあたりです。

https://github.com/dotnet/tye/blob/master/docs/reference/schema.md#environment-variables

services に定義されたサービスのなかで環境変数を設定したいサービスのブロックに env を書きます。

name: microservice
registry: tsubakimoto
services:
- name: backend
  project: backend\backend.csproj
- name: frontend
  project: frontend\frontend.csproj
  env:
  - name: YOUR_NAME
    value: "YUTA in YAML"
- name: redis
  image: redis
  bindings:
  - port: 6379
    connectionString: "${host}:${port}"
- name: redis-cli
  image: redis
  args: "redis-cli -h redis MONITOR"

試しにトップページに YOUR_NAME という環境変数の値を表示するようにしておきます。

(中略)
@inject Microsoft.Extensions.Configuration.IConfiguration configuration

(中略)
<div class="text-center">
    <h1 class="display-4">Welcome @configuration["YOUR_NAME"]</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

上記の tye.yaml の状態で tye run を実行すると設定した値がきちんと表示されます。

f:id:tech-tsubaki:20201001234600p:plain

同一の環境変数は appsettings.json と tye.yaml のどちらが優先されるか?

ASP.NET Core で環境変数を定義する場合、通常は appsettings.json もしくは appsettings.{環境名}.json に書くと思います。
appsettings.jsontye.yaml はどちらが優先されるのかを調べてみました。

結論としては appsettings.json < appsettings.{環境名}.json < tye.yaml という優先順位になりました。
Azure App Service のアプリケーション設定と同じですね。

どういうときに使う?

前述の通り tye.yaml に記述した環境変数が優先されるため、アプリケーションソースコードで定義している環境変数をデプロイから上書きしたいときが考えられます。
たとえば一時的にログレベルを変更したいときなどの場面が想定できますね。