Overlayfs卷到docker容器

Overlayfs卷到docker容器,docker,overlayfs,systemd-nspawn,Docker,Overlayfs,Systemd Nspawn,我有一组目录,我想将其覆盖到容器中: # On host /opt/a - bin - lib /opt/b - bin - lib /opt/c - bin - lib # In container /usr/local - bin - lib - cuda 我能够在主机上为/opt/{a,b,c}创建一个overlayfs挂载,并将其作为卷挂载到容器中的/usr/local,但是/usr/local/cuda将无法在容器中访问 我可以通过systemd

我有一组目录,我想将其覆盖到容器中:

# On host
/opt/a
  - bin
  - lib
/opt/b
  - bin
  - lib
/opt/c
  - bin
  - lib

# In container
/usr/local
  - bin
  - lib
  - cuda
我能够在主机上为
/opt/{a,b,c}
创建一个overlayfs挂载,并将其作为卷挂载到容器中的
/usr/local
,但是
/usr/local/cuda
将无法在容器中访问

我可以通过
systemd nspawn
直接实现这一点,方法如下:

systemd-nspawn --overlay /opt/a:/opt/b:/opt/c:/usr/local <other flags>
systemd nspawn--overlay/opt/a:/opt/b:/opt/c:/usr/local
这使得所有文件都可以作为容器中的合并装载,并将更改写入主机上的
/opt/c


是否可以轻松地实现我想要的DOCKER?

< P>不。如果您熟悉主机工具来尝试这一点,请考虑在<代码> ChuloT 环境中运行它。 Docker无法合并图像内容、卷内容和主机系统目录。挂载的工作方式与普通Unixmount(8)命令相同:您正在挂载的东西完全隐藏了以前存在的内容,您只看到挂载的内容


运行严重依赖于主机系统内容的容器也很少见。典型的做法是一个映像包含运行软件所需的所有应用程序和库代码;这样,即使主机上没有该软件,也可以在其他系统上运行它。也就是说,更典型的做法是直接在Dockerfile中安装所需的软件,比如为基于Debian/Ubuntu的图像安装
apt get install
。如果各种
/opt
东西是您从源代码构建的东西,您可以使用从源代码安装它们,然后在最后阶段
将--from=opt-a-build
复制到
/usr/local
树中。

谢谢您的回复。我想要实现的是,在主机上的最新linux内核上使用unix mount命令,在主机上使用
mount-t overlay-o lowerdir=/opt/a:/opt/b:/opt/c、upperdir=/usr/local、workdir=/opt/workdir/usr/local
。我想这样做,但使用docker容器中的
/usr/local
。该容器正在干净的环境中从源代码为我构建软件
/opt/a
等表示我试图构建的软件(APT repos中不可用的软件包和版本)的依赖关系,我正在构建的软件包和版本能够很好地控制版本和配置。您应该将其安装在Dockerfile中,以便它包含在映像中;不要尝试从主机注入它。(如果您可以详细说明
mount
命令,那么您可能可以
docker volume创建一个具有这些精确选项的卷,但我不建议您这样设置。)