【问题标题】:How to persist data in a Docker .NET Core Web app?如何在 Docker .NET Core Web 应用程序中保存数据?
【发布时间】:2017-06-12 20:46:43
【问题描述】:

我无法理解如何在使用 Docker 运行的 WebApi 应用中处理数据。

在我的应用中,用户可以上传这样存储的文件:

~\App_Data\accounts\user123\files\<sha256>.bin

在不配置任何卷的情况下,带有我的应用映像的 Docker 容器似乎可以正常工作并且可以毫无问题地写入文件。

现在我想进行配置,以便文件最终位于我可以明确指定的位置,而不是在默认的 docker 卷文件夹中。

我假设我需要创建卷映射?

我尝试创建一个文件夹并将其映射到“/App_Data”。它仍然像以前一样工作,但我仍然看不到此文件夹中的任何文件。

这个文件夹的写入权限有问题吗?如果没有访问权限,Docker 会回退并写入默认卷吗?

哪个用户/组应该对此文件夹具有写入权限?有“docker”用户吗?

我在 Synology NAS 上运行它,所以我只使用带有“添加文件夹”按钮的标准 Docker UI。

这是我尝试过的文件夹:

【问题讨论】:

  • 你是如何映射卷的?这取决于未来的反应。
  • 由于我使用的是 Synology Docker UI,因此我并没有深入了解实际的 CLI,但我所做的只是单击“添加文件夹”,从树中选择一个文件夹,然后然后输入“/App_Data”作为容器内的映射路径。
  • 好吧,了解一下这项技术,它是风筝的替代品。我建议你努力理解它的工作原理。

标签: docker asp.net-core synology docker-volume


【解决方案1】:

现在可以使用了!

问题出在这一行:

var appDataPath = env.ContentRootPath + @"\App_Data";

在 Docker 中运行时转换为 @"/app\App_Data"

首先,我使用的是 Windows 目录分隔符 '\',我认为它不适用于 Linux。另外我认为路径不能包含"/app",因为它是相对于这个文件夹的。在 Windows 中在 Docker 之外运行时,我得到了一个更好的根路径:@"c:\wwwroot\app\App_Data"

无论如何,通过更改为它开始按预期工作:

var appDataPath = @"/App_Data";

更新

有一个跟进问题。我希望该路径在 Linux 上的 Docker 和普通 Windows 托管中都可以工作,但我不能只使用 /App_Data 作为路径,因为这将在 Windows 上转换为 c:\App_Data。所以我尝试改用这条路径:./AppData 在 Windows 中运行良好,导致c:\wwwroot\app\App_Data。但不幸的是,这在 Docker 中仍然行不通。不明白为什么。 Maybee Docker 对路径匹配非常挑剔,只接受完全匹配,即/App_Data,因为这是我在容器配置中映射到的路径。

无论如何,这真是令人头疼,现在已经连续花了 6 个小时。这就是我想出的适用于 Linux 和 Windows 的方法。看起来不太好,但它有效:

Path.Combine(Directory.GetCurrentDirectory().StartsWith("/") ? "/" : ".", "App_Data");

如果你能想出更好看的方法,请随时告诉我。

更新 2

好的,我想我现在明白了。我认为。在 Docker 中运行它时,每个路径都必须以“/”为根。不允许使用相对路径。我的应用程序文件被复制到容器路径“/app”,并且我已将数据映射到“/data”。当前目录设置为“/app”,但要访问数据,我显然必须指向“/data”而不是“/app/data”。我错误地认为所有路径都是相对于“/app”而不是“/”的。其原因可能是因为在标准 Windows 主机中运行它时,我的数据文件位于应用程序文件夹中(无论如何这可能都不是一个好主意)。然而,这让我感到困惑,认为这同样适用于我的 Docker 环境。

现在我意识到这一点更加清晰。我必须使用 '/data' 而不是 './data' 或 '/app/data' 甚至是 'data'(也是相对的)等。

在相对路径正常的标准 Windows 主机中,我仍然可以使用“./data”或任何其他相对于 ContentRootPath/CurrentDir 解析的相对路径。但是,像“/data”这样的绝对根路径将不起作用,因为它将解析为“c:\data”(相对于当前驱动器的根目录)。

【讨论】:

    【解决方案2】:

    我建议你做一个卷的映射,在应用程序中做如下。检查这不是读取模式,因为您将看不到文件。

    Volume:由于 Transmission 是一个下载器,我们需要一种方法来访问下载的文件。如果没有在 Synology NAS 上映射物理共享文件夹,所有下载的文件都将存储在容器中并且难以检索。在 Transmission 的 Dockerfile 页面中,我们看到 Transmission 中有两个卷:/config 和 /downloads。我们现在将执行以下操作,将这两个卷映射到 Synology NAS 上的物理共享文件夹: 取消选中只读选项,因为我们需要授予传输权限才能将数据写入物理驱动器。

    【讨论】:

    • 试过了,文件夹里还是没有数据。
    • 它是有线的,因为如果您映射正确的目录,信息就会在那里。要检查它,您可以执行此命令docker ps
    猜你喜欢
    • 2020-03-17
    • 2023-04-07
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2020-12-12
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多