次の方法で共有


.NET アプリ モデルに Dockerfile を追加する

.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 パラメーターには、リテラル値 (booleanstringint) を指定することも、パラメーター リソースのリソース ビルダーにすることもできます。 次のコードは、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);

たとえば、指定したシークレットを特定のコマンドに公開する DockerfileRUN コマンドについて考えてみます。

# The helloworld command can read the secret from /run/secrets/ACCESS_TOKEN
RUN --mount=type=secret,id=ACCESS_TOKEN helloworld

注意

ビルド環境でシークレットを渡す場合は注意が必要です。 これは、多くの場合、ビルド前にトークンを使用してプライベート リポジトリまたはフィードから依存関係を取得するときに行われます。 挿入されたシークレットが最終的なイメージまたは中間イメージにコピーされないようにすることが重要です。