2014-09-22 31 views
8

請考慮以下Dockerfile:寫泊塢窗從Dockerfile音量不起作用

FROM phusion/baseimage 
VOLUME ["/data"] 
RUN touch /data/HELLO 
RUN ls -ls /data 

問題:「/ data」目錄中不包含「HELLO」的文件。而且,任何其他嘗試寫入卷目錄(通過echo,mv,cp,...)都不成​​功 - 目錄始終爲空。沒有顯示錯誤消息。

我找不到有關此問題的任何文檔或有關計算器的信息。

這是一些衆所周知的或新的?

docker version回報:

Client version: 1.2.0 
Client API version: 1.14 
Go version (client): go1.3.1 
Git commit (client): fa7b24f 
OS/Arch (client): linux/amd64 
Server version: 1.2.0 
Server API version: 1.14 
Go version (server): go1.3.1 
Git commit (server): fa7b24f 

回答

8

的Dockerfile的每一步都在它自己的容器時,該步驟完成被廢棄,並在最後一個(在這種情況下,只有)容器使用量被丟棄運行它們在命令結束後被刪除。 這使得卷很不適合在Dockerfiles中使用,因爲它們在中途丟失了內容。 Docker文件旨在能夠在任何地方運行,並且如果它們使用持續存在的卷,則會使其變得更加困難。另一方面,如果你真的想要這樣做,只需在主機上備份一個目錄即可。

PS:初始化主機的數據目錄最好在Docker文件之外完成。

上次我需要這個我離開docker文件這一步,因爲這一步的想法是準備主機來運行此Dockerfile生成的圖像。然後我用Docker運行一個容器,在那個容器中運行通常的DB安裝程序。

docker run -v /var/lib/mysql:/raid/.../mysql ... 
/usr/bin/mysql_install_db 
mysql_secure_installation 

現在,當此容器被移動到一個新的主機,則該數據DIR可以與它帶來的,或者使用該主機上相同的過程創建。或者,如果像在我的例子中那樣,您希望另一個MySQL數據庫用於某些其他應用程序,則不必重複容器創建。

重要的想法是保持容器創建和主機設置分離。

+0

謝謝你對問題來源的很好的解釋。 如何使用目錄「在編譯時」備份卷?因此,例如,數據庫初始化在構建期間完成。 – akhikhl 2014-09-23 05:54:59

+0

我會在編輯中激活這個。 – 2014-09-23 18:17:32