Shipping containers

.NET 7でビルトインコンテナサポートが導入され、制約はありますがDockerfileを記載することなく、.NET のプロジェクトファイル(csproj)とdotnetコマンドのみでコンテナイメージのビルドまでできるようになりました。

さて、New Relicの.NET AgentをDocker環境にインストールする場合、ドキュメントの記載されているようにDockerfileにインストール処理を記述します。Dockerfileがなくなったビルトインコンテナサポートの場合、どのように.NET Agentをインストールすればよいのでしょうか。

Microsoftの公式ブログにもある通り、このような場合はビルトインコンテナサポートが利用するベースとなるコンテナイメージをカスタマイズします。あらかじめ.NET Agentをインストールしたイメージをベースとして指定することができます。

例えば、ASP.NET 向けのベースイメージであれば次のようなDockerfileでベースとなるコンテナイメージを作成します。

FROM mcr.microsoft.com/dotnet/aspnet:7.0
 
# Install the agent
RUN apt-get update && apt-get install -y wget ca-certificates gnupg \
&& echo 'deb http://apt.newrelic.com/debian/ newrelic non-free' | tee /etc/apt/sources.list.d/newrelic.list \
&& wget https://download.newrelic.com/548C16BF.gpg \
&& apt-key add 548C16BF.gpg \
&& apt-get update \
&& apt-get install -y newrelic-dotnet-agent
 
# Enable the agent
ENV CORECLR_ENABLE_PROFILING=1 \
CORECLR_PROFILER={36032161-FFC0-4B61-B559-F6C5D41BAE5A} \
CORECLR_NEWRELIC_HOME=/usr/local/newrelic-dotnet-agent \
CORECLR_PROFILER_PATH=/usr/local/newrelic-dotnet-agent/libNewRelicProfiler.so
 
EXPOSE 80

そしてビルドします。ビルトインコンテナサポートは現時点ではLinux amd64イメージしかサポートしていないのと、Windows上でビルドしているためプラットフォームを明示しています。リポジトリは利用するものを、イメージ名は任意です。

 docker build --platform linux/amd64 -t example.com/newrelic-base .       

そしてリポジトリにプッシュします。ビルトインコンテナサポートが参照するベースイメージはリポジトリにあるものを完全修飾名でしか指定できないため同じマシンでテストするときもプッシュする必要があります。

docker push example.com/newrelic-base 

ビルトインコンテナサポートを使う側では、プロジェクトファイルは次のようになります。

<Project Sdk="Microsoft.NET.Sdk.Web">
 
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <ContainerBaseImage>example.com/newrelic-base:latest</ContainerBaseImage>
    <ContainerImageName>my-container-app-with-newrelic</ContainerImageName>
  </PropertyGroup>
 
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Build.Containers" Version="0.2.7" />
  </ItemGroup>
 
  <ItemGroup>
    <ContainerEnvironmentVariable Include="NEW_RELIC_LICENSE_KEY" Value="79472880013eb7642fe0bd840a5c4c4dFFFFNRAL" />
    <ContainerEnvironmentVariable Include="NEW_RELIC_APP_NAME" Value="my_awesome_container_app" />
  </ItemGroup>
 
</Project>

ContainerBaseImageで先ほどプッシュしたベースイメージを完全修飾名で指定します。また、元のイメージではライセンスキーとアプリ名を指定していません。コンテナ起動時に指定する方法もありますが、今回はアプリケーションのコンテナイメージの環境変数に指定することにし、ContainerEnvironmentVariableで指定しています。

これでdotnet publish --os linux --arch x64 -c Release -p:PublishProfile=DefaultContainer   のように実行するとNew Relic Agentを含んだコンテナイメージを作成できます。

dotnet APM