当我在 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)。
感谢@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);