2016-01-06 20 views
1

這應該不難,但我無法弄清楚。我有一個容器正在運行,並在docker run命令中使用-v /tester。然後我做docker exec ti containername /bin/bash。然後我用vi /tester/stayhere.txt創建一個名爲/tester/stayhere.txt的文件。然後我保存該文件並驗證它在那裏。然後,我執行docker commit並啓動新映像,並且缺少stayhere.txt。我究竟做錯了什麼?在Docker容器中存放數據文件

回答

1

在Docker容器中裝入容器時,它不被認爲是容器本身的一部分。這就是爲什麼當你提交更改時缺失。

據碼頭工人單證:

的數據量是繞過聯盟的文件系統的一個或多個容器內的特別指定的目錄中。

和:創建容器時

卷被初始化。如果容器的基礎映像包含指定安裝點上的數據,則在卷初始化時,現有數據將被複制到新卷中。

這意味着,數據量的活聯合文件系統之外,如果你甚至刪除該容器中的數據量依然存在:

數據卷的設計,以保持數據的,獨立的容器的中生命週期。因此,Docker在刪除容器時不會自動刪除卷,也不會「垃圾收集」不再由容器引用的卷。

因此,它們不是您的docker commit命令的一部分。

爲了達到你想要的效果,你需要在鏡像文件的同一路徑上拷貝文件,而沒有安裝作爲碼頭卷。您可以使用Dockerfile或直接啓動容器並更改文件系統然後提交。

下一次啓動容器時,容量爲,您應該能夠看到這些文件。

0

我不能說,沒有確切的命令,你正在運行。我會猜測你實際上並沒有真正開始「新」形象。我認爲那是因爲你用docker exec(它啓動了一個正在運行的容器中的東西)而不是docker run來「啓動」它。

更一般地說,雖然我會建議改變並提交是不好的做法。你真正應該做的是構建你的東西​​的任何東西,你應該在構建時做(與Dockerfile)。

任何持久狀態的東西都應該裝入容器中 - 通過卷裝或存儲容器。

這是很容易創建的其中之一:

docker create -v /path/to/data --name my_storage_container base-image-name /bin/true 

然後從一個乾淨的構建映像啓動你的容器:

docker run -it --volumes-from my_storage_container image /bin/bash 

文件節省您的話應該堅持,不管你有多與圖像混亂。

+0

謝謝Sobrique我不認爲我已經完全明白你在說什麼,但我簡化了問題,試圖獲得答案。基本上我的情況是這樣的,我有docker在AWS中運行,Docker在IBM雲中運行。我在AWS中運行的容器想要導出並在IBM雲中運行,但無論我做什麼,都無法讓文件保留。您如何建議將容器和文件移至IBM雲? –

+0

我已經試過碼頭保存,導出,提交但我認爲你告訴我的是,也許我應該使用碼頭CP來獲取容器中的文件,並將它們裝入新的容器中......這似乎很奇怪,因爲那麼我必須移動一個碼頭圖像和一組數據。這打破了我對容器的理解......爲什麼不把它放在容器中並移動呢? –

+0

如果您可以發佈與您的跑步完全相同的命令歷史記錄,我可能會擴展更多。 – Sobrique

相關問題