給一個正在運作的Docker容器動态添加Volume
本文轉自:http://dockone.io/article/149
【編者的話】之前有人問我Docker容器啟動之後還能否再挂載卷,考慮到mnt命名空間的工作原理,我一開始認為這很難實作。不過現在Petazzoni通過使用nsenter和綁定挂載實作了這個需求,你可以在你的環境中測試下。
之前有人問我Docker容器啟動之後還能否再挂載卷,考慮mnt命名空間的工作原理,我一開始認為這很難實作。不過現在我認為是它實作的。
簡單來說,要想将磁盤卷挂載到正在運作的容器上,我們需要:
從我們想當作磁盤卷使用的特定檔案夾中建立綁定挂載(bind mount)到這個磁盤卷的位置;
umount第一步建立的臨時挂載點。
在下面的示例中,我故意包含了$符号來表示這是Shell指令行提示符,以幫助大家區分哪些是你需要輸入的,哪些是機器回複的。有一些多行指令,我也繼續用>。我知道這樣使得例子裡的指令無法輕易得被拷貝粘貼。如果你想要拷貝粘貼代碼,請檢視文章最後的示例腳本。
下面示例的前提是你已經使用如下指令啟動了一個簡單的名為charlie的容器:
我們需要做的是将宿主檔案夾<code>/home/jpetazzo/Work/DOCKER/docker</code>挂載到容器裡的<code>/src</code>目錄。好了,讓我們開始吧。
nsenter
找到檔案系統
我們想要在容器裡挂載包含宿主檔案夾(<code>/home/jpetazzo/Work/DOCKER/docker</code>)的檔案系統。那我們就需要找出哪個檔案系統包含這個目錄。
首先,我們需要canonicalize(或者解除引用)檔案,以防這是一個符号連結,或者它的路徑包含符号連結:
哈,這的确是一個符号連結!讓我們将其放入一個環境變量中:
接下來,我們需要找出哪個檔案系統包含這個路徑。我們使用一個有點讓人意想不到的工具來做,它就是<code>df</code>:
使用-P參數(強制使用POSIX格式,以防是exotic df,或者是其他人在Solaris或者BSD系統上裝Docker時運作的df),将結果也放到一個變量裡:
找到檔案系統的裝置(和sub-root)
現在,系統裡已經沒有綁定挂載(bind mounts)和BTRFS子卷了,我們僅僅需要檢視/proc/mounts,找到對應于<code>/home/jpetazzo</code>檔案系統的裝置就可以了。但是在我的系統裡,<code>/home/jpetazzo</code>是BTRFS池的子卷,要想得到子卷的資訊(或者bind mount資訊),需要檢視<code>/proc/self/moutinfo</code>。
首先,得到檔案系統裝置資訊:
接下來,得到sub-root資訊(比如,已挂載檔案系統的路徑):
很好。現在我們知道需要挂載<code>/dev/sda2</code>。在檔案系統内部,進入<code>/jpetazzo</code>,從這裡可以得到到所需檔案的剩餘路徑(示例中是<code>/go/src/github.com/docker/docker</code>)。
讓我們計算出剩餘路徑:
在進入容器之前最後需要做的是找到這個塊裝置的主和次裝置号。可以使用stat:
注意這兩個數字是十六進制的,我們之後需要的是二進制。可以這麼轉換:
還有最後一步。因為某些我無法解釋的原因,一些檔案系統(包括BTRFS)在挂載多次之後會更新/proc/mounts裡面的裝置字段。也就是說,如果我們在容器裡建立了名為/tmpblkdev的臨時塊裝置,并用其挂載我們自己的檔案系統,那麼檔案系統(在主控端器裡!)會顯示為<code>/tmpblkdev</code>,而不是<code>/dev/sda2</code>。這聽起來無所謂,但實際上這會讓之後試圖得到檔案系統塊裝置的操作都失敗。
長話短說,我們想要確定塊裝置節點在容器裡位于和主控端器上的同一個路徑下。
需要這麼做:
建立臨時挂載點挂載檔案系統:
確定卷挂載點存在,bind mount卷:
删除臨時挂載點:
(我們并不清除裝置節點。一開始就檢查裝置是否存在可能有點多餘,但是現在再檢查就已經很複雜了。)
大功告成!
下面這段可以直接拷貝粘貼了。
上述方法不适用于不基于塊裝置的檔案系統,隻有在<code>/proc/mounts</code>能正确得到塊裝置節點(上面談到,并不總是能正确得到)的時候才能起作用。另外,我隻測試了我自己的環境,沒有在雲執行個體之類的環境裡測試過,但是我很想知道在那裡是否适用。
===========================
譯者介紹
崔婧雯,現就職于VMware,進階軟體工程師,負責桌面虛拟化産品的品質保證工作。曾在IBM WebSphere業務流程管理軟體擔任多年系統測試工作。對虛拟化,中間件技術有濃厚的興趣。
本文轉自秋楓部落格園部落格,原文連結:http://www.cnblogs.com/rwxwsblog/p/5437478.html,如需轉載請自行聯系原作者