如何在Docker .NET Core Web应用程序中保存数据?

我无法理解如何在运行Docker的WebApi-app中处理数据。

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

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

没有configuration任何卷,与我的应用程序图像的Docker容器似乎工作正常,写入文件没有任何问题。

现在我想configuration,以便文件结束的地方,我可以明确指定,而不是在默认docker卷文件夹。

我假设我需要创build一个卷映射?

我试图创build一个文件夹,并将其映射到“/ App_Data”。 它仍然像以前一样工作,但我仍然没有看到这个文件夹中的任何文件。

这个文件夹的写权限是否存在问题? 如果没有访问权限,Docker将回退并写入默认卷?

什么用户/组应该有写入权限到这个文件夹? 有没有“docker”用户?

我在Synology NAS上运行这个程序,所以我只使用标准的Docker UI和“添加文件夹”button。

这是我试过的文件夹:

在这里输入图像说明

我build议你做一个映射的音量,在应用程序完成如下。 检查这是不是读取模式,因为你不会看到这些文件。

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

在这里输入图像说明

现在就工作吧!

问题是这一行:

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

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

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

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

 var appDataPath = @"/App_Data"; 

更新

有一个后续问题。 我希望这个path既可以在Linux上的Docker上运行,也可以在普通的Windows上运行,但是我不能只使用/App_Data作为path,因为这会转换为Windows上的c:\App_Data 。 所以我尝试使用这个path: ./AppData在Windows中正常工作,导致c:\wwwroot\app\App_Data 。 但不幸的是,这在Docker中仍然不起作用。 不要理解为什么。 Maybee Docker对于path匹配是非常挑剔的,只接受完全匹配,即/App_Data因为这是我在映射到container-config的path。

无论如何,这是一个真正的头痛,现在已经用了6个小时。 这就是我在Linux和Windows上工作的结果。 看起来不错,但它的作品:

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

如果你能想出一个更好看的方法,请随时让我知道。

更新2

好吧,我想我现在得到它。 我认为。 在Docker中运行时,每个path必须以“/”作为根。 相对path是不允许的。 我的应用程序文件被复制到容器path“/ app”,我已经将我的数据映射到“/ data”。 当前目录设置为'/ app',但访问数据我显然必须指向'/ data'而不是'/ app / data'。 我错误地认为所有的path都是相对于“/ app”而不是“/”的。 原因可能是因为我有我的数据文件内的应用程序文件夹中运行此标准的Windows主机(这可能不是一个非常好的主意,在任何情况下)。 然而这让我感到困惑,认为我的Docker环境也是如此。

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

在标准的Windows主机的相对path是好的,我仍然可以使用'./data'或任何其他相对path将相对于ContentRootPath / CurrentDir解决。 但是像/ data这样的绝对根path将无法工作,因为它将parsing为'c:\ data'(相对于当前驱动器的根目录)。