2017-06-12 154 views
0

我無法理解如何在運行Docker的WebApi-app中處理數據。如何在Docker .NET Core Web應用程序中保存數據?

在我的應用程序,用戶可以上傳其存儲這樣的文件:

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

沒有配置任何卷,我的應用,圖像的泊塢窗容器似乎做工精細,沒有任何寫入文件問題。

現在我想要進行配置,以便文件最終可以顯式指定,而不是在默認泊塢窗卷文件夾內。

我想我需要創建一個卷映射?

我試着創建一個文件夾並將其映射到「/ App_Data」。它仍然像以前一樣工作,但我仍然沒有看到此文件夾中的任何文件。

這是對這個文件夾的寫入權限問題嗎?如果沒有訪問權限,Docker會回退並寫入默認卷?

什麼用戶/組應具有對此文件夾的寫入權限?是否有「碼頭工具」用戶?

我在Synology NAS上運行這個,所以我只使用標準的Docker UI和「添加文件夾」按鈕。

這裏是我曾嘗試的文件夾:

enter image description here

+0

您是如何繪製音量的?這取決於未來的反應。 – German

+0

因爲我使用的是Synology Docker UI,所以我並沒有深入瞭解實際的CLI,但我所做的只是單擊「添加文件夾」,從樹中選擇一個文件夾,然後輸入「/ App_Data」作爲容器內的映射路徑。 –

+0

好了讀一下這個技術,它是kitematic的替代品。我建議你儘快理解它是如何工作的。 – German

回答

0

得到它現在的工作!

問題是這一行:

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

在泊塢運行時轉換爲@"/app\App_Data"

首先,我使用Windows目錄分隔符'\',我不認爲這是在Linux上的工作。另外我不認爲路徑可以包含"/app",因爲它與此文件夾相關。當在Windows中運行該泊塢窗的外面我得到了它的工作更好紮根路徑:@"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對路徑匹配非常挑剔,只接受完全匹配,因爲這是我在container-config中映射到的路徑。

無論如何,這是一個真正的頭痛,現在已經用了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'或任何其他相對路徑,這些路徑將相對於ContentRootPath/CurrentDir進行解析。然而,像'/ data'這樣的絕對根路徑將無法工作,因爲它會解析爲'c:\ data'(相對於當前驅動器的根目錄)。

0

我建議你做卷的映射,在應用程序如下完成。檢查這不是讀取模式,因爲你不會看到這些文件。

卷:由於Transmission是下載程序,我們需要一種方法來訪問下載的文件。在沒有映射Synology NAS上的物理共享文件夾的情況下,所有下載的文件都將存儲在容器中,並且難以檢索。在Transmission的Dockerfile頁面中,我們在Transmission:/ config和/ downloads中看到了兩個卷。現在,我們將執行以下操作,將這兩個卷映射到Synology NAS上的物理共享文件夾: 取消選中只讀選項,因爲我們需要授予傳輸權限以將數據寫入物理驅動器。

enter image description here

+0

試過,文件夾中仍然沒有數據。 –

+0

它是有線的,因爲如果你映射正確的目錄信息將在那裏。要檢查它,你可以執行這個命令'docker ps' – German

相關問題