「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
生成AIを活用しスクラッチでコンテナ化する際の手順をメモ
プロジェクト・ルートに Dockerfile を作成
dockerfile# ビルドステージ FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src # プロジェクト・ファイルをコピーして依存関係を復元 COPY ["MyApp.csproj", "."] RUN dotnet restore "./MyApp.csproj" # ソースコードをコピーしてビルド COPY . . RUN dotnet build "MyApp.csproj" -c Release -o /app/build # 発行ステージ FROM build AS publish RUN dotnet publish "MyApp.csproj" -c Release -o /app/publish /p:UseAppHost=false # 実行ステージ(軽量イメージ) FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final WORKDIR /app EXPOSE 8080 COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "MyApp.dll"]
※ マルチステージ・ビルドという手法を使っている。
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyApp.csproj", "."] RUN dotnet restore "./MyApp.csproj"
COPY . . RUN dotnet build "MyApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyApp.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
WORKDIR /app
EXPOSE 8080
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]
※ COPYコマンドのポイント
**/bin/ **/obj/ **/out/ .git/ .vs/ *.user
不要なファイルをビルドコンテキストから除外。
docker build -t myapp:latest .
docker run -d -p 8080:8080 --name myapp myapp:latest
docker compose up -d
docker logs myapp
docker exec -it myapp /bin/bash
プロジェクト・ルートに docker-compose.yml を作成
最も簡潔な例
version: '3.8'
services:
ap:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ConnectionStrings__Default=Server=db;Database=MyDb;...
depends_on:
- db
db:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
- SA_PASSWORD=YourPassword123!
- ACCEPT_EULA=Y
ports:
- "1433:1433"
2つのファイルを使用する場合
version: '3.8'
services:
db:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
- SA_PASSWORD=YourPassword123!
- ACCEPT_EULA=Y
ports:
- "1433:1433"
networks:
- shared-net
networks:
shared-net:
name: myapp-network # 固定名を指定(server側から参照するため)
driver: bridge
※ 各サービスは「参加する」ネットワークを指定し、末尾で、そのネットワークの「定義」する。version: '3.8'
services:
ap:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ConnectionStrings__Default=Server=db;Database=MyDb;...
networks:
- shared-net
networks:
shared-net:
name: myapp-network # db側と同じ名前を指定する。
external: true # 新規作成せず、既存を使う。
※ ファイルを跨いだ depends_on は使えないため削除する。# 1. まずDBを起動 docker compose -f docker-compose.db.yml up -d # 2. DBが準備できたらサーバーを起動 docker compose -f docker-compose.server.yml up -d
# 停止する場合(逆順) docker compose -f docker-compose.server.yml down docker compose -f docker-compose.db.yml down
※ ネットワークはコマンドで作成してファイル中は全て「external: true」にすると起動順は任意になる。
docker network create --driver bridge shared-net
ホストビルド方式では、コンテナ内部ではなく、ホストOS(WindowsやLinux上)でビルドした生成物をコンテナに詰める方式。
# 実行ステージ(軽量イメージのみ) FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final WORKDIR /app EXPOSE 8080 COPY ./publish . ENTRYPOINT ["dotnet", "MyApp.dll"]
dotnet publish "MyApp.csproj" -c Release -o ./publish /p:UseAppHost=false
docker build -t myapp .