.NET .NET Aspire を使用すると、アプリ ホスト が AddDockerfile または WithDockerfile 拡張メソッドを使用して開始されたときにビルドする Dockerfile を指定できます。
アプリ モデルに Dockerfile を追加する
次の例では、AddDockerfile 拡張メソッドを使用して、コンテナー ビルドのコンテキスト パスを参照してコンテナーを指定します。
var builder = DistributedApplication.CreateBuilder(args);
var container = builder.AddDockerfile(
"mycontainer", "relative/context/path");
コンテキスト パス引数がルート パスでない限り、コンテキスト パスはアプリ ホスト プロジェクト ディレクトリ (AppHost *.csproj
フォルダーがある場所) に対する相対パスとして解釈されます。
既定では、使用される Dockerfile の名前は Dockerfile
され、コンテキスト パス ディレクトリ内にあると想定されます。
Dockerfile 名は、絶対パスまたはコンテキスト パスへの相対パスとして明示的に指定できます。
これは、ローカルで実行するとき、またはアプリ ホストをデプロイするときに使用される特定の Dockerfile を変更する場合に便利です。
var builder = DistributedApplication.CreateBuilder(args);
var container = builder.ExecutionContext.IsRunMode
? builder.AddDockerfile(
"mycontainer", "relative/context/path", "Dockerfile.debug")
: builder.AddDockerfile(
"mycontainer", "relative/context/path", "Dockerfile.release");
既存のコンテナー リソースをカスタマイズする
AddDockerfile を使用する場合、戻り値は IResourceBuilder<ContainerResource>
です。
.NET
.NET Aspire には、ContainerResourceから派生した多くのカスタム リソースの種類が含まれています。
WithDockerfile 拡張メソッドを使用すると、これらの厳密に型指定されたリソースの種類を引き続き使用し、使用される基になるコンテナーをカスタマイズできます。
var builder = DistributedApplication.CreateBuilder(args);
var pgsql = builder.AddPostgres("pgsql")
.WithDockerfile("path/to/context")
.WithPgAdmin();
ビルド引数を渡す
WithBuildArg メソッドを使用して、コンテナー イメージ ビルドに引数を渡すことができます。
var builder = DistributedApplication.CreateBuilder(args);
var container = builder.AddDockerfile("mygoapp", "relative/context/path")
.WithBuildArg("GO_VERSION", "1.22");
WithBuildArg メソッドの value パラメーターには、リテラル値 (boolean
、string
、int
) を指定することも、パラメーター リソースのリソース ビルダーにすることもできます。 次のコードは、GO_VERSION
をデプロイ時に指定できるパラメーター値に置き換えます。
var builder = DistributedApplication.CreateBuilder(args);
var goVersion = builder.AddParameter("goversion");
var container = builder.AddDockerfile("mygoapp", "relative/context/path")
.WithBuildArg("GO_VERSION", goVersion);
ビルド引数は、ARG
内の コマンド に一致します。 前の例を展開すると、これは、パラメーターとして使用する特定のコンテナー イメージバージョンを指定するマルチステージ Dockerfile です。
# Stage 1: Build the Go program
ARG GO_VERSION=1.22
FROM golang:${GO_VERSION} AS builder
WORKDIR /build
COPY . .
RUN go build mygoapp.go
# Stage 2: Run the Go program
FROM mcr.microsoft.com/cbl-mariner/base/core:2.0
WORKDIR /app
COPY --from=builder /build/mygoapp .
CMD ["./mygoapp"]
手記
コンテナー イメージに値をハードコーディングする代わりに、頻繁に変更される値に環境変数を使用することをお勧めします。 これにより、変更が必要な場合は常にコンテナー イメージを再構築する必要がなくなります。
ビルド シークレットを渡す
ビルド引数に加えて、WithBuildSecret を使用してビルド シークレットを指定することもできます。これは、RUN
コマンドの --mount=type=secret
構文を使用して、Dockerfile の個々のコマンドで選択的に使用できます。
var builder = DistributedApplication.CreateBuilder(args);
var accessToken = builder.AddParameter("accesstoken", secret: true);
var container = builder.AddDockerfile("myapp", "relative/context/path")
.WithBuildSecret("ACCESS_TOKEN", accessToken);
たとえば、指定したシークレットを特定のコマンドに公開する Dockerfile の RUN
コマンドについて考えてみます。
# The helloworld command can read the secret from /run/secrets/ACCESS_TOKEN
RUN --mount=type=secret,id=ACCESS_TOKEN helloworld
注意
ビルド環境でシークレットを渡す場合は注意が必要です。 これは、多くの場合、ビルド前にトークンを使用してプライベート リポジトリまたはフィードから依存関係を取得するときに行われます。 挿入されたシークレットが最終的なイメージまたは中間イメージにコピーされないようにすることが重要です。
.NET Aspire