【问题标题】:appSettings.json for .NET Core app in Docker?Docker 中 .NET Core 应用程序的 appSettings.json?
【发布时间】:2017-03-03 06:41:54
【问题描述】:

我在 docker 容器中运行 .net 核心应用程序。这是我的 docker 文件(只是为了构建一个开发环境):

FROM microsoft/dotnet:1.0.1-sdk-projectjson 
ENV ASPNET_ENV Development
COPY bin/Debug/netcoreapp1.0/publish/ /root/
EXPOSE 5000/tcp
ENTRYPOINT dotnet /root/AVP.WebApi.dll

我在 /publish/ 文件夹中有一个 appSettings.Development.json 文件。如果我构建并运行这个 Docker 文件,我最终会遇到一个奇怪的问题,即 .NET 应用程序找不到它需要启动的 appsettings(它们在 appSettings.Development.json 文件中)。

我已经从 Windows 的命令行确认,如果我运行 dotnet publish/AVP.WebAPI.dll,应用程序会因缺少配置设置而引发相同的异常。但是,如果我 cd 到 /publish 并运行 dotnet AVP.WebAPI.dll 应用程序启动并运行得很好。

任何想法如何更改我的 docker 文件,以便它可以使用 appSettings.Development.json 值正确运行应用程序? (我也尝试过将所有值复制到常规 appSettings.json 文件中运行该应用程序,但没有成功)

我还尝试对 / 而不是 /root 运行 COPY 命令,并将 dotnet AVP.WebApi.dll 作为入口点,但这会导致项目无法找到依赖项。

【问题讨论】:

    标签: c# docker asp.net-core .net-core dockerfile


    【解决方案1】:

    尝试替换这一行:

    ENV ASPNET_ENV Development
    

    有了这个:

    ENV ASPNETCORE_ENVIRONMENT Development
    

    您的原始环境变量名称在旧版 .NET Core 中使用,但已更改。对于 .NET Core 来说,寻找教程等可能会很痛苦,因为自从它刚开始以来已经发生了所有的变化!

    不要让我开始处理 project.json 文件!

    更多信息:

    https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments

    【讨论】:

      【解决方案2】:

      作为对每个人的跟进(我最初发布的是评论),这就是最终修复它的原因:

      据我所知,dotnet 似乎希望 appsettings 文件位于运行它的同一目录中。所以我将 COPY bin/Debug/netcoreapp1.0/publish/appsettings.json /appsettings.json 添加到 dockerfile 中(这一行将 appsettings 文件复制到 /root/ 下的目录,我将发布文件夹复制到该目录)。一切都在这一点开始工作。似乎 dotnet 可执行文件是从 /root/ 下面的目录运行的,所以之前找不到它,现在 appsettings 在同一个文件夹中,一切都很开心。

      【讨论】:

      • 您也可以通过将“CopyToPublishDirectory”添加到您的 csproj 文件来解决此问题。这在这里讨论:stackoverflow.com/questions/37858312/…
      • 您也可以通过引用 Program.cs - ConfigureAppConfiguration - IConfigurationBuilder.AddJsonFile("Path") 上的 appSettings.json 文件来解决此问题
      【解决方案3】:

      晚了,但我认为我的解决方案会对其他人有所帮助。

      步骤 1. 将 appseting 放入文件夹“Settings/appsettings.json”。 这是我的 appsettings.json

      {
        "ConnectionString": "Data Source=local;Initial Catalog=mydb;User Id=username;Password=myStr0ngPassword@;"
      }
      

      第 2 步。从 asp netcore 编辑代码。

      using Microsoft.Extensions.Configuration;
      using System;
      using System.Collections.Generic;
      using System.IO;
      using System.Reflection;
      using System.Text;
      
      namespace Repos.Configs
      {
          public static class ConfigurationManager
          {
              public static string currentPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
              public static IConfiguration AppSetting { get; }
              static ConfigurationManager()
              {
                  AppSetting = new ConfigurationBuilder()
                          .SetBasePath(currentPath)
                          .AddJsonFile("Settings/appsettings.json") // your path here
                          .Build();
              }
          }
      }
      

      并使用 AppSetting。

      var connectionString = ConfigurationManager.AppSetting["ConnectionString"];
      

      第 3 步。现在你必须配置你的 dockerfile,在我的例子中,由 Visual Studio 在 linux 容器中创建。

      FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
      WORKDIR /app
      EXPOSE 80
      EXPOSE 443
      
      FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
      WORKDIR /src
      COPY ["Api/Api.csproj", "Api/"]
      COPY ["Repos/Repos.csproj", "Repos/"]
      COPY ["DataContext/DataContext.csproj", "DataContext/"]
      RUN dotnet restore "Api/Api.csproj"
      COPY . .
      WORKDIR "/src/Api"
      RUN dotnet build "Api.csproj" -c Release -o /app/build
      
      FROM build AS publish
      RUN dotnet publish "Api.csproj" -c Release -o /app/publish
      
      FROM base AS final
      WORKDIR /app
      COPY --from=publish /app/publish .
      ENTRYPOINT ["dotnet", "Api.dll"]
      

      第 4 步。构建映像。

      docker build -t tagForProject .
      

      第 5 步。映射卷并从映像运行您的容器。

      docker run -p 44382:80 --volume c:\Docker\Volumes\MyProjectNetCore:/app/Settings --name nameWillDisplayInDockerDashboard -d tagForProject 
      

      好的,这里有一个问题,因为 docker 会将 c:\Docker\Volumes\MyProjectNetCore 覆盖到 /app/Settings。所以,你必须把 appseting.json 放到 c:\Docker\Volumes\MyProjectNetCore。 如果没有,您的应用无法读取 appsetting,因为它不存在于 docker 卷中。

      第 6 步。在 docker 仪表板中重新启动您的应用并查看它是否正常工作。

      【讨论】:

        【解决方案4】:

        我能想到为什么找不到appsettings的三个问题:

        1. 它们不在容器的正确文件夹中(您是否复制了发布文件夹并且发布文件夹是否包含应用设置
        2. 您没有为 StartupClass 中的环境定义使用 appsettings:appSettings.${Environment}.json
        3. 它可以在本地工作,因为 windows 文件系统不区分大小写,而 linux 区分大小写,因此无法找到该文件。 (检查您的大小写)。

        【讨论】:

        • 我确实复制了整个发布文件夹,发布文件夹确实包含 appsettings 和 appsettings 开发文件。据我所知,当我将 COPY bin/Debug/netcoreapp1.0/publish/appsettings.json /appsettings.json 添加到 dockerfile 时,dotnet 期望 appsettings 文件位于运行它的同一目录中(这行将 appsettings 文件复制到 /root/ 下的目录,我将发布文件夹复制到其中)一切都开始工作了。
        • 只是一个小提示。我有同样的问题,它是第 3 号:区分大小写。
        【解决方案5】:

        我在 .net 5 中使用 docker-compose,我把它放在我的 yaml 中:

        container_name: heroapi
        environment:
          - ASPNETCORE_ENVIRONMENT=alpha
        

        使用 appsettings.alpha.json 文件,它可以工作

        【讨论】:

          【解决方案6】:

          我自己刚遇到这个问题,问题是默认情况下文件没有被复制。

          通过编辑 .csproj 文件并添加以下内容已解决此问题:

            <ItemGroup>
              <None Update="appsettings.json">
                <CopyToOutputDirectory>Always</CopyToOutputDirectory>
              </None>
            </ItemGroup>
          

          这也可以通过 UI 完成,方法是右键单击 Visual Studio 中的 appsettings 文件,选择属性并将 sopy 设置为“始终”目录。

          【讨论】:

            【解决方案7】:

            我的问题是,通过所有这些 docker 容器的东西。我从来没有在发布模式下构建项目,所以 /bin/release/publish 中的 appsettings.json 文件非常旧。

            【讨论】:

              【解决方案8】:

              我自己也遇到了这个问题,Sam 的回答确实解决了这个问题。只是为了提出不同的解决方案,您还可以在 Dockerfile 中设置 WORKDIR /root 指令,然后使用 ENTRYPOINT dotnet AVP.WebApi.dll 在根目录的上下文中调用 dotnet。

              完整的 Dockerfile:

              FROM microsoft/dotnet:1.0.1-sdk-projectjson 
              ENV ASPNET_ENV Development
              COPY bin/Debug/netcoreapp1.0/publish/ /root/
              WORKDIR /root
              EXPOSE 5000/tcp
              ENTRYPOINT dotnet AVP.WebApi.dll
              

              【讨论】:

                【解决方案9】:

                作曲:

                environment:
                  - ASPNETCORE_ENVIRONMENT=Production
                

                对于 Docker:

                ENV ASPNETCORE_ENVIRONMENT:“生产”

                【讨论】:

                  【解决方案10】:

                  有一种快速简便的方法来更新/编辑AppSettings.json 文件:

                  例如我的AppSettings.json 文件:

                  {
                   "GrpcOption": {
                      "ServerAddress": "oldurl"
                    },
                  }
                  

                  现在我可以通过-e 命令修改它

                  docker run -e "GrpcOption:ServerAddress=newurl"  [imagename]
                  

                  【讨论】:

                    猜你喜欢
                    • 2023-04-10
                    • 2021-05-29
                    • 1970-01-01
                    • 2023-04-07
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-01-23
                    相关资源
                    最近更新 更多