我的情况如下:
我有一个正在编译的 docker 映像/容器。我必须通过 Dockerfile 将一些组件安装到 $HOME(因此在创建映像时)。假设这些组件之一位于~/.config
,但也位于其他文件夹中。
我希望能够.config
通过将主机中的主文件夹安装在 docker 内部的文件夹之上来覆盖其中的文件。每当您将文件放入已安装的文件夹中时,它都会覆盖容器中已有的文件。
所以从理论上讲,这正是 OverlayFS 所做的,对吧?虽然下层目录是 Docker 容器内的目录,但上层目录是我的主机上的目录。
有办法实现吗?
到目前为止,我发现了以下相关主题:
https://serverfault.com/questions/841238/how-to-use-overlayfs-with-docker-volumes
缺点:答案只展示了如何在主机上使用overlayfs,但是访问较低的容器/图像目录并不是不言自明的,而且感觉很脏。
-
缺点:由于禁用了 Overlay-on/over-overlay 选项,在 docker 内使用 mount -t Overlay 不适用于较新的内核
我也想过直接操作主机上的docker文件,即docker存储文件的目录,但这感觉有点脏。
为此,我会VOLUME /home/user
在 Dockerfile 的末尾声明。然后我会在该目录中找到我的文件/var/lib/docker/volumes/user/_data
。然后我可以在我的主机上创建一个overlayfs,使用该目录作为下层,我的其他文件夹作为上层。然后我可以使用 重新挂载该新目录docker run --volume
。不幸的是,这将涉及访问该/var/lib
目录的 su 权限。此外,还会在错误的图层上进行更改。
另一种方法是绑定挂载单个文件,但这可能也有点黑客行为。