对 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);
我收到文件未找到错误,即使我在 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);