是否可以安装docker镜像然后将其作为普通目录或已安装的设备进行访问(RO)?

时间:2014-10-26 16:29:47

标签: docker

我想拍一张Docker图片(让我们说ubuntu:latest)并制作如下内容:

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

有可能吗?

2 个答案:

答案 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命令来挂载它。