diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6327256 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,16 @@ +**/.DS_Store +**/.git +**/.gitignore +**/.vs +**/.vscode +**/bin +**/obj +**/TestResults +**/*.user +**/*.suo +**/*.cache + +Dockerfile +docker-compose*.yml +README.md +docs diff --git a/README.md b/README.md index b0cf666..5f679ca 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,40 @@ MinIO 設定(`src/FileAccessAgent.Api/appsettings.json`): - `Minio:UseSsl`:`true|false` - `Minio:Region`:可空 +## Docker + +API Dockerfile 位於 `src/FileAccessAgent.Api/Dockerfile`,建置時請使用 repo root 作為 build context,讓 Docker 可以存取 Api、Application、Domain、Infrastructure project references。 + +建置 image: + +```bash +docker build -f src/FileAccessAgent.Api/Dockerfile -t file-access-agent-api . +``` + +啟動 API(container 內 listen `8080`): + +```bash +docker run --rm -p 8080:8080 \ + -e Instance__TenantId=d8107508-e6b9-4630-b982-c7bbb0cb228f \ + -e Auth__Issuer=http://host.docker.internal:7850/ \ + -e Auth__Audience=file_access_api \ + -e Auth__RequireHttpsMetadata=false \ + -e MemberCenter__BaseUrl=http://host.docker.internal:7850/ \ + file-access-agent-api +``` + +若使用 local storage,建議掛載 volume,避免 container 移除後檔案遺失: + +```bash +docker run --rm -p 8080:8080 \ + -e Storage__Provider=local \ + -e Instance__StorageRoot=/app/data/storage \ + -v "$(pwd)/data/storage:/app/data/storage" \ + file-access-agent-api +``` + +若使用 MinIO 且 MinIO 也在 Docker network 中,`Minio__Endpoint` 應使用 service/container DNS 名稱,例如 `minio:9000`;不要使用 container 內的 `localhost:9000`。 + ## 實作語言 本專案已決定使用 C# / ASP.NET Core。 @@ -226,4 +260,5 @@ MinIO 設定(`src/FileAccessAgent.Api/appsettings.json`): - 專案目標已依 `../member_center` 文件整理。 - 已確認使用 C# / ASP.NET Core。 - `tenant_id` 與 delegated download token 分工已依最新版 `member_center` 文件校正。 +- API 已提供 Dockerfile,可用 .NET 8 多階段建置產生 container image。 - 目前目錄中的 .NET skeleton 可作為正式起點,但仍需依最新流程補上 Member Center validation 串接。 diff --git a/src/FileAccessAgent.Api/Dockerfile b/src/FileAccessAgent.Api/Dockerfile new file mode 100644 index 0000000..5c9ee53 --- /dev/null +++ b/src/FileAccessAgent.Api/Dockerfile @@ -0,0 +1,32 @@ +# syntax=docker/dockerfile:1 + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src + +COPY ["FileAccessAgent.sln", "./"] +COPY ["src/FileAccessAgent.Api/FileAccessAgent.Api.csproj", "src/FileAccessAgent.Api/"] +COPY ["src/FileAccessAgent.Application/FileAccessAgent.Application.csproj", "src/FileAccessAgent.Application/"] +COPY ["src/FileAccessAgent.Domain/FileAccessAgent.Domain.csproj", "src/FileAccessAgent.Domain/"] +COPY ["src/FileAccessAgent.Infrastructure/FileAccessAgent.Infrastructure.csproj", "src/FileAccessAgent.Infrastructure/"] +RUN dotnet restore "src/FileAccessAgent.Api/FileAccessAgent.Api.csproj" + +COPY . . +WORKDIR /src/src/FileAccessAgent.Api +RUN dotnet publish "FileAccessAgent.Api.csproj" \ + -c "$BUILD_CONFIGURATION" \ + -o /app/publish \ + --no-restore \ + /p:UseAppHost=false + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final +WORKDIR /app +ENV ASPNETCORE_URLS=http://+:8080 \ + DOTNET_RUNNING_IN_CONTAINER=true +EXPOSE 8080 + +RUN mkdir -p /app/data/storage && chown -R "$APP_UID:$APP_UID" /app/data +USER $APP_UID + +COPY --from=build /app/publish . +ENTRYPOINT ["dotnet", "FileAccessAgent.Api.dll"]