LoginSignup
0
0

More than 3 years have passed since last update.

ASP.NET Coreに渡される環境変数を、起動スクリプトで成型する

Posted at

はじめに

.NET の構成情報は、Program.csの定義の仕方によって、設定ファイルや環境変数、コマンドライン引数、その他設定値ストアの値を優先順序を付けて読み込むことで設定値を柔軟に定義することができます。

アプリとしては上記の設定値の解決でどうにかなるはずです。ただ、例えば.NETの設定情報が下記のようになっているんだけれど、環境変数は他のシステムで使いまわしていて、QIITA_API_BASEURIという名前で変数の中にはHTTPS://qiita.comといった文字列が格納されている場合は少し困ってしまいます。

appsettings.json
{
    "Qiita": {
        "ApiBaseUri": "https://qiita.com/api"
    }
}

この記事では、アプリケーションの起動時にシェルスクリプトを起動して環境変数を成型する方法について説明します。

Dockerfileの修正

Visual StudioでDockerfileを追加した場合、次のようなDockerfileがプロジェクトに追加されます。

Dockerfile
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

dotnetコマンドを直に起動するのではなく、シェルスクリプト経由で起動するようにfinalステージを書き換えます。

Dockerfile(finalステージのみ抜粋)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
COPY entrypoint.sh .
RUN chmod 755 entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

起動スクリプト

起動スクリプトでは、環境変数を編集して再設定します。
開発時はQIITA_API_BASEURIが設定されてこないこともあり、その場合は設定ファイルを優先したいので場合分けをしています。

entrypoint.sh
#!/bin/sh

if [ -n "$QIITA_API_BASEURI" ]; then
    export Qiita__ApiBaseUri="http://${QIITA_API_BASEURI}/api"
fi
dotnet WebApplication1.dll $@

まとめ

設定情報のフォーマットを動的に変更する必要が出てきた場合、起動スクリプトを使うと柔軟に修正できます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0