【发布时间】:2019-11-15 20:37:11
【问题描述】:
我正在尝试了解文件结构在 docker 容器中的工作原理,以及卷和挂载。
让我困惑的一件事是,当我 docker exec -it <container id> /bin/bash 进入容器时,我无法 cd 进入某些目录。
例如,如果我运行cd logs,我希望能够运行ls 来获取日志文件列表,但我在cd logs 命令之后得到No such file or directory。
不过,我可以运行 cd wwwroot 并四处导航。
在下面的终端图像中,您可以在我执行后看到ls 的结果。
例如,我可以运行cat logs\2019-07-04.log.json 将文件内容打印到屏幕上。但是我还是不行cd logs。
我也尝试了以下方法:
就像文件路径是一个“键”而不是一个正确的目录结构。
所以这似乎仅限于应用程序在运行时写入的directories,而在构建时加载的文件具有正确的文件结构。
这是否特定于 Linux 容器上的 .NET Core?为什么会这样?
【问题讨论】:
-
分隔符错误? Linux 使用
/文件夹分隔符。您上面列出的是文件名,而不是目录。文件名为logs\2019-07-05.log(阅读:log\...是文件名的一部分,而不是目录)和NOT2019-07-05.log。在路径中使用硬编码 `` 而不是 Path.DirectorySeparatorChar 和 Path.Combine 的常见错误 -
分隔符保持原样,因为这是一个 .NET Core 应用程序。看起来我在路径上有一些工作要做。我假设在 linux 上运行 .NET 核心时路径分隔符之间存在某种转换,但可能没有。 stackoverflow.com/questions/38168391/…
-
我对此表示怀疑。
Path.DirectorySeparatorChar将根据您使用的操作系统而有所不同。您在某处正在对其进行硬编码,这就是您看到它的原因。当您使用常规文件/目录 API 时,它会正确读取,就像您使用Path.Combine("logs", fileName)一样,因为Path.Combine将使用操作系统特定的目录分隔符 -
是的,我知道它在某些地方是卡编码的,并且日志记录特别来自 NLog 配置,我可以在生产环境中更改它。感谢您的 cmets,非常有帮助。
-
在NLog issue tracker 上提交问题?
标签: linux docker asp.net-core