对 Docker 目录结构感到困惑(找不到文件错误)

Confused by Docker directory structure (file not found error)

我收到文件未找到错误,即使我在 Docker 容器中手动创建文件,它仍然报告未找到。解决这个问题当然很复杂,因为我是 Docker 的新手,并且要了解 docker 世界中的一切是如何运作的。

我正在使用 Docker 带有 .net 核心应用程序的桌面。

在 .Net 应用程序中,我正在寻找用作电子邮件模板的文件。当我 运行 在 Docker 容器之外但在 docker 容器内时,所有这些都有效,它因找不到文件而失败。

public async Task SendEmailAsyncFromTemplate(...)
{
   ...snipped for brevity
        
        string path = Path.Combine(Environment.CurrentDirectory, @$"Infrastructure\Email\{keyString}\{keyString}.cshtml");

        _logger.LogInformation("path: " + path);

        //I added this line because when I connect to docker container the root 
        //appears to start with infrastructure so I chopped the app part of
        var fileTemplatePath = path.Replace(@"/app/", "");

        _logger.LogInformation("filePath: " + fileTemplatePath);

上面的容器日志是

[12:40:09 INF] path: /app/Infrastructure\Email\ConfirmUser\ConfirmUser.cshtml
[12:40:09 INF] filePath: Infrastructure\Email\ConfirmUser\ConfirmUser.cshtml

如评论中所述,我这样做是因为当我连接到容器时,根目录将 Infrastructure 显示为第一个文件夹。

所以我自然而然地浏览到 Infrastructure,发现 Email 文件夹不见了。我已经单独询问了 SO question here about 为什么我的文件夹没有被复制。

好的,我的基础架构下的电子邮件文件和文件夹丢失了。因此,为了对此进行测试,我手动创建了目录结构并使用以下命令创建了 cshtml 文件:

docker exec -i addaeda2130d sh -c "cat > Infrastructure/Email/ConfirmUser/ConfirmUser.cshtml" < ConfirmUser.cshtml

我将文件权限更改为 777 以确保应用程序具有写入权限,然后添加了此调试代码。

_logger.LogInformation("ViewRender: " + filename);

try
{
   _logger.LogInformation("Before FileOpen");
   var fileExista = File.Exists(filename);

   _logger.LogInformation("File exists: " + fileExista);

   var x = File.OpenRead(filename);

  _logger.LogInformation("After FileOpen:", x.Name);

正如您从日志中看到的那样,它报告该文件不存在,即使我刚刚创建它也是如此。

[12:40:09 INF] ViewRender: Infrastructure\Email\ConfirmUser\ConfirmUser.cshtml
[12:40:09 INF] Before FileOpen
[12:40:09 INF] File exists: False

嗯,唯一合乎逻辑的结论是我不知道/不明白发生了什么,这就是我寻求帮助的原因。

我还注意到,如果我停止容器(不是重新创建只是停止)然后启动它,我创建的所有目录和文件都会消失。

所以...这些目录/文件是在内存中而不是在“磁盘”上,我需要以某种方式提交更改吗?

这似乎是有道理的,因为应用程序代码正在寻找磁盘上的文件,如果它们在内存中,那么它们将找不到,但在谷歌搜索、Pluralsight 课程等中找不到。我找不到任何提及

我可以从哪里开始寻找以解决这个问题?

路径中的前斜杠“/”与“\”不同。只需改变斜线的方向即可。

我在我的 docker 容器中尝试了这个程序,它运行良好。

using System;
using System.IO;

// forward slash don't work
// string path = Path.Combine(Environment.CurrentDirectory, @"files\hello\hello.txt");

string path = Path.Combine(Environment.CurrentDirectory, @"files/hello/hello.txt");

Console.WriteLine($"Path: {path}");

string text = System.IO.File.ReadAllText(path);

Console.WriteLine(text);