2014-10-01 39 views
2

如何獲取碼頭集裝箱底層的aufs系統的根文件夾信息?碼頭,碼頭集裝箱的aufs根在哪裏

假設我運行了docker run mytag echo 'Done',之後,我相信碼頭將會在aufs系統之上建立一個廢棄的容器。我想利用這個aufs文件系統(比如chroot),而不用做docker savedocker export

我該怎麼做?我需要訪問該堆棧的aufs文件系統,以便從整個docker系統中創建一個squashfs文件系統,而不是從docker export開始的tar,因爲我總是在映像文件上執行mksquashfs,並且從未從內部完成mksquashfs系統該系統。

這是在Ubuntu下的lxc-docker版本1.2.0。

UPDATE:

嘗試過與查爾斯的建議,我發現從該系統內製作的squashfs系統是不可行的:

[email protected]:/# mount --bind//mnt/root || { echo error bind mount; exit; } # bind-mount container root only 
mount: block device/is write-protected, mounting read-only 
mount: cannot mount block device/read-only 
error bind mount 
exit 

所以,我正在烏斯曼的回答爲回答。

感謝

+1

這是一個實現細節 - 也就是說它沒有被承諾是穩定的,而且你所寫的任何依賴於它的東西都絕對不能保證在未來的版本中繼續工作。另外,在docker運行完成後,root會得到清理 - 所以這些圖層仍然是單獨存在的,但是沒有實例化的組合。 – 2014-10-01 04:11:59

+0

據我所知,我確實發現以前的所有博客/寫作都不再適用。但是,我確實需要訪問這個aufs文件系統,我需要創建一個'squashfs'文件系統而不是'tar'。所以當碼頭運行完成後,root會被清理乾淨,這是否意味着如果我在停止的容器上執行'docker export',輸出會出錯?無論如何,如果我運行'bash -i'來保持會話打開,我在哪裏可以找到docker 1.2.0的aufs文件系統? – xpt 2014-10-02 02:30:57

+0

'export'類似地,在堆棧運行時設置堆棧(並立即刪除堆棧)。如果當前版本仍然在主機文件系統名稱空間而不是容器名稱空間中進行掛載,那麼'bash -i'方法應該可以工作,但我不知道是否是這種情況 - 如果不是,那麼您要求的是什麼是不可能的/可用的。 – 2014-10-02 02:42:42

回答

2

我與評論,不過圖像可以/var/lib/docker/aufs/diff/<id>找到哪裏是容器的id,你可以找到使用

docker inspect <container-name> | grep Id 
+0

謝謝,但容器的id並不意味着太多,因爲它是整個圖層的重要組成部分。 – xpt 2014-10-02 02:24:12

1

考慮容器本身內運行mksquashfs同意,與裝載的目標目錄(以及綁定掛載上的根文件系統,所以你的squashfs映像不會嘗試緩存到/proc,/sys等)。

一種近乎下面,未經測試的代碼:

docker run --privileged=true -v /path/to/destination:/mnt/dest bash <<'EOF' 
    mkdir -p /mnt/root || exit 
    mount --bind//mnt/root || exit    # bind-mount container root only 
    mksquashfs /mnt/root /mnt/dest/squashfs.img # build an image of that root fs 
EOF 

一些調整,可能會被要求 - 我不能確定是否要在容器中存在/mnt/dest需要在此之前可以運行,例如,並且--privileged標誌可能是不必要的。

這有沒有關心其泊塢後端是利用後發優勢 - 它會使用LVM和btrfs的存儲後端的工作一樣好AUFS - 而且只支持語義依賴(所以它會繼續工作與未來的版本)。