如何仅通过DockerCompose项目的launchSettings.json设置ASPNETCORE_ENVIRONMENT
问题:通过Visual Studio launchSettings.json切换Docker Compose运行的ASP.NET Core 8.0多项目环境
在Visual Studio 2022中开发基于ASP.NET Core 8.0的多项目Web API后端解决方案,使用Docker Compose运行。已在DockerCompose项目的launchSettings.json中定义了Development、Staging、Production环境对应的配置文件,关联appsettings.{ENVIRONMENT}.json。要求保持docker-compose.yml和docker-compose.override.yml固定,不针对每个环境重复配置,仅通过launchSettings.json切换环境,避免使用重复的.env文件,所有配置修改都在launchSettings.json中完成。
尝试过的无效方法
- 添加
environmentVariables属性:在DockerCompose项目的launchSettings.json中添加ASPNETCORE_ENVIRONMENT环境变量
{ ... "commandName": "DockerCompose", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, ... }
- 添加
DockerfileRunArguments属性:配置如下
{ ... "commandName": "DockerCompose", "DockerfileRunArguments": "--build-arg=ENVIRONMENT=Staging", ... }
同时在Dockerfile的ENTRYPOINT前添加:
ARG ENVIRONMENT ENV ASPNETCORE_ENVIRONMENT $ENVIRONMENT
- 添加
commandLineArgs属性:配置如下
{ ... "commandName": "DockerCompose", "commandLineArgs": "-e ASPNETCORE_ENVIRONMENT=Staging", ... }
- 注释
docker-compose.override.yml并将环境配置移至docker-compose.yml:
networks: backend: services: web-api-1: container_name: web-api-1 depends_on: - web-api-n image: ${DOCKER_REGISTRY-}webapi1 restart: always build: context: . dockerfile: web-api-1/Dockerfile environment: - ASPNETCORE_ENVIRONMENT=$ENVIRONMENT networks: - backend ports: - XXXX:XXXX
相关资源
解决方案结构
. └── solution/ ├── class-lib-1/ │ └── files ├── class-lib-2/ │ └── files ├── class-lib-n/ │ └── files ├── web-api-1/ │ ├── files │ ├── properties/ │ │ └── launchSettings.json │ ├── appsettings.{ENVIRONMENT}.json │ └── Dockerfile ├── web-api-2/ │ ├── files │ ├── properties/ │ │ └── launchSettings.json │ ├── appsettings.{ENVIRONMENT}.json │ └── Dockerfile ├── web-api-n/ │ ├── files │ ├── properties/ │ │ └── launchSettings.json │ ├── appsettings.{ENVIRONMENT}.json │ └── Dockerfile └── docker-compose/ ├── launchSettings.json ├── docker-compose.yml └── docker-compose.override.yml
文件示例
launchSettings.json(Development和Staging配置)
{ "profiles": { "Development": { "commandName": "DockerCompose", "commandVersion": "1.0", "composeLaunchAction": "LaunchBrowser", "composeLaunchServiceName": "web-api-1", "composeLaunchUrl": "{Scheme}://localhost:{ServicePort}/swagger", "serviceActions": { "web-api-1": "StartDebugging", "web-api-2": "StartWithoutDebugging", "web-api-n": "DoNotStart" } }, "Staging": { "commandName": "DockerCompose", "commandVersion": "1.0", "composeLaunchAction": "LaunchBrowser", "composeLaunchServiceName": "web-api-1", "composeLaunchUrl": "{Scheme}://localhost:{ServicePort}/swagger", "serviceActions": { "web-api-1": "StartDebugging", "web-api-2": "StartDebugging", "web-api-n": "StartDebugging" } } } }
docker-compose.yml
networks: backend: services: web-api-1: container_name: web-api-1 depends_on: - web-api-n image: ${DOCKER_REGISTRY-}webapi1 restart: always build: context: . dockerfile: web-api-1/Dockerfile networks: - backend ports: - XXXX:XXXX ... ...
docker-compose.override.yml
services: web-api-1: environment: ASPNETCORE_ENVIRONMENT: $ASPNETCORE_ENVIRONMENT ports: - "XXXX" ...
.NET 8.0默认模板Dockerfile
# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE XXXX FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["web-api-1/web-api-1.csproj", "web-api-1/"] RUN dotnet restore "./web-api-1/web-api-1.csproj" COPY . . WORKDIR "/src/web-api-1" RUN dotnet build "./web-api-1.csproj" -c $BUILD_CONFIGURATION -o /app/build/web-api-1 FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./web-api-1.csproj" -c $BUILD_CONFIGURATION -o /app/publish/web-api-1 /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish/web-api-1 . ENTRYPOINT ["dotnet", "web-api-1.dll"]
备注
曾通过传统的.env文件实现需求,但不想反复修改或复制该文件,希望找到一种与Visual Studio交互的可行方案。
内容的提问来源于stack exchange,提问作者ycsvenom
相关产品推荐
相关产品推荐

