はじめに
.NET の構成情報は、Program.csの定義の仕方によって、設定ファイルや環境変数、コマンドライン引数、その他設定値ストアの値を優先順序を付けて読み込むことで設定値を柔軟に定義することができます。
アプリとしては上記の設定値の解決でどうにかなるはずです。ただ、例えば.NETの設定情報が下記のようになっているんだけれど、環境変数は他のシステムで使いまわしていて、QIITA_API_BASEURI
という名前で変数の中にはHTTPS://qiita.com
といった文字列が格納されている場合は少し困ってしまいます。
{
"Qiita": {
"ApiBaseUri": "https://qiita.com/api"
}
}
この記事では、アプリケーションの起動時にシェルスクリプトを起動して環境変数を成型する方法について説明します。
Dockerfileの修正
Visual Studioで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ステージを書き換えます。
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
が設定されてこないこともあり、その場合は設定ファイルを優先したいので場合分けをしています。
# !/bin/sh
if [ -n "$QIITA_API_BASEURI" ]; then
export Qiita__ApiBaseUri="http://${QIITA_API_BASEURI}/api"
fi
dotnet WebApplication1.dll $@
まとめ
設定情報のフォーマットを動的に変更する必要が出てきた場合、起動スクリプトを使うと柔軟に修正できます!