如何将当前目录挂载为只读但仍允许在容器内进行更改?

end*_*and 5 docker docker-for-mac

我有一种情况:

  • 我想将目录 ~/tmp/mycode 挂载到 /mycode 只读
  • 我希望能够编辑目录中的文件,所以我不能只运行-v /my/local/path/tmp/mycode:/mycode
    • 我希望它不会保留主机文件系统上的更改,因此我无法以读/写方式挂载它
  • ~/tmp/mycode 相当大

基本上我希望能够编辑已安装卷中的文件,但不保留这些更改。

我当前的工作流程是使用 dockerfile 创建一个虚拟容器:

ADD . /mycode
Run Code Online (Sandbox Code Playgroud)

然后执行该容器。

然而,随着存储库的增长,执行此步骤所需的时间越来越长,因为我能想到的唯一方法是制作 ~/tmp/mycode 的完整副本,以便能够操作容器中的文件。

我还考虑过安装目录并将其复制到容器内并提交该容器,但这有同样的问题。

有没有办法运行 docker 容器来允许文件编辑,而无需将它们保存在主机上而不复制整个目录?

我使用的是最新的 docker for mac,当前版本为 17.03.1-ce-mac5 (16048)。

Jir*_*uda 1

这对于 docker 和 Overlay 来说是相当简单的:

docker run --name myenv --privileged -v /my/local/path/tmp/mycode:/mnt/rocode:ro -it ubuntu /bin/bash
docker exec -d myenv /sbin/mount -t overlay overlay -o lowerdir=/mnt/rocode,upperdir=/mycode,workdir=/mnt/code-workdir /mycode
Run Code Online (Sandbox Code Playgroud)

这应该以只读方式挂载目录中的代码,并在容器内创建覆盖层,以便 /mnt/rocode 是只读的,但 /mycode 是可写的。

确保您的内核是 3.18+ 并且您的 /proc/filesystems 中有覆盖。