2014-10-01 77 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 - 而且只支持语义依赖(所以它会继续工作与未来的版本)。