如何在Docker中设置.NET Core的环境?

17

我希望能够在不同的环境中(目前只是开发和生产环境)通过Docker运行Dotnet Core,但我的Docker始终在生产环境下启动。 这里是我的Docker文件:

FROM microsoft/dotnet:sdk AS build-env

WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -o out

# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "test.dll"]

我有appsettings.Production.json和appsettings.Development.json两个文件, 并且我已经在program.cs中配置了我的两个环境,如下所示:

 public static IWebHostBuilder CreateWebHostBuilder (string[] args) =>
            WebHost.CreateDefaultBuilder (args)

            .ConfigureAppConfiguration ((hostingContext, config) => {
                config.AddJsonFile ("appsettings.Development.json", optional : false, reloadOnChange : false)
                    .AddJsonFile ("appsettings.Production.json", optional : false, reloadOnChange : false);
            })
            //End of update
            .UseStartup<Startup> ();

我已经构建了Docker镜像和容器,但当它启动时,它会以生产模式启动,而我想让它以开发模式启动。

4个回答

16
ENTRYPOINT ["dotnet", "test.dll", "--environment=Development"]

2
那帮了我一个大忙! - Sarah Lissachell

12

ASP.NET Core会读取环境变量ASPNETCORE_ENVIRONMENT,如果没有设置,则默认为production。您需要在Dockerfile中使用它。

ENV ASPNETCORE_ENVIRONMENT Development

如果您使用的是docker-compose.yml文件

environment:
  ASPNETCORE_ENVIRONMENT: Development

更多详细信息:


2
我已经这样做了,但是当我运行docker日志时,它仍然显示:托管环境:生产。 - mmffggss
也许您需要修改代码以便像这里所示检测实际环境:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.2#environments - Mostafa Hussein
如果您将代码中的配置文件名称更改为 appsettings.{env.EnvironmentName}.json,会发生什么呢? - Mostafa Hussein
而对于代码修改部分,我之前已经在我的launchsettings.json文件中完成了,它本身可以工作,但是在Docker中却无法工作。 - mmffggss
请注意,我已经更新了答案,将“Development”首字母大写。 - Mostafa Hussein
显示剩余5条评论

2
我有同样的问题。我的项目有3个appsettings.json文件(一个通用的和两个用于开发和生产,如appsettings.development.json和appsettings.producation.json)。
我尝试了以下方法:
  1. 在任何docker文件中都不提及环境变量,因为我不想将其固定在文件中(分别是源代码控制),因为我应该可以在不同的环境中运行相同的镜像。我使用--env ASPNETCORE_ENVIRONMENT = development或DOTNET_ENVIRONMENT = development启动容器,但没有结果。
  2. 我在dockerfile中添加了ENV ASPNETCORE_ENVIRONMENT development,并且它可以工作。但这使我失去了第一条提示中的进程。所以我把它删除了。
  3. 我只使用--env Environment = development启动容器,它竟然奇迹般地工作了!真神奇!实际上,我仍然不知道它为什么能够工作。'Environment'是Docker的内置变量吗?它与ASPNETCORE_ENVIRONMENT有什么关系?还是ASPNETCORE_ENVIRONMENT(和DOTNET_ENVIRONMENT)变量最终会转化为ENVIRONMENT变量?

2
如果在运行容器时不指定环境变量,它将默认采用“Production”环境。
要运行另一个环境,请执行以下操作: docker run -d -p 8000:80 –name something –env ASPNETCORE_ENVIRONMENT=Development myimage 其中,“Development”是您想要运行的环境名称。

我运行了它,但是它给出了这个错误 \Docker\Docker\Resources\bin\docker.exe: invalid reference format。 - mmffggss
1
在--env标志前需要两个破折号。否则只使用-e。 - Josh L
--env 对我完全没有用,但 -e 却非常好用。 - sezmeralda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接