将卷叠加到Docker容器

问题描述

我有一组目录,希望将其覆盖挂载到容器中

# 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>

这使得所有文件都可以在容器的/usr/local中作为合并的挂载使用,并将更改写入主机上的/opt/c

使用docker能否轻松实现我想要的目标?

解决方法

不。如果您对主机工具足够熟悉,可以尝试执行此操作,请考虑在chroot环境中运行它。

Docker无法合并映像内容,卷内容和主机系统目录。挂载的工作方式与普通的Unix mount (8)命令相同:您要挂载的东西完全隐藏了之前的内容,您只能看到已挂载的内容。

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