【问题标题】:Accessing CSV files on host from .NET Core App in Docker container从 Docker 容器中的 .NET Core 应用程序访问主机上的 CSV 文件
【发布时间】:2020-10-08 09:11:04
【问题描述】:

我无法从 docker 容器上运行的 ASP.NET Core Web API app 访问主机上的 CSV 文件。 Web 应用程序根据official document 中的Dockerfile 在发布模式下工作。这是我的Dockerfiledocker-compose.yml

aspnetapp
|- MyApp
|  |- MyApp.csproj
|- Dockerfile
|- data
|  |- user_input.csv (I want to access here from .NET App on docker)
...

Dockerfile

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80 
EXPOSE 443
RUN curl -sL https://deb.nodesource.com/setup_10.x |  bash -
RUN apt-get install -y nodejs

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
RUN curl -sL https://deb.nodesource.com/setup_10.x |  bash -
RUN apt-get install -y nodejs
COPY ["MyApp/MyApp.csproj", "MyApp/"]
RUN dotnet restore "MyApp/MyApp.csproj"
COPY . .
WORKDIR "/src/MyApp"
RUN dotnet build "MyApp.csproj" -c Release -o /app/build

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

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

docker-compose.yml

version: "3"
services:
  aspnetapp:
    image: aspnetapp-img
    build: ./aspnetapp
    container_name: aspnetapp-ctr
    environment:
      ConnectionStrings__DefaultConnection: "server=mysql; uid=root; pwd=P@ssw0rd!; database=mydb;"
    ports:
      - "5000:80"
    depends_on:
      - mysql
  mysql:
    image: mysql-img
    ...

(MyApp 在 docker 上也使用了 mysql,但我省略了这部分,因为它与这个问题无关)

要从 MyApp 容器访问主机 (user_input.csv) 上的 CSV 文件,我假设我应该将 aspnetapp/data 挂载到 aspnetapp-img 上的某个位置。如果用户在运行容器时更改了 CSV 文件,应用程序应该访问新文件,所以我需要在 Dockerfile 中挂载它而不是 COPY

这就是我提出问题的地方。

  1. 在 docker 容器上挂载到什么位置?
  2. 如何从控制器访问文件?
[ApiController]
[Route("api/[controller]")]
public class FileController : ControllerBase
{
  public IActionResult AccessCsvFile()
  {
    var filePath = Path.Combine(_appEnvironment.ContentRootPath, "user_input.csv");
    ...

我可以通过这种方式从控制器访问 csv 文件吗?

【问题讨论】:

  • 如果是我,我会把 csv 放在一个 azure Blob 中并从那里获取它,那么您就不必担心文件系统了。
  • 感谢您的评论!实际上,我是一名大学生,我正在构建这个系统作为我实验室的内部系统。所以我没有使用外部服务的权限或金钱......一种可能的解决方案是从客户端(React)上传文件,但如果文件数量很大,我认为这不是一个好主意...
  • 耸耸肩,您可以获得一个免费帐户,不会为一个 blob 花费任何费用。从架构上讲,它有很多优点,并且它从等式中删除了文件系统。
  • Azure 为学生提供了很多免费选项。做学生是件好事:)

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


【解决方案1】:

多个选项:

  1. 命令行
docker run -v <relative/absolute path/data/user_input.csv>:/data/input.csv 

  1. Docker-compose
   volumes:
      - <relative/absolute path/data/user_input.csv>:/data/input.csv 

更多:https://docs.docker.com/storage/volumes/https://docs.docker.com/compose/#preserve-volume-data-when-containers-are-created

如果你想使用 Azure:https://github.com/Azure/azurefile-dockervolumedriver

及其他插件:https://docs.docker.com/engine/extend/legacy_plugins/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多