适用于Docker中的.NET Core应用程序的appSettings.json?

时间:2017-03-03 06:41:55

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

我在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文件中)。

我已经确认,如果我运行dotnet publish / AVP.WebAPI.dll,则从Windows的命令行启动应用程序会丢失相同的例外,以便丢失配置设置。但是,如果我cd /发布并运行dotnet AVP.WebAPI.dll,应用程序启动并运行正常。

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

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

8 个答案:

答案 0 :(得分:8)

尝试替换此行:

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

答案 1 :(得分:4)

作为对所有人的跟进(我发布这是最初的评论),这就是最终解决它的问题:

据我所知,看起来dotnet期望appsettings文件位于运行的同一目录中。所以我将COPY bin / Debug / netcoreapp1.0 / publish / appsettings.json /appsettings.json添加到dockerfile(此行将appsettings文件复制到/ root /下面的目录,我将发布文件夹复制到)。一切都开始在这一点上起作用。似乎dotnet可执行文件从/ root /下面的目录运行,所以它之前无法找到它,现在appsettings在同一个文件夹中,它都很高兴。

答案 2 :(得分:1)

我可以想到三个问题,为什么它找不到appsettings:

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

答案 3 :(得分:1)

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

container_name: heroapi
environment:
  - ASPNETCORE_ENVIRONMENT=alpha

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

答案 4 :(得分:0)

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

通过编辑.csproj文件并添加:

来解决此问题
  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

这也可以通过在Visual Studio中右键单击appsettings文件,选择属性并将目录设置为&#34;始终&#34;

来通过UI完成。

答案 5 :(得分:0)

我自己亲自解决了这个问题,而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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

步骤 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 仪表板中重新启动您的应用并查看它的工作情况。