2014-10-26 39 views
1

我想借泊塢窗圖像(讓我們說Ubuntu的:最新的),並類似:是否可以掛載docker鏡像,然後以普通目錄或掛載設備的形式訪問它(RO)?

> docker-image-mount ubuntu:latest my_little_ubuntu 
> cd my_little_ubuntu 
> ls 
/usr /var /bin etc. 

是否有可能以某種方式?

+0

這絕對是可能的,因爲碼頭工自己做。但是這非常依賴於特定的存儲驅動程序(aufs或btrfs)。我相信,答案在這裏https://github.com/docker/docker/blob/master/daemon/graphdriver/aufs/aufs.go。我對這個問題感興趣,現在要研究它並編寫像docker-image-mount這樣的簡單工具。 – 2014-10-26 17:32:03

回答

3

我剛剛調查了Docker如何存儲其圖像的內部結構。 在aufs存儲驅動程序的情況下有以下目錄佈局(我假設,碼頭工人住在/var/lib/docker)。

  • 在這個目錄中docker存儲每個圖片「圖層」的數據。這只是一個包含文件的目錄,其中docker裝載在容器根目錄中。
  • /var/lib/docker/aufs/layers在這個目錄中,docker只存儲文本文件。每個文件都包含特定圖像的圖層ID列表。

所以泊塢窗本身並沒有類似的東西:

DOCKER_AUFS_PATH="/var/lib/docker/aufs/" 
DOCKER_AUFS_LAYERS="${DOCKER_AUFS_PATH}/layers/" 
DOCKER_AUFS_DIFF="${DOCKER_AUFS_PATH}/diff/" 

error() { echo "[email protected]" 1>&2; } 

if [ -z "${IMAGE}" ]; 
then 
    error "Image is not specified" 
    exit 1 
fi; 

if [ -z "${TARGET}" ]; 
then 
    error "Target is not specified" 
    exit 1 
fi; 

BRANCH="br" 
while read LAYER; do 
    BRANCH+=":${DOCKER_AUFS_DIFF}/${LAYER}=ro+wh" 
done < "${DOCKER_AUFS_LAYERS}/${IMAGE}" 

mount -t aufs -o "${BRANCH}" "${IMAGE}" "${TARGET}" 

,其中$ {} IMAGE是泊塢窗容器的ID,和$ {TARGET}在主機的文件系統,其中裝載的圖像存在目錄。

卸載它只要致電:

umount cf39b476aeec4d2bd097945a14a147dc52e16bd88511ed931357a5cd6f6590de

正如我在上面評論中提及,這在很大程度上依賴於存儲驅動程序(顯然在泊塢窗版本),所以我不能給你任何保證你會得到這個代碼工作。

+0

如果有人想改善這個代碼或擴展它,歡迎在這裏https://github.com/kovyl2404/docker-image-mount/ – 2014-10-26 20:17:31

+0

很好的答案,非常感謝!會試試看... – fbrusch 2014-10-26 21:46:14

相關問題