0

我有一组目录,我想覆盖挂载到容器中:

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

# In container
/usr/local
  - bin
  - lib
  - cuda

我可以在主机上创建一个 overlayfs 挂载,/opt/{a,b,c}并将其作为卷挂载到/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 轻松实现我想要的?

4

1 回答 1

0

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

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

运行严重依赖主机系统内容的容器也是不寻常的。典型的做法是让映像包含运行软件所需的所有应用程序和库代码;这样,即使主机上不存在该软件,您也可以在不同的系统上运行它。也就是说,更典型的做法是直接在 Dockerfile 中安装您需要的软件,例如apt-get install基于 Debian/Ubuntu 的映像。如果各种/opt东西是您从源代码构建的东西,您可以使用多阶段构建从源代码安装它们,然后在最后阶段安装COPY --from=opt-a-build/usr/local树中。

于 2020-10-05T17:26:51.407 回答