【问题标题】:Overlayfs volume to docker containerOverlayfs 卷到 docker 容器
【发布时间】:2020-10-05 14:41:57
【问题描述】:

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

# 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可以轻松实现我想要的吗?

【问题讨论】:

    标签: docker overlayfs systemd-nspawn


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。我想要实现的目标可以通过主机上带有mount -t overlay overlay -o lowerdir=/opt/a:/opt/b:/opt/c,upperdir=/usr/local,workdir=/opt/workdir /usr/local 的最新Linux 内核上的unix mount 命令来完成。我想这样做,但请改用 docker 容器中的 /usr/local。
    • 容器正在一个干净的环境中为我从源代码构建软件。 /opt/a 等代表我正在尝试构建的软件的依赖项(APT 存储库中不可用的包和版本,我正在构建自己以对版本和配置进行精细控制。
    • 你应该将它安装在你的 Dockerfile 中,以便它包含在镜像中;不要尝试从主机注入它。
    • (如果您可以详细说明mount 命令,那么您可能可以使用这些确切选项来docker volume create 一个卷,但这不是我建议的设置方式.)
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 2021-03-16
    • 2014-08-08
    • 2016-07-27
    • 2021-09-17
    • 2023-04-05
    • 1970-01-01
    • 2019-12-21
    相关资源
    最近更新 更多