Docker 如何以只读方式装载当前目录,但仍允许在容器内进行更改?

Docker 如何以只读方式装载当前目录,但仍允许在容器内进行更改?,docker,docker-for-mac,Docker,Docker For Mac,我的情况是: 我想将目录~/tmp/mycode挂载到/mycode readonly 我希望能够编辑目录中的文件,因此我不能只运行-v/my/local/path/tmp/mycode:/mycode 我希望它不会在主机文件系统上保留更改,因此无法以读/写方式装载它 ~/tmp/mycode相当大 基本上,我希望能够编辑装入的卷中的文件,但不保留这些更改 我当前的工作流程是使用dockerfile创建虚拟容器: ADD . /mycode 然后执行该容器 然而,随着存储库的增长,执行

我的情况是:

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

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

ADD . /mycode
然后执行该容器

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

我还考虑过挂载目录并将其复制到容器中并提交该容器,但这也有同样的问题

除了复制整个目录外,有没有一种方法可以运行docker容器来允许文件编辑,而无需在主机上进行持久化


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

这对于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
这应该以只读方式从目录装载代码,并在容器内创建覆盖,以便/mnt/rocode是只读的,而/mycode是可写的


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

由于该目录似乎是一个(git?)存储库,所以实际以读写方式挂载它不是更容易吗,允许主机文件系统更改,然后执行硬重置,并将您以前的状态恢复到容器停止时的状态?@ZathrusWriter,这可以工作,但错误的
rm-rf.git
会使该策略非常痛苦。。。