Linux 上的 ASP .NET + Docker 抛出 system.io.filenotfoundException:找不到文件

问题描述 投票:0回答:1

当我在 Linux 上使用 Docker 运行 .NET Web Api 项目时,出现错误。这只是我想要托管的一个非常小的电子邮件服务。引发错误的文件是 html 电子邮件模板文件,因此它是一个 .html 文件。

我的服务在windwos上以调试模式工作,也在Windows上运行的docker中工作,但是当我在我的网络服务器上运行它并尝试发送电子邮件时,它会抛出错误

system.io.filenotfoundException:找不到文件

相对路径应该在docker中:

/app/模板/email-template.html

我已经在互联网上搜索解决方案,但自己没有找到。 到目前为止我尝试过的是:

a) 更改 EmailService.cs 文件中的路径

//1st try
Directory.GetCurrentDirectory() + "/Templates/email-template.html"

//2nd try
@"Templates/email-template.html"

//3rd try
@"templates/email-template.html"

//4th try
@"email-template.html"

在 docker 文件中,我尝试将文件复制到 workdir 文件,因为我读到也许它们在 docker 构建期间没有被复制

我尝试了 docker 文件中的那些复制内容

#1
COPY MailService.WebApi/Templates/email-template.html /app/templates/
#2
COPY MailService.WebApi/Templates/email-template.html .
#3
COPY ["MailService.WebApi/Templates/email-template.html", "MailService.WebApi/"]

我真的不明白为什么它不能在Linux上工作,因为它在Windows上运行(调试模式和docker)。

c# asp.net docker
1个回答
0
投票

感谢@coder_b

var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory , "Templates/email-template.html")

另外

在 docker 容器中,您可以检查文件夹中是否存在您的文件

app

还要确保您使用

Path.Combine
,如果您执行类似的操作,它将不起作用,因为 linux:

var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory , "Templates\\email-template.html")

注意这两个 \ linux 只接受 / 所以解决方案是:

var filePath = Path.Combine("Templates", "email-template.html");
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filePath);
© www.soinside.com 2019 - 2024. All rights reserved.