我想拍一张Docker图片(让我们说ubuntu:latest)并制作如下内容:
> docker-image-mount ubuntu:latest my_little_ubuntu
> cd my_little_ubuntu
> ls
/usr /var /bin etc.
有可能吗?
答案 0 :(得分:3)
我刚刚调查了docker如何存储图像的内部结构。
如果是aufs
存储驱动程序,则存在以下目录布局(我假设,该docker位于/var/lib/docker
)。
/var/lib/docker/aufs/diff
docker存储每个图像“layer”的数据。它只是一个包含文件的目录,docker挂载在容器根目录中。/var/lib/docker/aufs/layers
docker仅存储文本文件。每个文件都包含特定图像的图层ID列表。所以docker本身就是这样的:
DOCKER_AUFS_PATH="/var/lib/docker/aufs/"
DOCKER_AUFS_LAYERS="${DOCKER_AUFS_PATH}/layers/"
DOCKER_AUFS_DIFF="${DOCKER_AUFS_PATH}/diff/"
error() { echo "$@" 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
正如我在上面的评论中提到的,这在很大程度上取决于存储驱动程序(显然是在docker版本上),因此我无法保证您将使此代码正常工作。
答案 1 :(得分:0)
您可以使用Podman和Buildah来安装容器 image (RW)。
prompt:~ # podman pull ubuntu
prompt:~ # container=`buildah from ubuntu`
prompt:~ # echo $container
ubuntu-working-container
prompt:~ # mnt=`buildah mount $container`
prompt:~ # echo $mnt
/var/lib/containers/storage/overlay/2b1...09b/merged
prompt:~ # ls $mnt
bin boot dev etc home lib ... usr var
prompt:~ # buildah umount $container
如果您实际上想挂载正在运行或已停止的容器,则可以使用podman mount
命令来挂载它。