ドキュメントAspire を試す
ドキュメント試す

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

Aspire では、AddDockerfile または WithDockerfile 拡張メソッドを使用して、AppHost の起動時にビルドする Dockerfile を指定できます。

この 2 つのメソッドは異なる目的に使用します:

  • AddDockerfile: 既存の Dockerfile から新しいコンテナーリソースを作成します。カスタムのコンテナー化サービスをアプリモデルに追加したい場合に使用します。
  • WithDockerfile: 既存のコンテナーリソース (データベースやキャッシュなど) をカスタマイズして別の Dockerfile を使用するようにします。Aspire コンポーネントのデフォルトコンテナーイメージを変更したい場合に使用します。

いずれのメソッドも、指定したコンテキストパスに既存の Dockerfile があることを前提としています。どちらのメソッドも Dockerfile を新規作成しません。AppHost コードから Dockerfile を生成するには、代わりに Dockerfile ビルダー API を使用してください。

AddDockerfile と WithDockerfile の使い分け

Section titled “AddDockerfile と WithDockerfile の使い分け”

シナリオに応じて適切なメソッドを選択してください:

AddDockerfile を使用する場合:

  • カスタムのコンテナー化サービスをアプリモデルに追加したい場合。
  • カスタムアプリケーションまたはサービス用の既存の Dockerfile がある場合。
  • Aspire コンポーネントが提供していない新しいコンテナーリソースを作成する必要がある場合。

WithDockerfile を使用する場合:

  • 既存の Aspire コンポーネント (PostgreSQL、Redis など) をカスタマイズしたい場合。
  • デフォルトのコンテナーイメージをカスタムのものに置き換える必要がある場合。
  • 厳密に型指定されたリソースビルダーとその拡張メソッドを引き続き使用したい場合。
  • デフォルトのコンテナーイメージでは対応できない要件がある場合。

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

Section titled “アプリモデルに Dockerfile を追加する”

次の例では、AddDockerfile 拡張メソッドを使用して、コンテナービルドのコンテキストパスを参照することでコンテナーを指定しています。

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const container: ContainerResource
container
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addDockerfile(name: string, contextPath: string, options?: {
dockerfilePath?: string;
stage?: string;
}): ContainerResource (+1 overload)

Adds a Dockerfile to the application model that can be treated like a container resource.

addDockerfile
(
"mycontainer", "relative/context/path");

コンテキストパスの引数がルートパスでない場合、コンテキストパスは AppHost プロジェクトディレクトリからの相対パスとして解釈されます。

デフォルトでは使用される Dockerfile の名前は Dockerfile であり、コンテキストパスディレクトリ内に存在することが期待されます。Dockerfile の名前は絶対パスまたはコンテキストパスへの相対パスとして明示的に指定することもできます。

これは、ローカルで実行する場合や AppHost がデプロイする際に使用する特定の Dockerfile を変更したい場合に便利です。

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const container: ContainerResource
container
= (await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.executionContext: PropertyAccessor<DistributedApplicationExecutionContext>

Execution context for this invocation of the AppHost.

executionContext
.
DistributedApplicationExecutionContext.isRunMode: () => Promise<boolean>

Returns true if the current operation is running.

isRunMode
())
? await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addDockerfile(name: string, contextPath: string, dockerfilePath?: string, stage?: string): ContainerResource (+1 overload)

Adds a Dockerfile to the application model that can be treated like a container resource.

addDockerfile
(
"mycontainer", "relative/context/path", "Dockerfile.debug")
: await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addDockerfile(name: string, contextPath: string, dockerfilePath?: string, stage?: string): ContainerResource (+1 overload)

Adds a Dockerfile to the application model that can be treated like a container resource.

addDockerfile
(
"mycontainer", "relative/context/path", "Dockerfile.release");

既存のコンテナーリソースをカスタマイズする

Section titled “既存のコンテナーリソースをカスタマイズする”

AddDockerfile を使用する場合、戻り値は IResourceBuilder<ContainerResource> です。Aspire には ContainerResource から派生した多くのカスタムリソース型が含まれています。

WithDockerfile 拡張メソッドを使用すると、既存の Aspire コンポーネント (PostgreSQL、Redis、SQL Server など) のデフォルトコンテナーイメージを、独自の Dockerfile からビルドしたカスタムイメージに置き換えることができます。これにより、基盤となるコンテナーをカスタマイズしながら、厳密に型指定されたリソース型とその固有の拡張メソッドを引き続き使用できます。

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const pgsql: PostgresServerResource
pgsql
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addPostgres(name: string, options?: {
userName?: string | ParameterResource;
password?: string | ParameterResource;
port?: number;
}): PostgresServerResource (+1 overload)

Adds a PostgreSQL resource to the application model. A container is used for local development.

addPostgres
("pgsql");
// デフォルトの PostgreSQL コンテナーイメージをカスタムイメージに置き換えます
// Dockerfile からビルドしたものを使用し、PostgreSQL 固有の機能は維持されます。
await
const pgsql: PostgresServerResource
pgsql
.
ContainerResource.withDockerfile(contextPath: string, options?: {
dockerfilePath?: string;
stage?: string;
} | undefined): PostgresServerResource (+1 overload)

Causes Aspire to build the specified container image from a Dockerfile.

withDockerfile
("path/to/context");
await
const pgsql: PostgresServerResource
pgsql
.
PostgresServerResource.withPgAdmin(options?: {
configureContainer?: ((obj: PgAdminContainerResource) => Promise<void>) | undefined;
containerName?: string;
} | undefined): PostgresServerResource (+1 overload)

Adds a pgAdmin 4 administration and development platform for PostgreSQL to the application model.

withPgAdmin
(); // PostgreSQL リソースであることに変わりないため、引き続き動作します。

Dockerfile をプログラムで生成する

Section titled “Dockerfile をプログラムで生成する”

AddDockerfileBuilder または WithDockerfileBuilder は、AppHost コードから Dockerfile を生成する必要がある場合に使用します。これらの API は、Dockerfile が AppHost の設定に依存する場合、Dockerfile フラグメントを組み合わせたい場合、またはマルチステージイメージのビルドロジックをリソース定義の近くに保ちたい場合に便利です。

AddDockerfileBuilder は、新しいコンテナーリソースを作成し、生成された Dockerfile を 1 ステップで設定します:

apphost.mts
import { createBuilder } from './.aspire/modules/aspire.mjs';
import type { DockerfileBuilderCallbackContext } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
const configureDockerfile = async (context: DockerfileBuilderCallbackContext) => {
const dockerfile = await context.builder();
await dockerfile
.from("node:22-alpine", { stageName: "build" })
.workDir("/app")
.copy("package*.json", "./")
.run("npm ci")
.copy(".", ".")
.run("npm run build");
await dockerfile
.from("nginx:alpine", { stageName: "runtime" })
.copyFrom("build", "/app/dist", "/usr/share/nginx/html")
.expose(80);
};
await builder.addDockerfileBuilder("frontend", "../frontend", configureDockerfile, {
stage: "runtime",
});
await builder.build().run();

WithDockerfileBuilder は、既存のコンテナーリソースに生成された Dockerfile を適用します。リソースの作成時に指定されたイメージ名は、パブリッシュ時に生成された Dockerfile のビルドに置き換えられます:

apphost.mts
import { createBuilder } from './.aspire/modules/aspire.mjs';
import type { DockerfileBuilderCallbackContext } from './.aspire/modules/aspire.mjs';
const builder = await createBuilder();
const configureDockerfile = async (context: DockerfileBuilderCallbackContext) => {
const dockerfile = await context.builder();
await dockerfile
.from("nginx:alpine", { stageName: "runtime" })
.copy(".", "/usr/share/nginx/html")
.expose(80);
};
await builder
.addContainer("frontend", "nginx:alpine")
.withDockerfileBuilder("../frontend", configureDockerfile, {
stage: "runtime",
});
await builder.build().run();

WithBuildArg メソッドを使用して、コンテナーイメージのビルドに引数を渡すことができます。

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const container: ContainerResource
container
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addDockerfile(name: string, contextPath: string, options?: {
dockerfilePath?: string;
stage?: string;
}): ContainerResource (+1 overload)

Adds a Dockerfile to the application model that can be treated like a container resource.

addDockerfile
("mygoapp", "relative/context/path");
await
const container: ContainerResource
container
.
ContainerResource.withBuildArg(name: string, value: string | ParameterResource): ContainerResource

Adds a build argument when the container is built from a Dockerfile.

withBuildArg
("GO_VERSION", "1.22");

WithBuildArg メソッドの値パラメーターには、リテラル値 (booleanstringint) またはパラメーターリソースのリソースビルダーを指定できます (パラメーターリソース を参照)。次のコードでは、GO_VERSION をデプロイ時に指定できるパラメーター値に置き換えます。

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const goVersion: ParameterResource
goVersion
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addParameter(name: string, options?: {
value?: string;
publishValueAsDefault?: boolean;
secret?: boolean;
}): ParameterResource (+1 overload)

Adds a parameter resource

addParameter
("goversion");
const
const container: ContainerResource
container
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addDockerfile(name: string, contextPath: string, options?: {
dockerfilePath?: string;
stage?: string;
}): ContainerResource (+1 overload)

Adds a Dockerfile to the application model that can be treated like a container resource.

addDockerfile
("mygoapp", "relative/context/path");
await
const container: ContainerResource
container
.
ContainerResource.withBuildArg(name: string, value: string | ParameterResource): ContainerResource

Adds a build argument when the container is built from a Dockerfile.

withBuildArg
("GO_VERSION",
const goVersion: ParameterResource
goVersion
);

ビルド引数は DockerfilesARG コマンド に対応します。前述の例を拡張したマルチステージ Dockerfile では、使用するコンテナーイメージのバージョンをパラメーターとして指定しています。

Dockerfile
# Stage 1: Go プログラムをビルドする
ARG GO_VERSION=1.22
FROM golang:${GO_VERSION} AS builder
WORKDIR /build
COPY . .
RUN go build mygoapp.go
# Stage 2: Go プログラムを実行する
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 内の個別のコマンドに選択的に公開されます。

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
const
const builder: IDistributedApplicationBuilder
builder
= await
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
();
const
const accessToken: ParameterResource
accessToken
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addParameter(name: string, options?: {
value?: string;
publishValueAsDefault?: boolean;
secret?: boolean;
}): ParameterResource (+1 overload)

Adds a parameter resource

addParameter
("accesstoken", {
secret?: boolean | undefined
secret
: true });
const
const container: ContainerResource
container
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addDockerfile(name: string, contextPath: string, options?: {
dockerfilePath?: string;
stage?: string;
}): ContainerResource (+1 overload)

Adds a Dockerfile to the application model that can be treated like a container resource.

addDockerfile
("myapp", "relative/context/path");
await
const container: ContainerResource
container
.
ContainerResource.withBuildSecret(name: string, value: string | ParameterResource): ContainerResource

Adds a secret build argument when the container is built from a Dockerfile.

withBuildSecret
("ACCESS_TOKEN",
const accessToken: ParameterResource
accessToken
);

たとえば、DockerfileRUN コマンドで指定したシークレットを特定のコマンドに公開する場合を考えてみましょう:

Dockerfile
# helloworld コマンドは /run/secrets/ACCESS_TOKEN からシークレットを読み取ることができます
RUN --mount=type=secret,id=ACCESS_TOKEN helloworld