我在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作为入口点,但这会导致项目无法找到依赖项。
答案 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:
appSettings.${Environment}.json
答案 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 仪表板中重新启动您的应用并查看它的工作情况。