【问题标题】:Copy and use json-config file in Docker ASP.NET Core webapplication在 Docker ASP.NET Core Web 应用程序中复制和使用 json-config 文件
【发布时间】:2019-12-13 00:32:34
【问题描述】:

设置
在我的解决方案文件夹中,我有这个文件/文件夹结构

来源
docker-compose.yml
.dockerignore
路径.json
网络项目
//所有web-project文件(包括DockerFile)
另一个网络项目
//所有web-project文件(包括DockerFile)

在我的 Visual Studio 项目中,我将 paths.json 添加为 linked 文件并将其包含在我的图像中,我设置了我的 csproj 文件(不知道这是否是必须的……)

<Project Sdk="Microsoft.NET.Sdk.Web">
 <PropertyGroup>
  <TargetFramework>netcoreapp3.0</TargetFramework>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  <DockerDefaultTargetOS>Windows</DockerDefaultTargetOS>
  <UserSecretsId>8bcf6be2-9d06-4667-89f6-38f25af5dfbc</UserSecretsId>
  <DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
 </PropertyGroup>
 <ItemGroup>
  <Content Include="..\paths.json" Link="paths.json">
   <CopyToOutputDirectory>Always</CopyToOutputDirectory>
   <CopyToPublishDirectory>Always</CopyToPublishDirectory>
  </Content>
 </ItemGroup>
 ...
</Project>

还有我的 Dockerfile 到:

 FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-nanoserver-1803 AS base
 WORKDIR /app
 EXPOSE 80
 EXPOSE 443

 FROM mcr.microsoft.com/dotnet/core/sdk:3.0-nanoserver-1803 AS base
 WORKDIR /src
 COPY ["Webproject/Webproject.csproj", "Webproject/"]
 COPY "paths.json" "paths.json"
 RUN dotnet restore "Webproject/Webproject.csproj"
 COPY . .
 WORKDIR "/src/Webproject"
 RUN dotnet build "Webproject.csproj" -c Release -o /app

 FROM build AS publish
 RUN dotnet publish "Webproject.csproj" -c Release -o /app

 FROM base AS final
 WORKDIR /app
 COPY --from=publish /app .
 ENTRYPOINT ["dotnet", "Webproject.dll"]

要在我的应用程序中使用该文件,我使用:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                var environment = context.HostingEnvironment;
                var folder = Path.Combine(environment.ContentRootPath);

                config.AddJsonFile(Path.Combine(folder, "paths.json"), false);
            })
            .UseStartup<Startup>();

我什至试图在我的 .dockerignore 文件中排除它:

 !paths.json

仅供参考...我也在使用 docker-compose 项目

错误
启动应用程序时出现此错误:
System.IO.FileNotFoundException:'未找到配置文件'paths.json',不是可选的。物理路径是'C:\app\paths.json'。'

问题
我在 Dockerfile 中尝试了很多不同的路径来包含它,但它似乎不起作用。谁能帮我设置正确的路径? 另外,我搜索了是否可以列出所有文件(以检查它是否复制到正确的路径),但似乎不可能?

【问题讨论】:

  • 如果需要更多信息,请告诉我!我会尽快提供的
  • 你的 dockerfile 在哪里?
  • 它在 Webproject 文件夹中
  • 检查我的答案。

标签: docker asp.net-core config visual-studio-2019


【解决方案1】:

不确定您的完整 dockerfile 内容和 dockerfile 路径,请尝试以下步骤:

  1. 文件夹结构

  2. 来源

    • Dockerfile
    • paths.json

    • 网络项目

  3. Dockerfile

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

    docker命令中不需要复制paths.jsonRUN dotnet buildRUN dotnet publish不会将此文件复制到发布的文件夹中

  4. 我们使用链接文件复制paths.json,.csproj 内容

    <Project Sdk="Microsoft.NET.Sdk.Web">
    
        <PropertyGroup>
            <TargetFramework>netcoreapp2.2</TargetFramework>
            <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
            <UserSecretsId>2594cc66-3d1a-487b-a93c-99e0cf9975ef</UserSecretsId>
            <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
            <DockerfileContext>.</DockerfileContext>
        </PropertyGroup>
        <ItemGroup>
            <Content Include="..\paths.json" Link="paths.json">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
            <CopyToPublishDirectory>Always</CopyToPublishDirectory>
            </Content>
        </ItemGroup>
    
        <ItemGroup>
            <PackageReference Include="Microsoft.AspNetCore.App" />
            <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
            <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.7.9" />
        </ItemGroup>
    
    </Project>
    
  5. 通过docker build -t dockerfilecopy .等命令在Source文件夹中构建镜像

【讨论】:

  • 这不是因为我使用了 docker-compose 文件而不同吗?
  • DockerFile 中的路径不是相对于 docker-compose 文件(如果存在)吗? (+ 我宁愿保持我的文件结构如上,因为我有多个 webprojects 和多个 DockerFiles)
  • @RubenHerman 对于 dockerfile,您无法从 dockerfile 访问父文件。复制文件的方式由&lt;Content Include="..\paths.json" Link="paths.json"&gt;控制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
相关资源
最近更新 更多