我想借泊塢窗圖像(讓我們說Ubuntu的:最新的),並類似:是否可以掛載docker鏡像,然後以普通目錄或掛載設備的形式訪問它(RO)?
> docker-image-mount ubuntu:latest my_little_ubuntu
> cd my_little_ubuntu
> ls
/usr /var /bin etc.
是否有可能以某種方式?
我想借泊塢窗圖像(讓我們說Ubuntu的:最新的),並類似:是否可以掛載docker鏡像,然後以普通目錄或掛載設備的形式訪問它(RO)?
> docker-image-mount ubuntu:latest my_little_ubuntu
> cd my_little_ubuntu
> ls
/usr /var /bin etc.
是否有可能以某種方式?
我剛剛調查了Docker如何存儲其圖像的內部結構。 在aufs
存儲驅動程序的情況下有以下目錄佈局(我假設,碼頭工人住在/var/lib/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
正如我在上面評論中提及,這在很大程度上依賴於存儲驅動程序(顯然在泊塢窗版本),所以我不能給你任何保證你會得到這個代碼工作。
如果有人想改善這個代碼或擴展它,歡迎在這裏https://github.com/kovyl2404/docker-image-mount/ – 2014-10-26 20:17:31
很好的答案,非常感謝!會試試看... – fbrusch 2014-10-26 21:46:14
這絕對是可能的,因爲碼頭工自己做。但是這非常依賴於特定的存儲驅動程序(aufs或btrfs)。我相信,答案在這裏https://github.com/docker/docker/blob/master/daemon/graphdriver/aufs/aufs.go。我對這個問題感興趣,現在要研究它並編寫像docker-image-mount這樣的簡單工具。 – 2014-10-26 17:32:03